Make yield a contextual keyword (#9400)

This commit is contained in:
Daniel Tschinder 2019-01-23 14:33:23 -08:00 committed by GitHub
parent 42c5d3fc4b
commit 46ba5940c2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
38 changed files with 768 additions and 126 deletions

View File

@ -126,12 +126,18 @@ export default class ExpressionParser extends LValParser {
): N.Expression { ): N.Expression {
const startPos = this.state.start; const startPos = this.state.start;
const startLoc = this.state.startLoc; const startLoc = this.state.startLoc;
if (this.match(tt._yield) && this.state.inGenerator) { if (this.isContextual("yield")) {
let left = this.parseYield(noIn); if (this.state.inGenerator) {
if (afterLeftParse) { let left = this.parseYield(noIn);
left = afterLeftParse.call(this, left, startPos, startLoc); if (afterLeftParse) {
left = afterLeftParse.call(this, left, startPos, startLoc);
}
return left;
} else {
// The tokenizer will assume an expression is allowed after
// `yield`, but this isn't that kind of yield
this.state.exprAllowed = false;
} }
return left;
} }
const oldCommaAfterSpreadAt = this.state.commaAfterSpreadAt; const oldCommaAfterSpreadAt = this.state.commaAfterSpreadAt;
@ -145,7 +151,7 @@ export default class ExpressionParser extends LValParser {
failOnShorthandAssign = true; failOnShorthandAssign = true;
} }
if (this.match(tt.parenL) || this.match(tt.name) || this.match(tt._yield)) { if (this.match(tt.parenL) || this.match(tt.name)) {
this.state.potentialArrowAt = this.state.start; this.state.potentialArrowAt = this.state.start;
} }
@ -412,7 +418,13 @@ export default class ExpressionParser extends LValParser {
// Parse unary operators, both prefix and postfix. // Parse unary operators, both prefix and postfix.
parseMaybeUnary(refShorthandDefaultPos: ?Pos): N.Expression { parseMaybeUnary(refShorthandDefaultPos: ?Pos): N.Expression {
if (this.state.type.prefix) { if (
this.isContextual("await") &&
(this.state.inAsync ||
(!this.state.inFunction && this.options.allowAwaitOutsideFunction))
) {
return this.parseAwait();
} else if (this.state.type.prefix) {
const node = this.startNode(); const node = this.startNode();
const update = this.match(tt.incDec); const update = this.match(tt.incDec);
node.operator = this.state.value; node.operator = this.state.value;
@ -841,29 +853,12 @@ export default class ExpressionParser extends LValParser {
this.next(); this.next();
return this.finishNode(node, "ThisExpression"); return this.finishNode(node, "ThisExpression");
case tt._yield:
if (this.state.inGenerator) this.unexpected();
case tt.name: { case tt.name: {
node = this.startNode(); node = this.startNode();
const allowAwait =
this.state.value === "await" &&
(this.state.inAsync ||
(!this.state.inFunction && this.options.allowAwaitOutsideFunction));
const containsEsc = this.state.containsEsc; const containsEsc = this.state.containsEsc;
const allowYield = this.shouldAllowYieldIdentifier(); const id = this.parseIdentifier();
const id = this.parseIdentifier(allowAwait || allowYield);
if (id.name === "await") { if (
if (
this.state.inAsync ||
this.inModule ||
(!this.state.inFunction && this.options.allowAwaitOutsideFunction)
) {
return this.parseAwait(node);
}
} else if (
!containsEsc && !containsEsc &&
id.name === "async" && id.name === "async" &&
this.match(tt._function) && this.match(tt._function) &&
@ -1832,17 +1827,14 @@ export default class ExpressionParser extends LValParser {
if (isExpression) { if (isExpression) {
node.body = this.parseMaybeAssign(); node.body = this.parseMaybeAssign();
} else { } else {
// Start a new scope with regard to labels and the `inGenerator` // Start a new scope with regard to labels
// flag (restore them to their old value afterwards). // flag (restore them to their old value afterwards).
const oldInGen = this.state.inGenerator;
const oldInFunc = this.state.inFunction; const oldInFunc = this.state.inFunction;
const oldLabels = this.state.labels; const oldLabels = this.state.labels;
this.state.inGenerator = node.generator;
this.state.inFunction = true; this.state.inFunction = true;
this.state.labels = []; this.state.labels = [];
node.body = this.parseBlock(true); node.body = this.parseBlock(true);
this.state.inFunction = oldInFunc; this.state.inFunction = oldInFunc;
this.state.inGenerator = oldInGen;
this.state.labels = oldLabels; this.state.labels = oldLabels;
} }
@ -1952,15 +1944,6 @@ export default class ExpressionParser extends LValParser {
} }
parseIdentifierName(pos: number, liberal?: boolean): string { parseIdentifierName(pos: number, liberal?: boolean): string {
if (!liberal) {
this.checkReservedWord(
this.state.value,
this.state.start,
!!this.state.type.keyword,
false,
);
}
let name: string; let name: string;
if (this.match(tt.name)) { if (this.match(tt.name)) {
@ -1985,11 +1968,17 @@ export default class ExpressionParser extends LValParser {
throw this.unexpected(); throw this.unexpected();
} }
if (!liberal && name === "await" && this.state.inAsync) { if (!liberal) {
this.raise(pos, "invalid use of await inside of an async function"); this.checkReservedWord(
name,
this.state.start,
!!this.state.type.keyword,
false,
);
} }
this.next(); this.next();
return name; return name;
} }
@ -1999,18 +1988,17 @@ export default class ExpressionParser extends LValParser {
checkKeywords: boolean, checkKeywords: boolean,
isBinding: boolean, isBinding: boolean,
): void { ): void {
if (
this.state.strict &&
(isStrictReservedWord(word) ||
(isBinding && isStrictBindReservedWord(word)))
) {
this.raise(startLoc, word + " is a reserved word in strict mode");
}
if (this.state.inGenerator && word === "yield") { if (this.state.inGenerator && word === "yield") {
this.raise( this.raise(
startLoc, startLoc,
"yield is a reserved word inside generator functions", "Can not use 'yield' as identifier inside a generator",
);
}
if (this.state.inAsync && word === "await") {
this.raise(
startLoc,
"Can not use 'await' as identifier inside an async function",
); );
} }
@ -2022,20 +2010,40 @@ export default class ExpressionParser extends LValParser {
} }
if (this.isReservedWord(word) || (checkKeywords && isKeyword(word))) { if (this.isReservedWord(word) || (checkKeywords && isKeyword(word))) {
if (!this.state.inAsync && word === "await") {
this.raise(
startLoc,
"Can not use keyword 'await' outside an async function",
);
}
this.raise(startLoc, word + " is a reserved word"); this.raise(startLoc, word + " is a reserved word");
} }
if (
this.state.strict &&
(isStrictReservedWord(word) ||
(isBinding && isStrictBindReservedWord(word)))
) {
this.raise(startLoc, word + " is a reserved word in strict mode");
}
} }
// Parses await expression inside async function. // Parses await expression inside async function.
parseAwait(node: N.AwaitExpression): N.AwaitExpression { parseAwait(): N.AwaitExpression {
// istanbul ignore next: this condition is checked at the call site so won't be hit here const node = this.startNode();
if ( if (
!this.state.inAsync && this.state.maybeInArrowParameters &&
(this.state.inFunction || !this.options.allowAwaitOutsideFunction) // We only set yieldOrAwaitInPossibleArrowParameters if we haven't already
// found a possible invalid AwaitExpression.
!this.state.yieldOrAwaitInPossibleArrowParameters
) { ) {
this.unexpected(); this.state.yieldOrAwaitInPossibleArrowParameters = node;
} }
this.next();
if (this.state.inParameters) { if (this.state.inParameters) {
this.raise( this.raise(
node.start, node.start,
@ -2048,14 +2056,6 @@ export default class ExpressionParser extends LValParser {
"await* has been removed from the async functions proposal. Use Promise.all() instead.", "await* has been removed from the async functions proposal. Use Promise.all() instead.",
); );
} }
if (
this.state.maybeInArrowParameters &&
// We only set yieldOrAwaitInPossibleArrowParameters if we haven't already
// found a possible invalid AwaitExpression.
!this.state.yieldOrAwaitInPossibleArrowParameters
) {
this.state.yieldOrAwaitInPossibleArrowParameters = node;
}
node.argument = this.parseMaybeUnary(); node.argument = this.parseMaybeUnary();
return this.finishNode(node, "AwaitExpression"); return this.finishNode(node, "AwaitExpression");

View File

@ -14,16 +14,14 @@ import type {
SpreadElement, SpreadElement,
} from "../types"; } from "../types";
import type { Pos, Position } from "../util/location"; import type { Pos, Position } from "../util/location";
import {
isStrictReservedWord,
isStrictBindReservedWord,
} from "../util/identifier";
import { NodeUtils } from "./node"; import { NodeUtils } from "./node";
export default class LValParser extends NodeUtils { export default class LValParser extends NodeUtils {
// Forward-declaration: defined in expression.js // Forward-declaration: defined in expression.js
+checkReservedWord: (
word: string,
startLoc: number,
checkKeywords: boolean,
isBinding: boolean,
) => void;
+parseIdentifier: (liberal?: boolean) => Identifier; +parseIdentifier: (liberal?: boolean) => Identifier;
+parseMaybeAssign: ( +parseMaybeAssign: (
noIn?: ?boolean, noIn?: ?boolean,
@ -224,22 +222,11 @@ export default class LValParser extends NodeUtils {
return this.finishNode(node, "RestElement"); return this.finishNode(node, "RestElement");
} }
shouldAllowYieldIdentifier(): boolean {
return (
this.match(tt._yield) && !this.state.strict && !this.state.inGenerator
);
}
parseBindingIdentifier(): Identifier {
return this.parseIdentifier(this.shouldAllowYieldIdentifier());
}
// Parses lvalue (assignable) atom. // Parses lvalue (assignable) atom.
parseBindingAtom(): Pattern { parseBindingAtom(): Pattern {
switch (this.state.type) { switch (this.state.type) {
case tt._yield:
case tt.name: case tt.name:
return this.parseBindingIdentifier(); return this.parseIdentifier();
case tt.bracketL: { case tt.bracketL: {
const node = this.startNode(); const node = this.startNode();
@ -347,7 +334,16 @@ export default class LValParser extends NodeUtils {
): void { ): void {
switch (expr.type) { switch (expr.type) {
case "Identifier": case "Identifier":
this.checkReservedWord(expr.name, expr.start, false, true); if (
this.state.strict &&
(isStrictReservedWord(expr.name) ||
isStrictBindReservedWord(expr.name))
) {
this.raise(
expr.start,
expr.name + " is a reserved word in strict mode",
);
}
if (checkClashes) { if (checkClashes) {
// we need to prefix this with an underscore for the cases where we have a key of // we need to prefix this with an underscore for the cases where we have a key of

View File

@ -975,17 +975,9 @@ export default class StatementParser extends ExpressionParser {
this.initFunction(node, isAsync); this.initFunction(node, isAsync);
if (this.match(tt.star)) { node.generator = this.eat(tt.star);
node.generator = true;
this.next();
}
if ( if (isStatement && !optionalId && !this.match(tt.name)) {
isStatement &&
!optionalId &&
!this.match(tt.name) &&
!this.match(tt._yield)
) {
this.unexpected(); this.unexpected();
} }
@ -1002,8 +994,8 @@ export default class StatementParser extends ExpressionParser {
this.state.inAsync = isAsync; this.state.inAsync = isAsync;
this.state.inGenerator = node.generator; this.state.inGenerator = node.generator;
} }
if (this.match(tt.name) || this.match(tt._yield)) { if (this.match(tt.name)) {
node.id = this.parseBindingIdentifier(); node.id = this.parseIdentifier();
} }
if (isStatement) { if (isStatement) {
this.state.inAsync = isAsync; this.state.inAsync = isAsync;

View File

@ -1360,7 +1360,6 @@ export default class Tokenizer extends LocationParser {
// `tt.name`. // `tt.name`.
if ( if (
prevType === tt._return || prevType === tt._return ||
prevType === tt._yield ||
(prevType === tt.name && this.state.exprAllowed) (prevType === tt.name && this.state.exprAllowed)
) { ) {
return lineBreak.test( return lineBreak.test(

View File

@ -190,7 +190,6 @@ export const keywords = Object.create(null, {
extends: makeKeywordProps("extends", { beforeExpr }), extends: makeKeywordProps("extends", { beforeExpr }),
export: makeKeywordProps("export"), export: makeKeywordProps("export"),
import: makeKeywordProps("import", { startsExpr }), import: makeKeywordProps("import", { startsExpr }),
yield: makeKeywordProps("yield", { beforeExpr, startsExpr }),
null: makeKeywordProps("null", { startsExpr }), null: makeKeywordProps("null", { startsExpr }),
true: makeKeywordProps("true", { startsExpr }), true: makeKeywordProps("true", { startsExpr }),
false: makeKeywordProps("false", { startsExpr }), false: makeKeywordProps("false", { startsExpr }),

View File

@ -62,7 +62,6 @@ const keywords = new Set([
"extends", "extends",
"export", "export",
"import", "import",
"yield",
"super", "super",
]); ]);

View File

@ -1,4 +1,4 @@
{ {
"sourceType": "module", "sourceType": "module",
"throws": "await is a reserved word (1:0)" "throws": "Can not use keyword 'await' outside an async function (1:0)"
} }

View File

@ -1,4 +1,4 @@
{ {
"sourceType": "module", "sourceType": "module",
"throws": "await is a reserved word (1:6)" "throws": "Can not use keyword 'await' outside an async function (1:6)"
} }

View File

@ -1,4 +1,4 @@
{ {
"sourceType": "module", "sourceType": "module",
"throws": "await is a reserved word (1:8)" "throws": "Can not use keyword 'await' outside an async function (1:8)"
} }

View File

@ -1,4 +1,4 @@
{ {
"sourceType": "module", "sourceType": "module",
"throws": "await is a reserved word (1:15)" "throws": "Can not use keyword 'await' outside an async function (1:15)"
} }

View File

@ -1,4 +1,4 @@
{ {
"sourceType": "module", "sourceType": "module",
"throws": "await is a reserved word (1:9)" "throws": "Can not use keyword 'await' outside an async function (1:9)"
} }

View File

@ -1,4 +1,4 @@
{ {
"sourceType": "module", "sourceType": "module",
"throws": "await is a reserved word (1:6)" "throws": "Can not use keyword 'await' outside an async function (1:6)"
} }

View File

@ -0,0 +1,3 @@
function* wrap() {
class A {*yield() {}}
}

View File

@ -0,0 +1,194 @@
{
"type": "File",
"start": 0,
"end": 46,
"loc": {
"start": {
"line": 1,
"column": 0
},
"end": {
"line": 3,
"column": 1
}
},
"program": {
"type": "Program",
"start": 0,
"end": 46,
"loc": {
"start": {
"line": 1,
"column": 0
},
"end": {
"line": 3,
"column": 1
}
},
"sourceType": "script",
"interpreter": null,
"body": [
{
"type": "FunctionDeclaration",
"start": 0,
"end": 46,
"loc": {
"start": {
"line": 1,
"column": 0
},
"end": {
"line": 3,
"column": 1
}
},
"id": {
"type": "Identifier",
"start": 10,
"end": 14,
"loc": {
"start": {
"line": 1,
"column": 10
},
"end": {
"line": 1,
"column": 14
},
"identifierName": "wrap"
},
"name": "wrap"
},
"generator": true,
"async": false,
"params": [],
"body": {
"type": "BlockStatement",
"start": 17,
"end": 46,
"loc": {
"start": {
"line": 1,
"column": 17
},
"end": {
"line": 3,
"column": 1
}
},
"body": [
{
"type": "ClassDeclaration",
"start": 23,
"end": 44,
"loc": {
"start": {
"line": 2,
"column": 4
},
"end": {
"line": 2,
"column": 25
}
},
"id": {
"type": "Identifier",
"start": 29,
"end": 30,
"loc": {
"start": {
"line": 2,
"column": 10
},
"end": {
"line": 2,
"column": 11
},
"identifierName": "A"
},
"name": "A"
},
"superClass": null,
"body": {
"type": "ClassBody",
"start": 31,
"end": 44,
"loc": {
"start": {
"line": 2,
"column": 12
},
"end": {
"line": 2,
"column": 25
}
},
"body": [
{
"type": "ClassMethod",
"start": 32,
"end": 43,
"loc": {
"start": {
"line": 2,
"column": 13
},
"end": {
"line": 2,
"column": 24
}
},
"static": false,
"kind": "method",
"key": {
"type": "Identifier",
"start": 33,
"end": 38,
"loc": {
"start": {
"line": 2,
"column": 14
},
"end": {
"line": 2,
"column": 19
},
"identifierName": "yield"
},
"name": "yield"
},
"computed": false,
"id": null,
"generator": true,
"async": false,
"params": [],
"body": {
"type": "BlockStatement",
"start": 41,
"end": 43,
"loc": {
"start": {
"line": 2,
"column": 22
},
"end": {
"line": 2,
"column": 24
}
},
"body": [],
"directives": []
}
}
]
}
}
],
"directives": []
}
}
],
"directives": []
}
}

View File

@ -1,3 +1,3 @@
{ {
"throws": "yield is a reserved word inside generator functions (2:11)" "throws": "Can not use 'yield' as identifier inside a generator (2:11)"
} }

View File

@ -1,3 +1,3 @@
{ {
"throws": "yield is a reserved word inside generator functions (1:11)" "throws": "Can not use 'yield' as identifier inside a generator (1:11)"
} }

View File

@ -0,0 +1,3 @@
function* wrap() {
({*yield() {}})
}

View File

@ -0,0 +1,180 @@
{
"type": "File",
"start": 0,
"end": 40,
"loc": {
"start": {
"line": 1,
"column": 0
},
"end": {
"line": 3,
"column": 1
}
},
"program": {
"type": "Program",
"start": 0,
"end": 40,
"loc": {
"start": {
"line": 1,
"column": 0
},
"end": {
"line": 3,
"column": 1
}
},
"sourceType": "script",
"interpreter": null,
"body": [
{
"type": "FunctionDeclaration",
"start": 0,
"end": 40,
"loc": {
"start": {
"line": 1,
"column": 0
},
"end": {
"line": 3,
"column": 1
}
},
"id": {
"type": "Identifier",
"start": 10,
"end": 14,
"loc": {
"start": {
"line": 1,
"column": 10
},
"end": {
"line": 1,
"column": 14
},
"identifierName": "wrap"
},
"name": "wrap"
},
"generator": true,
"async": false,
"params": [],
"body": {
"type": "BlockStatement",
"start": 17,
"end": 40,
"loc": {
"start": {
"line": 1,
"column": 17
},
"end": {
"line": 3,
"column": 1
}
},
"body": [
{
"type": "ExpressionStatement",
"start": 23,
"end": 38,
"loc": {
"start": {
"line": 2,
"column": 4
},
"end": {
"line": 2,
"column": 19
}
},
"expression": {
"type": "ObjectExpression",
"start": 24,
"end": 37,
"loc": {
"start": {
"line": 2,
"column": 5
},
"end": {
"line": 2,
"column": 18
}
},
"properties": [
{
"type": "ObjectMethod",
"start": 25,
"end": 36,
"loc": {
"start": {
"line": 2,
"column": 6
},
"end": {
"line": 2,
"column": 17
}
},
"method": true,
"key": {
"type": "Identifier",
"start": 26,
"end": 31,
"loc": {
"start": {
"line": 2,
"column": 7
},
"end": {
"line": 2,
"column": 12
},
"identifierName": "yield"
},
"name": "yield"
},
"computed": false,
"kind": "method",
"id": null,
"generator": true,
"async": false,
"params": [],
"body": {
"type": "BlockStatement",
"start": 34,
"end": 36,
"loc": {
"start": {
"line": 2,
"column": 15
},
"end": {
"line": 2,
"column": 17
}
},
"body": [],
"directives": []
}
}
],
"extra": {
"parenthesized": true,
"parenStart": 23
}
}
}
],
"directives": []
}
}
],
"directives": []
}
}

View File

@ -0,0 +1 @@
function *f2() { () => yield / 1 }

View File

@ -0,0 +1,175 @@
{
"type": "File",
"start": 0,
"end": 34,
"loc": {
"start": {
"line": 1,
"column": 0
},
"end": {
"line": 1,
"column": 34
}
},
"program": {
"type": "Program",
"start": 0,
"end": 34,
"loc": {
"start": {
"line": 1,
"column": 0
},
"end": {
"line": 1,
"column": 34
}
},
"sourceType": "script",
"interpreter": null,
"body": [
{
"type": "FunctionDeclaration",
"start": 0,
"end": 34,
"loc": {
"start": {
"line": 1,
"column": 0
},
"end": {
"line": 1,
"column": 34
}
},
"id": {
"type": "Identifier",
"start": 10,
"end": 12,
"loc": {
"start": {
"line": 1,
"column": 10
},
"end": {
"line": 1,
"column": 12
},
"identifierName": "f2"
},
"name": "f2"
},
"generator": true,
"async": false,
"params": [],
"body": {
"type": "BlockStatement",
"start": 15,
"end": 34,
"loc": {
"start": {
"line": 1,
"column": 15
},
"end": {
"line": 1,
"column": 34
}
},
"body": [
{
"type": "ExpressionStatement",
"start": 17,
"end": 32,
"loc": {
"start": {
"line": 1,
"column": 17
},
"end": {
"line": 1,
"column": 32
}
},
"expression": {
"type": "ArrowFunctionExpression",
"start": 17,
"end": 32,
"loc": {
"start": {
"line": 1,
"column": 17
},
"end": {
"line": 1,
"column": 32
}
},
"id": null,
"generator": false,
"async": false,
"params": [],
"body": {
"type": "BinaryExpression",
"start": 23,
"end": 32,
"loc": {
"start": {
"line": 1,
"column": 23
},
"end": {
"line": 1,
"column": 32
}
},
"left": {
"type": "Identifier",
"start": 23,
"end": 28,
"loc": {
"start": {
"line": 1,
"column": 23
},
"end": {
"line": 1,
"column": 28
},
"identifierName": "yield"
},
"name": "yield"
},
"operator": "/",
"right": {
"type": "NumericLiteral",
"start": 31,
"end": 32,
"loc": {
"start": {
"line": 1,
"column": 31
},
"end": {
"line": 1,
"column": 32
}
},
"extra": {
"rawValue": 1,
"raw": "1"
},
"value": 1
}
}
}
}
],
"directives": []
}
}
],
"directives": []
}
}

View File

@ -1,3 +1,3 @@
{ {
"throws": "yield is a reserved word inside generator functions (1:11)" "throws": "Can not use 'yield' as identifier inside a generator (1:11)"
} }

View File

@ -1,3 +1,3 @@
{ {
"throws": "yield is a reserved word inside generator functions (1:13)" "throws": "Can not use 'yield' as identifier inside a generator (1:13)"
} }

View File

@ -0,0 +1 @@
var yield = 2

View File

@ -0,0 +1,105 @@
{
"type": "File",
"start": 0,
"end": 13,
"loc": {
"start": {
"line": 1,
"column": 0
},
"end": {
"line": 1,
"column": 13
}
},
"program": {
"type": "Program",
"start": 0,
"end": 13,
"loc": {
"start": {
"line": 1,
"column": 0
},
"end": {
"line": 1,
"column": 13
}
},
"sourceType": "script",
"interpreter": null,
"body": [
{
"type": "VariableDeclaration",
"start": 0,
"end": 13,
"loc": {
"start": {
"line": 1,
"column": 0
},
"end": {
"line": 1,
"column": 13
}
},
"declarations": [
{
"type": "VariableDeclarator",
"start": 4,
"end": 13,
"loc": {
"start": {
"line": 1,
"column": 4
},
"end": {
"line": 1,
"column": 13
}
},
"id": {
"type": "Identifier",
"start": 4,
"end": 9,
"loc": {
"start": {
"line": 1,
"column": 4
},
"end": {
"line": 1,
"column": 9
},
"identifierName": "yield"
},
"name": "yield"
},
"init": {
"type": "NumericLiteral",
"start": 12,
"end": 13,
"loc": {
"start": {
"line": 1,
"column": 12
},
"end": {
"line": 1,
"column": 13
}
},
"extra": {
"rawValue": 2,
"raw": "2"
},
"value": 2
}
}
],
"kind": "var"
}
],
"directives": []
}
}

View File

@ -1,3 +1,3 @@
{ {
"throws": "invalid use of await inside of an async function (1:16)" "throws": "Can not use 'await' as identifier inside an async function (1:16)"
} }

View File

@ -1,3 +1,3 @@
{ {
"throws": "invalid use of await inside of an async function (2:11)" "throws": "Can not use 'await' as identifier inside an async function (2:11)"
} }

View File

@ -1,3 +1,3 @@
{ {
"throws": "yield is a reserved word inside generator functions (1:30)" "throws": "Can not use 'yield' as identifier inside a generator (1:30)"
} }

View File

@ -1,3 +1,3 @@
{ {
"throws": "yield is a reserved word inside generator functions (1:26)" "throws": "Can not use 'yield' as identifier inside a generator (1:26)"
} }

View File

@ -1,3 +1,4 @@
{ {
"throws": "'import' and 'export' may appear only with 'sourceType: \"module\"' (1:0)" "sourceType": "module",
"throws": "yield is a reserved word in strict mode (1:25)"
} }

View File

@ -1,3 +1,3 @@
{ {
"throws": "yield is a reserved word inside generator functions (1:10)" "throws": "Can not use 'yield' as identifier inside a generator (1:10)"
} }

View File

@ -1,3 +1,3 @@
{ {
"throws": "yield is a reserved word inside generator functions (1:12)" "throws": "Can not use 'yield' as identifier inside a generator (1:12)"
} }

View File

@ -1,3 +1,3 @@
{ {
"throws": "yield is a reserved word inside generator functions (1:18)" "throws": "Can not use 'yield' as identifier inside a generator (1:18)"
} }

View File

@ -1,3 +1,3 @@
{ {
"throws": "yield is a reserved word inside generator functions (1:25)" "throws": "Can not use 'yield' as identifier inside a generator (1:25)"
} }

View File

@ -1,3 +1,3 @@
{ {
"throws": "yield is a reserved word inside generator functions (1:20)" "throws": "Can not use 'yield' as identifier inside a generator (1:20)"
} }

View File

@ -1,3 +1,3 @@
{ {
"throws": "yield is a reserved word inside generator functions (1:12)" "throws": "Can not use 'yield' as identifier inside a generator (1:12)"
} }

View File

@ -1,3 +1,3 @@
{ {
"throws": "yield is a reserved word inside generator functions (1:24)" "throws": "Can not use 'yield' as identifier inside a generator (1:24)"
} }

View File

@ -1,3 +1,3 @@
{ {
"throws": "yield is a reserved word inside generator functions (1:20)" "throws": "Can not use 'yield' as identifier inside a generator (1:20)"
} }

View File

@ -649,7 +649,6 @@ language/block-scope/syntax/redeclaration/var-redeclaration-attempt-after-let.js
language/block-scope/syntax/redeclaration/var-redeclaration-attempt-after-let.js(strict mode) language/block-scope/syntax/redeclaration/var-redeclaration-attempt-after-let.js(strict mode)
language/expressions/assignment/destructuring/obj-prop-__proto__dup.js(default) language/expressions/assignment/destructuring/obj-prop-__proto__dup.js(default)
language/expressions/assignment/destructuring/obj-prop-__proto__dup.js(strict mode) language/expressions/assignment/destructuring/obj-prop-__proto__dup.js(strict mode)
language/expressions/assignment/dstr/obj-id-identifier-yield-ident-valid.js(default)
language/expressions/async-arrow-function/await-as-param-ident-nested-arrow-parameter-position.js(default) language/expressions/async-arrow-function/await-as-param-ident-nested-arrow-parameter-position.js(default)
language/expressions/async-arrow-function/await-as-param-ident-nested-arrow-parameter-position.js(strict mode) language/expressions/async-arrow-function/await-as-param-ident-nested-arrow-parameter-position.js(strict mode)
language/expressions/async-arrow-function/await-as-param-nested-arrow-parameter-position.js(default) language/expressions/async-arrow-function/await-as-param-nested-arrow-parameter-position.js(default)
@ -795,8 +794,6 @@ language/expressions/object/method-definition/private-name-early-error-gen-insid
language/expressions/object/method-definition/private-name-early-error-gen-inside-class.js(strict mode) language/expressions/object/method-definition/private-name-early-error-gen-inside-class.js(strict mode)
language/expressions/object/method-definition/private-name-early-error-method-inside-class.js(default) language/expressions/object/method-definition/private-name-early-error-method-inside-class.js(default)
language/expressions/object/method-definition/private-name-early-error-method-inside-class.js(strict mode) language/expressions/object/method-definition/private-name-early-error-method-inside-class.js(strict mode)
language/expressions/object/yield-non-strict-access.js(default)
language/expressions/object/yield-non-strict-syntax.js(default)
language/expressions/postfix-decrement/arguments-nostrict.js(default) language/expressions/postfix-decrement/arguments-nostrict.js(default)
language/expressions/postfix-decrement/eval-nostrict.js(default) language/expressions/postfix-decrement/eval-nostrict.js(default)
language/expressions/postfix-increment/arguments-nostrict.js(default) language/expressions/postfix-increment/arguments-nostrict.js(default)
@ -1150,7 +1147,6 @@ language/statements/for-of/dstr/array-rest-before-elision.js(default)
language/statements/for-of/dstr/array-rest-before-elision.js(strict mode) language/statements/for-of/dstr/array-rest-before-elision.js(strict mode)
language/statements/for-of/dstr/array-rest-elision-invalid.js(default) language/statements/for-of/dstr/array-rest-elision-invalid.js(default)
language/statements/for-of/dstr/array-rest-elision-invalid.js(strict mode) language/statements/for-of/dstr/array-rest-elision-invalid.js(strict mode)
language/statements/for-of/dstr/obj-id-identifier-yield-ident-valid.js(default)
language/statements/for-of/head-const-bound-names-dup.js(default) language/statements/for-of/head-const-bound-names-dup.js(default)
language/statements/for-of/head-const-bound-names-dup.js(strict mode) language/statements/for-of/head-const-bound-names-dup.js(strict mode)
language/statements/for-of/head-const-bound-names-in-stmt.js(default) language/statements/for-of/head-const-bound-names-in-stmt.js(default)
@ -1170,8 +1166,6 @@ language/statements/for/head-let-bound-names-in-stmt.js(strict mode)
language/statements/function/dflt-params-duplicates.js(default) language/statements/function/dflt-params-duplicates.js(default)
language/statements/generators/dflt-params-duplicates.js(default) language/statements/generators/dflt-params-duplicates.js(default)
language/statements/labeled/let-identifier-with-newline.js(default) language/statements/labeled/let-identifier-with-newline.js(default)
language/statements/labeled/value-yield-non-strict-escaped.js(default)
language/statements/labeled/value-yield-non-strict.js(default)
language/statements/let/redeclaration-error-from-within-strict-mode-function.js(default) language/statements/let/redeclaration-error-from-within-strict-mode-function.js(default)
language/statements/switch/syntax/redeclaration/async-function-name-redeclaration-attempt-with-async-function.js(default) language/statements/switch/syntax/redeclaration/async-function-name-redeclaration-attempt-with-async-function.js(default)
language/statements/switch/syntax/redeclaration/async-function-name-redeclaration-attempt-with-async-function.js(strict mode) language/statements/switch/syntax/redeclaration/async-function-name-redeclaration-attempt-with-async-function.js(strict mode)