object-rest.js (1941B)
1 // |reftest| skip-if(!xulRuntime.shell) 2 3 function property(key, value = key, shorthand = key === value) { 4 return { key, value, shorthand }; 5 } 6 7 function assertDestrAssign(src, pattern) { 8 assertExpr(`(${src} = 0)`, aExpr("=", pattern, lit(0))); 9 } 10 11 function assertDestrBinding(src, pattern) { 12 assertDecl(`var ${src} = 0`, varDecl([{id: pattern, init: lit(0)}])); 13 } 14 15 function test() { 16 // Target expression must be a simple assignment target in object assignment patterns. 17 assertDestrAssign("{...x}", objPatt([spread(ident("x"))])); 18 assertDestrAssign("{...(x)}", objPatt([spread(ident("x"))])); 19 assertDestrAssign("{...obj.p}", objPatt([spread(dotExpr(ident("obj"), ident("p")))])); 20 assertDestrAssign("{...(obj.p)}", objPatt([spread(dotExpr(ident("obj"), ident("p")))])); 21 22 // Object binding patterns only allow binding identifiers. 23 assertDestrBinding("{...x}", objPatt([spread(ident("x"))])); 24 25 // The rest-property can be preceded by other properties. 26 for (var assertDestr of [assertDestrAssign, assertDestrBinding]) { 27 assertDestr("{a, ...x}", objPatt([property(ident("a")), spread(ident("x"))])); 28 assertDestr("{a: b, ...x}", objPatt([property(ident("a"), ident("b")), spread(ident("x"))])); 29 assertDestr("{[a]: b, ...x}", objPatt([property(comp(ident("a")), ident("b")), spread(ident("x"))])); 30 } 31 32 // Tests when __proto__ is used in the object pattern. 33 for (var assertDestr of [assertDestrAssign, assertDestrBinding]) { 34 assertDestr("{...__proto__}", objPatt([spread(ident("__proto__"))])); 35 assertDestr("{__proto__, ...x}", objPatt([property(ident("__proto__")), spread(ident("x"))])); 36 } 37 assertDestrAssign("{__proto__: a, ...x}", objPatt([property(lit("__proto__"), ident("a")), spread(ident("x"))])); 38 assertDestrBinding("{__proto__: a, ...x}", objPatt([property(ident("__proto__"), ident("a")), spread(ident("x"))])); 39 } 40 41 runtest(test);