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
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
const testCases = [
// Label identifier.
id => `${id}: ;`,
// Binding identifier.
id => `var ${id};`,
id => `let ${id};`,
id => `const ${id} = 0;`,
// Binding identifier in binding pattern.
id => `var [${id}] = [];`,
id => `var [${id} = 0] = [];`,
id => `var [...${id}] = [];`,
id => `var {a: ${id}} = {};`,
id => `var {${id}} = {};`,
id => `var {${id} = 0} = {};`,
id => `let [${id}] = [];`,
id => `let [${id} = 0] = [];`,
id => `let [...${id}] = [];`,
id => `let {a: ${id}} = {};`,
id => `let {${id}} = {};`,
id => `let {${id} = 0} = {};`,
id => `const [${id}] = [];`,
id => `const [${id} = 0] = [];`,
id => `const [...${id}] = [];`,
id => `const {a: ${id}} = {};`,
id => `const {${id}} = {};`,
id => `const {${id} = 0} = {};`,
// Identifier reference.
id => `void ${id};`,
];
const strictReservedWords = [
"implements",
"interface",
"package",
"private",
"protected",
"public",
];
function escapeWord(s) {
return "\\u00" + s.charCodeAt(0).toString(16) + s.substring(1);
}
for (let strictReservedWordOrYield of [...strictReservedWords, "yield"]) {
let escapedStrictReservedWordOrYield = escapeWord(strictReservedWordOrYield);
for (let testCase of testCases) {
eval(testCase(strictReservedWordOrYield));
eval(testCase(escapedStrictReservedWordOrYield));
assertThrowsInstanceOf(() => eval(String.raw`
"use strict";
${testCase(strictReservedWordOrYield)}
`), SyntaxError);
assertThrowsInstanceOf(() => eval(String.raw`
"use strict";
${testCase(escapedStrictReservedWordOrYield)}
`), SyntaxError);
}
}
// |yield| is always a keyword in generator functions.
for (let testCase of testCases) {
let yield = "yield";
let escapedYield = escapeWord("yield");
assertThrowsInstanceOf(() => eval(String.raw`
function* g() {
${testCase(yield)}
}
`), SyntaxError);
assertThrowsInstanceOf(() => eval(String.raw`
function* g() {
${testCase(escapedYield)}
}
`), SyntaxError);
assertThrowsInstanceOf(() => eval(String.raw`
"use strict";
function* g() {
${testCase(yield)}
}
`), SyntaxError);
assertThrowsInstanceOf(() => eval(String.raw`
"use strict";
function* g() {
${testCase(escapedYield)}
}
`), SyntaxError);
}
if (typeof reportCompare === "function")
reportCompare(0, 0, "ok");