Source code
Revision control
Copy as Markdown
Other Tools
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
const validSyntax = [
"var x",
];
const destructuring = [
"[]",
"[,]",
"[a]",
"[a = 0]",
"[...a]",
"[...[]]",
"[...[a]]",
"{}",
"{p: x}",
"{p: x = 0}",
"{x}",
"{x = 0}",
];
const invalidSyntax = [
...destructuring.map(binding => `var ${binding}`),
"let x",
...destructuring.map(binding => `let ${binding}`),
"const x",
...destructuring.map(binding => `const ${binding}`),
"x",
...destructuring.map(binding => `${binding}`),
"o.p",
"o[0]",
"f()",
];
for (let valid of validSyntax) {
Function(`for (${valid} = 0 in {});`);
assertThrowsInstanceOf(() => Function(`"use strict"; for (${valid} = 0 in {});`),
SyntaxError);
}
for (let invalid of invalidSyntax) {
assertThrowsInstanceOf(() => Function(`for (${invalid} = 0 in {});`), SyntaxError);
}
// Invalid syntax, needs method context to parse.
assertThrowsInstanceOf(() => Function(`({ m() { for (super.p = 0 in {}); } })`), SyntaxError);
assertThrowsInstanceOf(() => Function(`({ m() { for (super[0] = 0 in {}); } })`), SyntaxError);
assertThrowsInstanceOf(() => Function(`for (0 = 0 in {});`), SyntaxError);
assertThrowsInstanceOf(() => Function(`for (i++ = 0 in {});`), SyntaxError);
assertThrowsInstanceOf(() => Function(`for (new F() = 0 in {});`), SyntaxError);
assertThrowsInstanceOf(() => Function(`function f() { for (new.target = 0 in {}); }`), SyntaxError);
assertThrowsInstanceOf(() => Function(`class C extends D { constructor() { for (super() = 0 in {}); } }`), SyntaxError);
// Same as above, only this time don't make it look like we actually parse a for-in statement.
assertThrowsInstanceOf(() => Function(`for (0 = 0 #####`), SyntaxError);
assertThrowsInstanceOf(() => Function(`for (i++ = 0 #####`), SyntaxError);
assertThrowsInstanceOf(() => Function(`for (new F() = 0 #####`), SyntaxError);
assertThrowsInstanceOf(() => Function(`function f() { for (new.target = 0 #####`), SyntaxError);
assertThrowsInstanceOf(() => Function(`class C extends D { constructor() { for (super() = 0 #####`), SyntaxError);
if (typeof reportCompare === "function")
reportCompare(true, true);