Source code

Revision control

Copy as Markdown

Other Tools

// |reftest| skip-if(!xulRuntime.shell)
function property(key, value = key, shorthand = key === value) {
return { key, value, shorthand };
}
function test() {
// Any expression can be spreaded.
assertExpr("({...x})", objExpr([spread(ident("x"))]));
assertExpr("({...f()})", objExpr([spread(callExpr(ident("f"), []))]));
assertExpr("({...123})", objExpr([spread(lit(123))]));
// Multiple spread expression are allowed.
assertExpr("({...x, ...obj.p})", objExpr([spread(ident("x")), spread(dotExpr(ident("obj"), ident("p")))]));
// Spread expression can appear anywhere in an object literal.
assertExpr("({p, ...x})", objExpr([property(ident("p")), spread(ident("x"))]));
assertExpr("({p: a, ...x})", objExpr([property(ident("p"), ident("a")), spread(ident("x"))]));
assertExpr("({...x, p: a})", objExpr([spread(ident("x")), property(ident("p"), ident("a"))]));
// Trailing comma after spread expression is allowed.
assertExpr("({...x,})", objExpr([spread(ident("x"))]));
// __proto__ is not special in spread expressions.
assertExpr("({...__proto__})", objExpr([spread(ident("__proto__"))]));
assertExpr("({...__proto__, ...__proto__})", objExpr([spread(ident("__proto__")), spread(ident("__proto__"))]));
}
runtest(test);