expression.js (11911B)
1 // |reftest| skip-if(!xulRuntime.shell) 2 function test() { 3 4 // primary expressions 5 assertExpr("true", lit(true)); 6 assertExpr("false", lit(false)); 7 assertExpr("42", lit(42)); 8 assertExpr("(/asdf/)", lit(/asdf/)); 9 assertExpr("this", thisExpr); 10 assertExpr("foo", ident("foo")); 11 if ("BigInt" in this) { 12 assertExpr("1234n", lit(BigInt(1234))); 13 } 14 15 // member expressions 16 assertExpr("foo.bar", dotExpr(ident("foo"), ident("bar"))); 17 assertExpr("foo[bar]", memExpr(ident("foo"), ident("bar"))); 18 assertExpr("foo['bar']", memExpr(ident("foo"), lit("bar"))); 19 assertExpr("foo[42]", memExpr(ident("foo"), lit(42))); 20 21 // optional member expressions 22 assertExpr("foo?.bar", optExpr(optDotExpr(ident("foo"), ident("bar")))); 23 assertExpr("foo?.bar.baz", optExpr(dotExpr(optDotExpr(ident("foo"), ident("bar")), ident("baz")))); 24 assertExpr("foo.bar?.baz", optExpr(optDotExpr(dotExpr(ident("foo"), ident("bar")), ident("baz")))); 25 assertExpr("foo?.bar?.baz", optExpr(optDotExpr(optDotExpr(ident("foo"), ident("bar")), ident("baz")))); 26 assertExpr("foo?.[bar].baz", optExpr(dotExpr(optMemExpr(ident("foo"), ident("bar")), ident("baz")))); 27 assertExpr("foo.bar?.[baz]", optExpr(optMemExpr(dotExpr(ident("foo"), ident("bar")), ident("baz")))); 28 assertExpr("foo[bar]?.[baz]", optExpr(optMemExpr(memExpr(ident("foo"), ident("bar")), ident("baz")))); 29 assertExpr("foo?.[bar][baz]", optExpr(memExpr(optMemExpr(ident("foo"), ident("bar")), ident("baz")))); 30 assertExpr("foo?.['bar']?.['baz']", optExpr(optMemExpr(optMemExpr(ident("foo"), lit("bar")), lit("baz")))); 31 assertExpr("foo?.[bar]?.baz", optExpr(optDotExpr(optMemExpr(ident("foo"), ident("bar")), ident("baz")))); 32 33 // delete optional expressions 34 assertExpr("\ndelete [] ?. [1]", delOptExpr(optMemExpr(arrExpr([]), lit(1)))); 35 assertExpr("delete foo?.bar", delOptExpr(optDotExpr(ident("foo"), ident("bar")))); 36 assertExpr("delete foo?.bar.baz", delOptExpr(dotExpr(optDotExpr(ident("foo"), ident("bar")), ident("baz")))); 37 assertExpr("delete foo.bar?.baz", delOptExpr(optDotExpr(dotExpr(ident("foo"), ident("bar")), ident("baz")))); 38 assertExpr("delete foo?.bar?.baz", delOptExpr(optDotExpr(optDotExpr(ident("foo"), ident("bar")), ident("baz")))); 39 assertExpr("delete foo?.[bar].baz", delOptExpr(dotExpr(optMemExpr(ident("foo"), ident("bar")), ident("baz")))); 40 assertExpr("delete foo.bar?.[baz]", delOptExpr(optMemExpr(dotExpr(ident("foo"), ident("bar")), ident("baz")))); 41 assertExpr("delete foo[bar]?.[baz]", delOptExpr(optMemExpr(memExpr(ident("foo"), ident("bar")), ident("baz")))); 42 assertExpr("delete foo?.[bar][baz]", delOptExpr(memExpr(optMemExpr(ident("foo"), ident("bar")), ident("baz")))); 43 assertExpr("delete foo?.['bar']?.['baz']", delOptExpr(optMemExpr(optMemExpr(ident("foo"), lit("bar")), lit("baz")))); 44 assertExpr("delete foo?.[bar]?.baz", delOptExpr(optDotExpr(optMemExpr(ident("foo"), ident("bar")), ident("baz")))); 45 46 // function expressions 47 assertExpr("(function(){})", funExpr(null, [], blockStmt([]))); 48 assertExpr("(function f() {})", funExpr(ident("f"), [], blockStmt([]))); 49 assertExpr("(function f(x,y,z) {})", funExpr(ident("f"), [ident("x"),ident("y"),ident("z")], blockStmt([]))); 50 assertExpr("a => a", arrowExpr([ident("a")], ident("a"))); 51 assertExpr("(a) => a", arrowExpr([ident("a")], ident("a"))); 52 assertExpr("a => b => a", arrowExpr([ident("a")], arrowExpr([ident("b")], ident("a")))); 53 assertExpr("a => {}", arrowExpr([ident("a")], blockStmt([]))); 54 assertExpr("a => ({})", arrowExpr([ident("a")], objExpr([]))); 55 assertExpr("(a, b, c) => {}", arrowExpr([ident("a"), ident("b"), ident("c")], blockStmt([]))); 56 assertExpr("([a, b]) => {}", arrowExpr([arrPatt([assignElem("a"), assignElem("b")])], blockStmt([]))); 57 58 // Unary expressions 59 assertExpr("(++x)", updExpr("++", ident("x"), true)); 60 assertExpr("(x++)", updExpr("++", ident("x"), false)); 61 assertExpr("(+x)", unExpr("+", ident("x"))); 62 assertExpr("(-x)", unExpr("-", ident("x"))); 63 assertExpr("(!x)", unExpr("!", ident("x"))); 64 assertExpr("(~x)", unExpr("~", ident("x"))); 65 assertExpr("(delete x)", unExpr("delete", ident("x"))); 66 assertExpr("(typeof x)", unExpr("typeof", ident("x"))); 67 assertExpr("(void x)", unExpr("void", ident("x"))); 68 69 // Bug 632026: constant-folding 70 assertExpr("typeof(0?0:a)", unExpr("typeof", condExpr(lit(0), lit(0), ident("a")))); 71 72 // Binary exporessions 73 assertExpr("(x == y)", binExpr("==", ident("x"), ident("y"))); 74 assertExpr("(x != y)", binExpr("!=", ident("x"), ident("y"))); 75 assertExpr("(x === y)", binExpr("===", ident("x"), ident("y"))); 76 assertExpr("(x !== y)", binExpr("!==", ident("x"), ident("y"))); 77 assertExpr("(x < y)", binExpr("<", ident("x"), ident("y"))); 78 assertExpr("(x <= y)", binExpr("<=", ident("x"), ident("y"))); 79 assertExpr("(x > y)", binExpr(">", ident("x"), ident("y"))); 80 assertExpr("(x >= y)", binExpr(">=", ident("x"), ident("y"))); 81 assertExpr("(x << y)", binExpr("<<", ident("x"), ident("y"))); 82 assertExpr("(x >> y)", binExpr(">>", ident("x"), ident("y"))); 83 assertExpr("(x >>> y)", binExpr(">>>", ident("x"), ident("y"))); 84 assertExpr("(x + y)", binExpr("+", ident("x"), ident("y"))); 85 assertExpr("(w + x + y + z)", binExpr("+", binExpr("+", binExpr("+", ident("w"), ident("x")), ident("y")), ident("z"))); 86 assertExpr("(x - y)", binExpr("-", ident("x"), ident("y"))); 87 assertExpr("(w - x - y - z)", binExpr("-", binExpr("-", binExpr("-", ident("w"), ident("x")), ident("y")), ident("z"))); 88 assertExpr("(x * y)", binExpr("*", ident("x"), ident("y"))); 89 assertExpr("(x / y)", binExpr("/", ident("x"), ident("y"))); 90 assertExpr("(x % y)", binExpr("%", ident("x"), ident("y"))); 91 assertExpr("(x | y)", binExpr("|", ident("x"), ident("y"))); 92 assertExpr("(x ^ y)", binExpr("^", ident("x"), ident("y"))); 93 assertExpr("(x & y)", binExpr("&", ident("x"), ident("y"))); 94 assertExpr("(x in y)", binExpr("in", ident("x"), ident("y"))); 95 assertExpr("(x instanceof y)", binExpr("instanceof", ident("x"), ident("y"))); 96 97 // Bug 571617: eliminate constant-folding 98 assertExpr("2 + 3", binExpr("+", lit(2), lit(3))); 99 100 // Assignment expressions 101 assertExpr("(x = y)", aExpr("=", ident("x"), ident("y"))); 102 assertExpr("(x += y)", aExpr("+=", ident("x"), ident("y"))); 103 assertExpr("(x -= y)", aExpr("-=", ident("x"), ident("y"))); 104 assertExpr("(x *= y)", aExpr("*=", ident("x"), ident("y"))); 105 assertExpr("(x /= y)", aExpr("/=", ident("x"), ident("y"))); 106 assertExpr("(x %= y)", aExpr("%=", ident("x"), ident("y"))); 107 assertExpr("(x <<= y)", aExpr("<<=", ident("x"), ident("y"))); 108 assertExpr("(x >>= y)", aExpr(">>=", ident("x"), ident("y"))); 109 assertExpr("(x >>>= y)", aExpr(">>>=", ident("x"), ident("y"))); 110 assertExpr("(x |= y)", aExpr("|=", ident("x"), ident("y"))); 111 assertExpr("(x ^= y)", aExpr("^=", ident("x"), ident("y"))); 112 assertExpr("(x &= y)", aExpr("&=", ident("x"), ident("y"))); 113 114 // Conditional expressions 115 assertExpr("(x || y)", logExpr("||", ident("x"), ident("y"))); 116 assertExpr("(x && y)", logExpr("&&", ident("x"), ident("y"))); 117 assertExpr("(x ?? y)", logExpr("??", ident("x"), ident("y"))); 118 assertExpr("(w || x || y || z)", logExpr("||", logExpr("||", logExpr("||", ident("w"), ident("x")), ident("y")), ident("z"))) 119 assertExpr("(x ? y : z)", condExpr(ident("x"), ident("y"), ident("z"))); 120 121 // Sequence expressions 122 assertExpr("(x,y)", seqExpr([ident("x"),ident("y")])) 123 assertExpr("(x,y,z)", seqExpr([ident("x"),ident("y"),ident("z")])) 124 assertExpr("(a,b,c,d,e,f,g)", seqExpr([ident("a"),ident("b"),ident("c"),ident("d"),ident("e"),ident("f"),ident("g")])); 125 126 // Call expressions 127 assertExpr("(new Object)", newExpr(ident("Object"), [])); 128 assertExpr("(new Object())", newExpr(ident("Object"), [])); 129 assertExpr("(new Object(42))", newExpr(ident("Object"), [lit(42)])); 130 assertExpr("(new Object(1,2,3))", newExpr(ident("Object"), [lit(1),lit(2),lit(3)])); 131 assertExpr("(String())", callExpr(ident("String"), [])); 132 assertExpr("(String(42))", callExpr(ident("String"), [lit(42)])); 133 assertExpr("(String(1,2,3))", callExpr(ident("String"), [lit(1),lit(2),lit(3)])); 134 135 // Optional Call expressions 136 assertExpr("(String?.())", optExpr(optCallExpr(ident("String"), []))); 137 assertExpr("(String?.(42))", optExpr(optCallExpr(ident("String"), [lit(42)]))); 138 assertExpr("(String?.(1,2,3))", optExpr(optCallExpr(ident("String"), [lit(1),lit(2),lit(3)]))); 139 assertExpr("(String?.foo?.())", optExpr(optCallExpr(optDotExpr(ident("String"), ident("foo")), []))); 140 assertExpr("(String.foo?.())", optExpr(optCallExpr(dotExpr(ident("String"), ident("foo")), []))); 141 assertExpr("(String?.foo)()", callExpr(optExpr(optDotExpr(ident("String"), ident("foo"))), [])); 142 assertExpr("(String?.foo)?.()", optExpr(optCallExpr(optExpr(optDotExpr(ident("String"), ident("foo"))), []))); 143 144 // Array expressions 145 assertExpr("[]", arrExpr([])); 146 assertExpr("[1]", arrExpr([lit(1)])); 147 assertExpr("[1,2]", arrExpr([lit(1),lit(2)])); 148 assertExpr("[1,2,3]", arrExpr([lit(1),lit(2),lit(3)])); 149 assertExpr("[1,,2,3]", arrExpr([lit(1),null,lit(2),lit(3)])); 150 assertExpr("[1,,,2,3]", arrExpr([lit(1),null,null,lit(2),lit(3)])); 151 assertExpr("[1,,,2,,3]", arrExpr([lit(1),null,null,lit(2),null,lit(3)])); 152 assertExpr("[1,,,2,,,3]", arrExpr([lit(1),null,null,lit(2),null,null,lit(3)])); 153 assertExpr("[,1,2,3]", arrExpr([null,lit(1),lit(2),lit(3)])); 154 assertExpr("[,,1,2,3]", arrExpr([null,null,lit(1),lit(2),lit(3)])); 155 assertExpr("[,,,1,2,3]", arrExpr([null,null,null,lit(1),lit(2),lit(3)])); 156 assertExpr("[,,,1,2,3,]", arrExpr([null,null,null,lit(1),lit(2),lit(3)])); 157 assertExpr("[,,,1,2,3,,]", arrExpr([null,null,null,lit(1),lit(2),lit(3),null])); 158 assertExpr("[,,,1,2,3,,,]", arrExpr([null,null,null,lit(1),lit(2),lit(3),null,null])); 159 assertExpr("[,,,,,]", arrExpr([null,null,null,null,null])); 160 assertExpr("[1, ...a, 2]", arrExpr([lit(1), spread(ident("a")), lit(2)])); 161 assertExpr("[,, ...a,, ...b, 42]", arrExpr([null,null, spread(ident("a")),, spread(ident("b")), lit(42)])); 162 assertExpr("[1,(2,3)]", arrExpr([lit(1),seqExpr([lit(2),lit(3)])])); 163 assertExpr("[,(2,3)]", arrExpr([null,seqExpr([lit(2),lit(3)])])); 164 165 // Object expressions 166 assertExpr("({})", objExpr([])); 167 assertExpr("({x:1})", objExpr([{ key: ident("x"), value: lit(1) }])); 168 assertExpr("({x:x, y})", objExpr([{ key: ident("x"), value: ident("x"), shorthand: false }, 169 { key: ident("y"), value: ident("y"), shorthand: true }])); 170 assertExpr("({x:1, y:2})", objExpr([{ key: ident("x"), value: lit(1) }, 171 { key: ident("y"), value: lit(2) } ])); 172 assertExpr("({x:1, y:2, z:3})", objExpr([{ key: ident("x"), value: lit(1) }, 173 { key: ident("y"), value: lit(2) }, 174 { key: ident("z"), value: lit(3) } ])); 175 assertExpr("({x:1, 'y':2, z:3})", objExpr([{ key: ident("x"), value: lit(1) }, 176 { key: lit("y"), value: lit(2) }, 177 { key: ident("z"), value: lit(3) } ])); 178 assertExpr("({'x':1, 'y':2, z:3})", objExpr([{ key: lit("x"), value: lit(1) }, 179 { key: lit("y"), value: lit(2) }, 180 { key: ident("z"), value: lit(3) } ])); 181 assertExpr("({'x':1, 'y':2, 3:3})", objExpr([{ key: lit("x"), value: lit(1) }, 182 { key: lit("y"), value: lit(2) }, 183 { key: lit(3), value: lit(3) } ])); 184 assertExpr("({__proto__:x})", objExpr([{ type: "PrototypeMutation", value: ident("x") }])); 185 assertExpr("({'__proto__':x})", objExpr([{ type: "PrototypeMutation", value: ident("x") }])); 186 assertExpr("({['__proto__']:x})", objExpr([{ type: "Property", key: comp(lit("__proto__")), value: ident("x") }])); 187 assertExpr("({['__proto__']:q, __proto__() {}, __proto__: null })", 188 objExpr([{ type: "Property", key: comp(lit("__proto__")), value: ident("q") }, 189 { type: "Property", key: ident("__proto__"), method: true }, 190 { type: "PrototypeMutation", value: lit(null) }])); 191 } 192 193 runtest(test);