From 2817844e895b8999b71ec89ba008180c07b2f66d Mon Sep 17 00:00:00 2001 From: Daniel Tschinder Date: Fri, 8 Feb 2019 13:36:37 -0800 Subject: [PATCH] Fix regression with let (#9477) * Fix corner cases with let * Handle generators correctly * Fix flow plugin * Fix typescript plugin --- packages/babel-parser/src/parser/statement.js | 95 ++++---- packages/babel-parser/src/plugins/flow.js | 4 +- .../babel-parser/src/plugins/typescript.js | 7 +- .../let/let-block-with-newline/input.js | 4 + .../let/let-block-with-newline/output.json | 220 ++++++++++++++++++ .../let/let-with-linebreak-arr-dstrk/input.js | 2 + .../let-with-linebreak-arr-dstrk/output.json | 139 +++++++++++ .../let/let-with-linebreak-obj-dstrk/input.js | 2 + .../let-with-linebreak-obj-dstrk/output.json | 212 +++++++++++++++++ .../es2015/let/let-with-linebreak/input.js | 2 + .../es2015/let/let-with-linebreak/output.json | 86 +++++++ .../label-invalid-class/options.json | 2 +- .../label-invalid-const/options.json | 2 +- .../label-invalid-func-async/options.json | 2 +- .../label-invalid-func-generator/options.json | 2 +- .../label-invalid-func-strict/options.json | 2 +- .../statements/label-invalid-let/options.json | 2 +- .../es2015/uncategorised/328/options.json | 2 +- .../invalid-syntax/migrated_0141/options.json | 2 +- scripts/tests/test262/test262_whitelist.txt | 181 -------------- 20 files changed, 728 insertions(+), 242 deletions(-) create mode 100644 packages/babel-parser/test/fixtures/es2015/let/let-block-with-newline/input.js create mode 100644 packages/babel-parser/test/fixtures/es2015/let/let-block-with-newline/output.json create mode 100644 packages/babel-parser/test/fixtures/es2015/let/let-with-linebreak-arr-dstrk/input.js create mode 100644 packages/babel-parser/test/fixtures/es2015/let/let-with-linebreak-arr-dstrk/output.json create mode 100644 packages/babel-parser/test/fixtures/es2015/let/let-with-linebreak-obj-dstrk/input.js create mode 100644 packages/babel-parser/test/fixtures/es2015/let/let-with-linebreak-obj-dstrk/output.json create mode 100644 packages/babel-parser/test/fixtures/es2015/let/let-with-linebreak/input.js create mode 100644 packages/babel-parser/test/fixtures/es2015/let/let-with-linebreak/output.json diff --git a/packages/babel-parser/src/parser/statement.js b/packages/babel-parser/src/parser/statement.js index 9bee7358f5..369d1424b7 100644 --- a/packages/babel-parser/src/parser/statement.js +++ b/packages/babel-parser/src/parser/statement.js @@ -76,7 +76,7 @@ export default class StatementParser extends ExpressionParser { return this.finishNode(node, "InterpreterDirective"); } - isLet(declaration?: boolean): boolean { + isLet(context: ?string): boolean { if (!this.isContextual("let")) { return false; } @@ -85,20 +85,16 @@ export default class StatementParser extends ExpressionParser { // $FlowIgnore const next = this.state.pos + skip[0].length; const nextCh = this.state.input.charCodeAt(next); - if ( - (nextCh === charCodes.leftCurlyBrace && - !lineBreak.test(this.state.input.slice(this.state.end, next))) || - nextCh === charCodes.leftSquareBracket - ) { - return true; - } + // For ambiguous cases, determine if a LexicalDeclaration (or only a + // Statement) is allowed here. If context is not empty then only a Statement + // is allowed. However, `let [` is an explicit negative lookahead for + // ExpressionStatement, so special-case it first. + if (nextCh === charCodes.leftSquareBracket) return true; + if (context) return false; + + if (nextCh === charCodes.leftCurlyBrace) return true; + if (isIdentifierStart(nextCh)) { - if ( - !declaration && - lineBreak.test(this.state.input.slice(this.state.end, next)) - ) { - return false; - } let pos = next + 1; while (isIdentifierChar(this.state.input.charCodeAt(pos))) { ++pos; @@ -116,19 +112,19 @@ export default class StatementParser extends ExpressionParser { // `if (foo) /blah/.exec(foo)`, where looking at the previous token // does not help. - parseStatement(declaration: boolean, topLevel?: boolean): N.Statement { + parseStatement(context: ?string, topLevel?: boolean): N.Statement { if (this.match(tt.at)) { this.parseDecorators(true); } - return this.parseStatementContent(declaration, topLevel); + return this.parseStatementContent(context, topLevel); } - parseStatementContent(declaration: boolean, topLevel: ?boolean): N.Statement { + parseStatementContent(context: ?string, topLevel: ?boolean): N.Statement { let starttype = this.state.type; const node = this.startNode(); let kind; - if (this.isLet(declaration)) { + if (this.isLet(context)) { starttype = tt._var; kind = "let"; } @@ -148,18 +144,28 @@ export default class StatementParser extends ExpressionParser { return this.parseDoStatement(node); case tt._for: return this.parseForStatement(node); - case tt._function: + case tt._function: { if (this.lookahead().type === tt.dot) break; - if (!declaration) { + if ( + context && + (this.state.strict || (context !== "if" && context !== "label")) + ) { this.raise( this.state.start, "Function declaration not allowed in this context", ); } - return this.parseFunctionStatement(node); + const result = this.parseFunctionStatement(node); + // TODO: Remove this once we have proper scope tracking in place. + if (context && result.generator) { + this.unexpected(node.start); + } + + return result; + } case tt._class: - if (!declaration) this.unexpected(); + if (context) this.unexpected(); return this.parseClass(node, true); case tt._if: @@ -176,7 +182,7 @@ export default class StatementParser extends ExpressionParser { case tt._const: case tt._var: kind = kind || this.state.value; - if (!declaration && kind !== "var") this.unexpected(); + if (context && kind !== "var") this.unexpected(); return this.parseVarStatement(node, kind); case tt._while: @@ -237,7 +243,7 @@ export default class StatementParser extends ExpressionParser { const state = this.state.clone(); this.next(); if (this.match(tt._function) && !this.canInsertSemicolon()) { - if (!declaration) { + if (context) { this.raise( this.state.lastTokStart, "Function declaration not allowed in this context", @@ -264,7 +270,7 @@ export default class StatementParser extends ExpressionParser { expr.type === "Identifier" && this.eat(tt.colon) ) { - return this.parseLabeledStatement(node, maybeName, expr, declaration); + return this.parseLabeledStatement(node, maybeName, expr, context); } else { return this.parseExpressionStatement(node, expr); } @@ -430,7 +436,7 @@ export default class StatementParser extends ExpressionParser { // outside of the loop body. this.withTopicForbiddingContext(() => // Parse the loop body's body. - this.parseStatement(false), + this.parseStatement("do"), ); this.state.labels.pop(); @@ -526,8 +532,8 @@ export default class StatementParser extends ExpressionParser { parseIfStatement(node: N.IfStatement): N.IfStatement { this.next(); node.test = this.parseParenExpression(); - node.consequent = this.parseStatement(false); - node.alternate = this.eat(tt._else) ? this.parseStatement(false) : null; + node.consequent = this.parseStatement("if"); + node.alternate = this.eat(tt._else) ? this.parseStatement("if") : null; return this.finishNode(node, "IfStatement"); } @@ -583,7 +589,7 @@ export default class StatementParser extends ExpressionParser { this.expect(tt.colon); } else { if (cur) { - cur.consequent.push(this.parseStatement(true)); + cur.consequent.push(this.parseStatement(null)); } else { this.unexpected(); } @@ -672,7 +678,7 @@ export default class StatementParser extends ExpressionParser { // They are permitted in test expressions, outside of the loop body. this.withTopicForbiddingContext(() => // Parse loop body. - this.parseStatement(false), + this.parseStatement("while"), ); this.state.labels.pop(); @@ -694,7 +700,7 @@ export default class StatementParser extends ExpressionParser { // part of the outer context, outside of the function body. this.withTopicForbiddingContext(() => // Parse the statement body. - this.parseStatement(false), + this.parseStatement("with"), ); return this.finishNode(node, "WithStatement"); @@ -709,7 +715,7 @@ export default class StatementParser extends ExpressionParser { node: N.LabeledStatement, maybeName: string, expr: N.Identifier, - declaration: boolean, + context: ?string, ): N.LabeledStatement { for (const label of this.state.labels) { if (label.name === maybeName) { @@ -737,16 +743,13 @@ export default class StatementParser extends ExpressionParser { kind: kind, statementStart: this.state.start, }); - node.body = this.parseStatement(declaration); - - if ( - node.body.type === "ClassDeclaration" || - (node.body.type === "VariableDeclaration" && node.body.kind !== "var") || - (node.body.type === "FunctionDeclaration" && - (this.state.strict || node.body.generator || node.body.async)) - ) { - this.raise(node.body.start, "Invalid labeled declaration"); - } + node.body = this.parseStatement( + context + ? context.indexOf("label") === -1 + ? context + "label" + : context + : "label", + ); this.state.labels.pop(); node.label = expr; @@ -813,7 +816,7 @@ export default class StatementParser extends ExpressionParser { octalPosition = this.state.octalPosition; } - const stmt = this.parseStatement(true, topLevel); + const stmt = this.parseStatement(null, topLevel); if (directives && !parsedNonDirective && this.isValidDirective(stmt)) { const directive = this.stmtToDirective(stmt); @@ -861,7 +864,7 @@ export default class StatementParser extends ExpressionParser { // outside of the loop body. this.withTopicForbiddingContext(() => // Parse the loop body. - this.parseStatement(false), + this.parseStatement("for"), ); this.state.labels.pop(); @@ -896,7 +899,7 @@ export default class StatementParser extends ExpressionParser { // They are permitted in test expressions, outside of the loop body. this.withTopicForbiddingContext(() => // Parse loop body. - this.parseStatement(false), + this.parseStatement("for"), ); this.state.labels.pop(); @@ -1700,7 +1703,7 @@ export default class StatementParser extends ExpressionParser { // eslint-disable-next-line no-unused-vars parseExportDeclaration(node: N.ExportNamedDeclaration): ?N.Declaration { - return this.parseStatement(true); + return this.parseStatement(null); } isExportDefaultSpecifier(): boolean { diff --git a/packages/babel-parser/src/plugins/flow.js b/packages/babel-parser/src/plugins/flow.js index 912bb09c5f..1effe1725c 100644 --- a/packages/babel-parser/src/plugins/flow.js +++ b/packages/babel-parser/src/plugins/flow.js @@ -1566,7 +1566,7 @@ export default (superClass: Class): Class => } // interfaces - parseStatement(declaration: boolean, topLevel?: boolean): N.Statement { + parseStatement(context: ?string, topLevel?: boolean): N.Statement { // strict mode handling of `interface` since it's a reserved word if ( this.state.strict && @@ -1577,7 +1577,7 @@ export default (superClass: Class): Class => this.next(); return this.flowParseInterface(node); } else { - const stmt = super.parseStatement(declaration, topLevel); + const stmt = super.parseStatement(context, topLevel); // We will parse a flow pragma in any comment before the first statement. if (this.flowPragma === undefined && !this.isValidDirective(stmt)) { this.flowPragma = null; diff --git a/packages/babel-parser/src/plugins/typescript.js b/packages/babel-parser/src/plugins/typescript.js index 72aa5c4b9e..621f756f0a 100644 --- a/packages/babel-parser/src/plugins/typescript.js +++ b/packages/babel-parser/src/plugins/typescript.js @@ -1699,10 +1699,7 @@ export default (superClass: Class): Class => return super.parseExportDefaultExpression(); } - parseStatementContent( - declaration: boolean, - topLevel: ?boolean, - ): N.Statement { + parseStatementContent(context: ?string, topLevel: ?boolean): N.Statement { if (this.state.type === tt._const) { const ahead = this.lookahead(); if (ahead.type === tt.name && ahead.value === "enum") { @@ -1712,7 +1709,7 @@ export default (superClass: Class): Class => return this.tsParseEnumDeclaration(node, /* isConst */ true); } } - return super.parseStatementContent(declaration, topLevel); + return super.parseStatementContent(context, topLevel); } parseAccessModifier(): ?N.Accessibility { diff --git a/packages/babel-parser/test/fixtures/es2015/let/let-block-with-newline/input.js b/packages/babel-parser/test/fixtures/es2015/let/let-block-with-newline/input.js new file mode 100644 index 0000000000..37a324ee20 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2015/let/let-block-with-newline/input.js @@ -0,0 +1,4 @@ +if (false) { + L: let // ASI + {} +} diff --git a/packages/babel-parser/test/fixtures/es2015/let/let-block-with-newline/output.json b/packages/babel-parser/test/fixtures/es2015/let/let-block-with-newline/output.json new file mode 100644 index 0000000000..c2a68fccc8 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2015/let/let-block-with-newline/output.json @@ -0,0 +1,220 @@ +{ + "type": "File", + "start": 0, + "end": 39, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 4, + "column": 1 + } + }, + "program": { + "type": "Program", + "start": 0, + "end": 39, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 4, + "column": 1 + } + }, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "IfStatement", + "start": 0, + "end": 39, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 4, + "column": 1 + } + }, + "test": { + "type": "BooleanLiteral", + "start": 4, + "end": 9, + "loc": { + "start": { + "line": 1, + "column": 4 + }, + "end": { + "line": 1, + "column": 9 + } + }, + "value": false + }, + "consequent": { + "type": "BlockStatement", + "start": 11, + "end": 39, + "loc": { + "start": { + "line": 1, + "column": 11 + }, + "end": { + "line": 4, + "column": 1 + } + }, + "body": [ + { + "type": "LabeledStatement", + "start": 17, + "end": 23, + "loc": { + "start": { + "line": 2, + "column": 4 + }, + "end": { + "line": 2, + "column": 10 + } + }, + "body": { + "type": "ExpressionStatement", + "start": 20, + "end": 23, + "loc": { + "start": { + "line": 2, + "column": 7 + }, + "end": { + "line": 2, + "column": 10 + } + }, + "expression": { + "type": "Identifier", + "start": 20, + "end": 23, + "loc": { + "start": { + "line": 2, + "column": 7 + }, + "end": { + "line": 2, + "column": 10 + }, + "identifierName": "let" + }, + "name": "let" + } + }, + "label": { + "type": "Identifier", + "start": 17, + "end": 18, + "loc": { + "start": { + "line": 2, + "column": 4 + }, + "end": { + "line": 2, + "column": 5 + }, + "identifierName": "L" + }, + "name": "L" + }, + "trailingComments": [ + { + "type": "CommentLine", + "value": " ASI", + "start": 24, + "end": 30, + "loc": { + "start": { + "line": 2, + "column": 11 + }, + "end": { + "line": 2, + "column": 17 + } + } + } + ] + }, + { + "type": "BlockStatement", + "start": 35, + "end": 37, + "loc": { + "start": { + "line": 3, + "column": 4 + }, + "end": { + "line": 3, + "column": 6 + } + }, + "body": [], + "directives": [], + "leadingComments": [ + { + "type": "CommentLine", + "value": " ASI", + "start": 24, + "end": 30, + "loc": { + "start": { + "line": 2, + "column": 11 + }, + "end": { + "line": 2, + "column": 17 + } + } + } + ] + } + ], + "directives": [] + }, + "alternate": null + } + ], + "directives": [] + }, + "comments": [ + { + "type": "CommentLine", + "value": " ASI", + "start": 24, + "end": 30, + "loc": { + "start": { + "line": 2, + "column": 11 + }, + "end": { + "line": 2, + "column": 17 + } + } + } + ] +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/es2015/let/let-with-linebreak-arr-dstrk/input.js b/packages/babel-parser/test/fixtures/es2015/let/let-with-linebreak-arr-dstrk/input.js new file mode 100644 index 0000000000..7edb379b84 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2015/let/let-with-linebreak-arr-dstrk/input.js @@ -0,0 +1,2 @@ +let + [a] = [1]; diff --git a/packages/babel-parser/test/fixtures/es2015/let/let-with-linebreak-arr-dstrk/output.json b/packages/babel-parser/test/fixtures/es2015/let/let-with-linebreak-arr-dstrk/output.json new file mode 100644 index 0000000000..f219584663 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2015/let/let-with-linebreak-arr-dstrk/output.json @@ -0,0 +1,139 @@ +{ + "type": "File", + "start": 0, + "end": 18, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 2, + "column": 14 + } + }, + "program": { + "type": "Program", + "start": 0, + "end": 18, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 2, + "column": 14 + } + }, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "VariableDeclaration", + "start": 0, + "end": 18, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 2, + "column": 14 + } + }, + "declarations": [ + { + "type": "VariableDeclarator", + "start": 8, + "end": 17, + "loc": { + "start": { + "line": 2, + "column": 4 + }, + "end": { + "line": 2, + "column": 13 + } + }, + "id": { + "type": "ArrayPattern", + "start": 8, + "end": 11, + "loc": { + "start": { + "line": 2, + "column": 4 + }, + "end": { + "line": 2, + "column": 7 + } + }, + "elements": [ + { + "type": "Identifier", + "start": 9, + "end": 10, + "loc": { + "start": { + "line": 2, + "column": 5 + }, + "end": { + "line": 2, + "column": 6 + }, + "identifierName": "a" + }, + "name": "a" + } + ] + }, + "init": { + "type": "ArrayExpression", + "start": 14, + "end": 17, + "loc": { + "start": { + "line": 2, + "column": 10 + }, + "end": { + "line": 2, + "column": 13 + } + }, + "elements": [ + { + "type": "NumericLiteral", + "start": 15, + "end": 16, + "loc": { + "start": { + "line": 2, + "column": 11 + }, + "end": { + "line": 2, + "column": 12 + } + }, + "extra": { + "rawValue": 1, + "raw": "1" + }, + "value": 1 + } + ] + } + } + ], + "kind": "let" + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/es2015/let/let-with-linebreak-obj-dstrk/input.js b/packages/babel-parser/test/fixtures/es2015/let/let-with-linebreak-obj-dstrk/input.js new file mode 100644 index 0000000000..ba8c8801a6 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2015/let/let-with-linebreak-obj-dstrk/input.js @@ -0,0 +1,2 @@ +let + { a } = { a: 1 }; diff --git a/packages/babel-parser/test/fixtures/es2015/let/let-with-linebreak-obj-dstrk/output.json b/packages/babel-parser/test/fixtures/es2015/let/let-with-linebreak-obj-dstrk/output.json new file mode 100644 index 0000000000..3b6eb431c2 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2015/let/let-with-linebreak-obj-dstrk/output.json @@ -0,0 +1,212 @@ +{ + "type": "File", + "start": 0, + "end": 25, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 2, + "column": 21 + } + }, + "program": { + "type": "Program", + "start": 0, + "end": 25, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 2, + "column": 21 + } + }, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "VariableDeclaration", + "start": 0, + "end": 25, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 2, + "column": 21 + } + }, + "declarations": [ + { + "type": "VariableDeclarator", + "start": 8, + "end": 24, + "loc": { + "start": { + "line": 2, + "column": 4 + }, + "end": { + "line": 2, + "column": 20 + } + }, + "id": { + "type": "ObjectPattern", + "start": 8, + "end": 13, + "loc": { + "start": { + "line": 2, + "column": 4 + }, + "end": { + "line": 2, + "column": 9 + } + }, + "properties": [ + { + "type": "ObjectProperty", + "start": 10, + "end": 11, + "loc": { + "start": { + "line": 2, + "column": 6 + }, + "end": { + "line": 2, + "column": 7 + } + }, + "method": false, + "key": { + "type": "Identifier", + "start": 10, + "end": 11, + "loc": { + "start": { + "line": 2, + "column": 6 + }, + "end": { + "line": 2, + "column": 7 + }, + "identifierName": "a" + }, + "name": "a" + }, + "computed": false, + "shorthand": true, + "value": { + "type": "Identifier", + "start": 10, + "end": 11, + "loc": { + "start": { + "line": 2, + "column": 6 + }, + "end": { + "line": 2, + "column": 7 + }, + "identifierName": "a" + }, + "name": "a" + }, + "extra": { + "shorthand": true + } + } + ] + }, + "init": { + "type": "ObjectExpression", + "start": 16, + "end": 24, + "loc": { + "start": { + "line": 2, + "column": 12 + }, + "end": { + "line": 2, + "column": 20 + } + }, + "properties": [ + { + "type": "ObjectProperty", + "start": 18, + "end": 22, + "loc": { + "start": { + "line": 2, + "column": 14 + }, + "end": { + "line": 2, + "column": 18 + } + }, + "method": false, + "key": { + "type": "Identifier", + "start": 18, + "end": 19, + "loc": { + "start": { + "line": 2, + "column": 14 + }, + "end": { + "line": 2, + "column": 15 + }, + "identifierName": "a" + }, + "name": "a" + }, + "computed": false, + "shorthand": false, + "value": { + "type": "NumericLiteral", + "start": 21, + "end": 22, + "loc": { + "start": { + "line": 2, + "column": 17 + }, + "end": { + "line": 2, + "column": 18 + } + }, + "extra": { + "rawValue": 1, + "raw": "1" + }, + "value": 1 + } + } + ] + } + } + ], + "kind": "let" + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/es2015/let/let-with-linebreak/input.js b/packages/babel-parser/test/fixtures/es2015/let/let-with-linebreak/input.js new file mode 100644 index 0000000000..e1e10c74e6 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2015/let/let-with-linebreak/input.js @@ -0,0 +1,2 @@ +let + a; diff --git a/packages/babel-parser/test/fixtures/es2015/let/let-with-linebreak/output.json b/packages/babel-parser/test/fixtures/es2015/let/let-with-linebreak/output.json new file mode 100644 index 0000000000..53f9ebb810 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2015/let/let-with-linebreak/output.json @@ -0,0 +1,86 @@ +{ + "type": "File", + "start": 0, + "end": 10, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 2, + "column": 6 + } + }, + "program": { + "type": "Program", + "start": 0, + "end": 10, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 2, + "column": 6 + } + }, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "VariableDeclaration", + "start": 0, + "end": 10, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 2, + "column": 6 + } + }, + "declarations": [ + { + "type": "VariableDeclarator", + "start": 8, + "end": 9, + "loc": { + "start": { + "line": 2, + "column": 4 + }, + "end": { + "line": 2, + "column": 5 + } + }, + "id": { + "type": "Identifier", + "start": 8, + "end": 9, + "loc": { + "start": { + "line": 2, + "column": 4 + }, + "end": { + "line": 2, + "column": 5 + }, + "identifierName": "a" + }, + "name": "a" + }, + "init": null + } + ], + "kind": "let" + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/es2015/statements/label-invalid-class/options.json b/packages/babel-parser/test/fixtures/es2015/statements/label-invalid-class/options.json index b283ca722e..91b308200e 100644 --- a/packages/babel-parser/test/fixtures/es2015/statements/label-invalid-class/options.json +++ b/packages/babel-parser/test/fixtures/es2015/statements/label-invalid-class/options.json @@ -1,3 +1,3 @@ { - "throws": "Invalid labeled declaration (1:5)" + "throws": "Unexpected token (1:5)" } diff --git a/packages/babel-parser/test/fixtures/es2015/statements/label-invalid-const/options.json b/packages/babel-parser/test/fixtures/es2015/statements/label-invalid-const/options.json index b283ca722e..91b308200e 100644 --- a/packages/babel-parser/test/fixtures/es2015/statements/label-invalid-const/options.json +++ b/packages/babel-parser/test/fixtures/es2015/statements/label-invalid-const/options.json @@ -1,3 +1,3 @@ { - "throws": "Invalid labeled declaration (1:5)" + "throws": "Unexpected token (1:5)" } diff --git a/packages/babel-parser/test/fixtures/es2015/statements/label-invalid-func-async/options.json b/packages/babel-parser/test/fixtures/es2015/statements/label-invalid-func-async/options.json index b283ca722e..042d7e1962 100644 --- a/packages/babel-parser/test/fixtures/es2015/statements/label-invalid-func-async/options.json +++ b/packages/babel-parser/test/fixtures/es2015/statements/label-invalid-func-async/options.json @@ -1,3 +1,3 @@ { - "throws": "Invalid labeled declaration (1:5)" + "throws": "Function declaration not allowed in this context (1:5)" } diff --git a/packages/babel-parser/test/fixtures/es2015/statements/label-invalid-func-generator/options.json b/packages/babel-parser/test/fixtures/es2015/statements/label-invalid-func-generator/options.json index b283ca722e..91b308200e 100644 --- a/packages/babel-parser/test/fixtures/es2015/statements/label-invalid-func-generator/options.json +++ b/packages/babel-parser/test/fixtures/es2015/statements/label-invalid-func-generator/options.json @@ -1,3 +1,3 @@ { - "throws": "Invalid labeled declaration (1:5)" + "throws": "Unexpected token (1:5)" } diff --git a/packages/babel-parser/test/fixtures/es2015/statements/label-invalid-func-strict/options.json b/packages/babel-parser/test/fixtures/es2015/statements/label-invalid-func-strict/options.json index e54e8652f3..ee5cd5b135 100644 --- a/packages/babel-parser/test/fixtures/es2015/statements/label-invalid-func-strict/options.json +++ b/packages/babel-parser/test/fixtures/es2015/statements/label-invalid-func-strict/options.json @@ -1,3 +1,3 @@ { - "throws": "Invalid labeled declaration (1:35)" + "throws": "Function declaration not allowed in this context (1:35)" } diff --git a/packages/babel-parser/test/fixtures/es2015/statements/label-invalid-let/options.json b/packages/babel-parser/test/fixtures/es2015/statements/label-invalid-let/options.json index b283ca722e..e4ae9a99d0 100644 --- a/packages/babel-parser/test/fixtures/es2015/statements/label-invalid-let/options.json +++ b/packages/babel-parser/test/fixtures/es2015/statements/label-invalid-let/options.json @@ -1,3 +1,3 @@ { - "throws": "Invalid labeled declaration (1:5)" + "throws": "Unexpected token, expected \";\" (1:9)" } diff --git a/packages/babel-parser/test/fixtures/es2015/uncategorised/328/options.json b/packages/babel-parser/test/fixtures/es2015/uncategorised/328/options.json index c958665c03..b98beb8359 100644 --- a/packages/babel-parser/test/fixtures/es2015/uncategorised/328/options.json +++ b/packages/babel-parser/test/fixtures/es2015/uncategorised/328/options.json @@ -1,3 +1,3 @@ { - "throws": "Unexpected token (1:7)" + "throws": "Unexpected token, expected \";\" (1:11)" } diff --git a/packages/babel-parser/test/fixtures/esprima/invalid-syntax/migrated_0141/options.json b/packages/babel-parser/test/fixtures/esprima/invalid-syntax/migrated_0141/options.json index 2a28555f76..a74ca2305e 100644 --- a/packages/babel-parser/test/fixtures/esprima/invalid-syntax/migrated_0141/options.json +++ b/packages/babel-parser/test/fixtures/esprima/invalid-syntax/migrated_0141/options.json @@ -1,3 +1,3 @@ { - "throws": "Unexpected token (1:9)" + "throws": "Unexpected token, expected \";\" (1:13)" } diff --git a/scripts/tests/test262/test262_whitelist.txt b/scripts/tests/test262/test262_whitelist.txt index dc9c15ac6d..5d67387a1e 100644 --- a/scripts/tests/test262/test262_whitelist.txt +++ b/scripts/tests/test262/test262_whitelist.txt @@ -1,183 +1,3 @@ -annexB/language/function-code/if-decl-else-decl-a-func-block-scoping.js(default) -annexB/language/function-code/if-decl-else-decl-a-func-existing-block-fn-no-init.js(default) -annexB/language/function-code/if-decl-else-decl-a-func-existing-block-fn-update.js(default) -annexB/language/function-code/if-decl-else-decl-a-func-existing-fn-no-init.js(default) -annexB/language/function-code/if-decl-else-decl-a-func-existing-fn-update.js(default) -annexB/language/function-code/if-decl-else-decl-a-func-existing-var-no-init.js(default) -annexB/language/function-code/if-decl-else-decl-a-func-existing-var-update.js(default) -annexB/language/function-code/if-decl-else-decl-a-func-init.js(default) -annexB/language/function-code/if-decl-else-decl-a-func-no-skip-try.js(default) -annexB/language/function-code/if-decl-else-decl-a-func-skip-dft-param.js(default) -annexB/language/function-code/if-decl-else-decl-a-func-skip-early-err-block.js(default) -annexB/language/function-code/if-decl-else-decl-a-func-skip-early-err-for-in.js(default) -annexB/language/function-code/if-decl-else-decl-a-func-skip-early-err-for-of.js(default) -annexB/language/function-code/if-decl-else-decl-a-func-skip-early-err-for.js(default) -annexB/language/function-code/if-decl-else-decl-a-func-skip-early-err-switch.js(default) -annexB/language/function-code/if-decl-else-decl-a-func-skip-early-err-try.js(default) -annexB/language/function-code/if-decl-else-decl-a-func-skip-early-err.js(default) -annexB/language/function-code/if-decl-else-decl-a-func-skip-param.js(default) -annexB/language/function-code/if-decl-else-decl-a-func-update.js(default) -annexB/language/function-code/if-decl-else-decl-b-func-block-scoping.js(default) -annexB/language/function-code/if-decl-else-decl-b-func-existing-block-fn-no-init.js(default) -annexB/language/function-code/if-decl-else-decl-b-func-existing-block-fn-update.js(default) -annexB/language/function-code/if-decl-else-decl-b-func-existing-fn-no-init.js(default) -annexB/language/function-code/if-decl-else-decl-b-func-existing-fn-update.js(default) -annexB/language/function-code/if-decl-else-decl-b-func-existing-var-no-init.js(default) -annexB/language/function-code/if-decl-else-decl-b-func-existing-var-update.js(default) -annexB/language/function-code/if-decl-else-decl-b-func-init.js(default) -annexB/language/function-code/if-decl-else-decl-b-func-no-skip-try.js(default) -annexB/language/function-code/if-decl-else-decl-b-func-skip-dft-param.js(default) -annexB/language/function-code/if-decl-else-decl-b-func-skip-early-err-block.js(default) -annexB/language/function-code/if-decl-else-decl-b-func-skip-early-err-for-in.js(default) -annexB/language/function-code/if-decl-else-decl-b-func-skip-early-err-for-of.js(default) -annexB/language/function-code/if-decl-else-decl-b-func-skip-early-err-for.js(default) -annexB/language/function-code/if-decl-else-decl-b-func-skip-early-err-switch.js(default) -annexB/language/function-code/if-decl-else-decl-b-func-skip-early-err-try.js(default) -annexB/language/function-code/if-decl-else-decl-b-func-skip-early-err.js(default) -annexB/language/function-code/if-decl-else-decl-b-func-skip-param.js(default) -annexB/language/function-code/if-decl-else-decl-b-func-update.js(default) -annexB/language/function-code/if-decl-else-stmt-func-block-scoping.js(default) -annexB/language/function-code/if-decl-else-stmt-func-existing-block-fn-no-init.js(default) -annexB/language/function-code/if-decl-else-stmt-func-existing-block-fn-update.js(default) -annexB/language/function-code/if-decl-else-stmt-func-existing-fn-no-init.js(default) -annexB/language/function-code/if-decl-else-stmt-func-existing-fn-update.js(default) -annexB/language/function-code/if-decl-else-stmt-func-existing-var-no-init.js(default) -annexB/language/function-code/if-decl-else-stmt-func-existing-var-update.js(default) -annexB/language/function-code/if-decl-else-stmt-func-init.js(default) -annexB/language/function-code/if-decl-else-stmt-func-no-skip-try.js(default) -annexB/language/function-code/if-decl-else-stmt-func-skip-dft-param.js(default) -annexB/language/function-code/if-decl-else-stmt-func-skip-early-err-block.js(default) -annexB/language/function-code/if-decl-else-stmt-func-skip-early-err-for-in.js(default) -annexB/language/function-code/if-decl-else-stmt-func-skip-early-err-for-of.js(default) -annexB/language/function-code/if-decl-else-stmt-func-skip-early-err-for.js(default) -annexB/language/function-code/if-decl-else-stmt-func-skip-early-err-switch.js(default) -annexB/language/function-code/if-decl-else-stmt-func-skip-early-err-try.js(default) -annexB/language/function-code/if-decl-else-stmt-func-skip-early-err.js(default) -annexB/language/function-code/if-decl-else-stmt-func-skip-param.js(default) -annexB/language/function-code/if-decl-else-stmt-func-update.js(default) -annexB/language/function-code/if-decl-no-else-func-block-scoping.js(default) -annexB/language/function-code/if-decl-no-else-func-existing-block-fn-no-init.js(default) -annexB/language/function-code/if-decl-no-else-func-existing-block-fn-update.js(default) -annexB/language/function-code/if-decl-no-else-func-existing-fn-no-init.js(default) -annexB/language/function-code/if-decl-no-else-func-existing-fn-update.js(default) -annexB/language/function-code/if-decl-no-else-func-existing-var-no-init.js(default) -annexB/language/function-code/if-decl-no-else-func-existing-var-update.js(default) -annexB/language/function-code/if-decl-no-else-func-init.js(default) -annexB/language/function-code/if-decl-no-else-func-no-skip-try.js(default) -annexB/language/function-code/if-decl-no-else-func-skip-dft-param.js(default) -annexB/language/function-code/if-decl-no-else-func-skip-early-err-block.js(default) -annexB/language/function-code/if-decl-no-else-func-skip-early-err-for-in.js(default) -annexB/language/function-code/if-decl-no-else-func-skip-early-err-for-of.js(default) -annexB/language/function-code/if-decl-no-else-func-skip-early-err-for.js(default) -annexB/language/function-code/if-decl-no-else-func-skip-early-err-switch.js(default) -annexB/language/function-code/if-decl-no-else-func-skip-early-err-try.js(default) -annexB/language/function-code/if-decl-no-else-func-skip-early-err.js(default) -annexB/language/function-code/if-decl-no-else-func-skip-param.js(default) -annexB/language/function-code/if-decl-no-else-func-update.js(default) -annexB/language/function-code/if-stmt-else-decl-func-block-scoping.js(default) -annexB/language/function-code/if-stmt-else-decl-func-existing-block-fn-no-init.js(default) -annexB/language/function-code/if-stmt-else-decl-func-existing-block-fn-update.js(default) -annexB/language/function-code/if-stmt-else-decl-func-existing-fn-no-init.js(default) -annexB/language/function-code/if-stmt-else-decl-func-existing-fn-update.js(default) -annexB/language/function-code/if-stmt-else-decl-func-existing-var-no-init.js(default) -annexB/language/function-code/if-stmt-else-decl-func-existing-var-update.js(default) -annexB/language/function-code/if-stmt-else-decl-func-init.js(default) -annexB/language/function-code/if-stmt-else-decl-func-no-skip-try.js(default) -annexB/language/function-code/if-stmt-else-decl-func-skip-dft-param.js(default) -annexB/language/function-code/if-stmt-else-decl-func-skip-early-err-block.js(default) -annexB/language/function-code/if-stmt-else-decl-func-skip-early-err-for-in.js(default) -annexB/language/function-code/if-stmt-else-decl-func-skip-early-err-for-of.js(default) -annexB/language/function-code/if-stmt-else-decl-func-skip-early-err-for.js(default) -annexB/language/function-code/if-stmt-else-decl-func-skip-early-err-switch.js(default) -annexB/language/function-code/if-stmt-else-decl-func-skip-early-err-try.js(default) -annexB/language/function-code/if-stmt-else-decl-func-skip-early-err.js(default) -annexB/language/function-code/if-stmt-else-decl-func-skip-param.js(default) -annexB/language/function-code/if-stmt-else-decl-func-update.js(default) -annexB/language/global-code/if-decl-else-decl-a-global-block-scoping.js(default) -annexB/language/global-code/if-decl-else-decl-a-global-existing-block-fn-no-init.js(default) -annexB/language/global-code/if-decl-else-decl-a-global-existing-block-fn-update.js(default) -annexB/language/global-code/if-decl-else-decl-a-global-existing-fn-no-init.js(default) -annexB/language/global-code/if-decl-else-decl-a-global-existing-fn-update.js(default) -annexB/language/global-code/if-decl-else-decl-a-global-existing-var-no-init.js(default) -annexB/language/global-code/if-decl-else-decl-a-global-existing-var-update.js(default) -annexB/language/global-code/if-decl-else-decl-a-global-init.js(default) -annexB/language/global-code/if-decl-else-decl-a-global-no-skip-try.js(default) -annexB/language/global-code/if-decl-else-decl-a-global-skip-early-err-block.js(default) -annexB/language/global-code/if-decl-else-decl-a-global-skip-early-err-for-in.js(default) -annexB/language/global-code/if-decl-else-decl-a-global-skip-early-err-for-of.js(default) -annexB/language/global-code/if-decl-else-decl-a-global-skip-early-err-for.js(default) -annexB/language/global-code/if-decl-else-decl-a-global-skip-early-err-switch.js(default) -annexB/language/global-code/if-decl-else-decl-a-global-skip-early-err-try.js(default) -annexB/language/global-code/if-decl-else-decl-a-global-skip-early-err.js(default) -annexB/language/global-code/if-decl-else-decl-a-global-update.js(default) -annexB/language/global-code/if-decl-else-decl-b-global-block-scoping.js(default) -annexB/language/global-code/if-decl-else-decl-b-global-existing-block-fn-no-init.js(default) -annexB/language/global-code/if-decl-else-decl-b-global-existing-block-fn-update.js(default) -annexB/language/global-code/if-decl-else-decl-b-global-existing-fn-no-init.js(default) -annexB/language/global-code/if-decl-else-decl-b-global-existing-fn-update.js(default) -annexB/language/global-code/if-decl-else-decl-b-global-existing-var-no-init.js(default) -annexB/language/global-code/if-decl-else-decl-b-global-existing-var-update.js(default) -annexB/language/global-code/if-decl-else-decl-b-global-init.js(default) -annexB/language/global-code/if-decl-else-decl-b-global-no-skip-try.js(default) -annexB/language/global-code/if-decl-else-decl-b-global-skip-early-err-block.js(default) -annexB/language/global-code/if-decl-else-decl-b-global-skip-early-err-for-in.js(default) -annexB/language/global-code/if-decl-else-decl-b-global-skip-early-err-for-of.js(default) -annexB/language/global-code/if-decl-else-decl-b-global-skip-early-err-for.js(default) -annexB/language/global-code/if-decl-else-decl-b-global-skip-early-err-switch.js(default) -annexB/language/global-code/if-decl-else-decl-b-global-skip-early-err-try.js(default) -annexB/language/global-code/if-decl-else-decl-b-global-skip-early-err.js(default) -annexB/language/global-code/if-decl-else-decl-b-global-update.js(default) -annexB/language/global-code/if-decl-else-stmt-global-block-scoping.js(default) -annexB/language/global-code/if-decl-else-stmt-global-existing-block-fn-no-init.js(default) -annexB/language/global-code/if-decl-else-stmt-global-existing-block-fn-update.js(default) -annexB/language/global-code/if-decl-else-stmt-global-existing-fn-no-init.js(default) -annexB/language/global-code/if-decl-else-stmt-global-existing-fn-update.js(default) -annexB/language/global-code/if-decl-else-stmt-global-existing-var-no-init.js(default) -annexB/language/global-code/if-decl-else-stmt-global-existing-var-update.js(default) -annexB/language/global-code/if-decl-else-stmt-global-init.js(default) -annexB/language/global-code/if-decl-else-stmt-global-no-skip-try.js(default) -annexB/language/global-code/if-decl-else-stmt-global-skip-early-err-block.js(default) -annexB/language/global-code/if-decl-else-stmt-global-skip-early-err-for-in.js(default) -annexB/language/global-code/if-decl-else-stmt-global-skip-early-err-for-of.js(default) -annexB/language/global-code/if-decl-else-stmt-global-skip-early-err-for.js(default) -annexB/language/global-code/if-decl-else-stmt-global-skip-early-err-switch.js(default) -annexB/language/global-code/if-decl-else-stmt-global-skip-early-err-try.js(default) -annexB/language/global-code/if-decl-else-stmt-global-skip-early-err.js(default) -annexB/language/global-code/if-decl-else-stmt-global-update.js(default) -annexB/language/global-code/if-decl-no-else-global-block-scoping.js(default) -annexB/language/global-code/if-decl-no-else-global-existing-block-fn-no-init.js(default) -annexB/language/global-code/if-decl-no-else-global-existing-block-fn-update.js(default) -annexB/language/global-code/if-decl-no-else-global-existing-fn-no-init.js(default) -annexB/language/global-code/if-decl-no-else-global-existing-fn-update.js(default) -annexB/language/global-code/if-decl-no-else-global-existing-var-no-init.js(default) -annexB/language/global-code/if-decl-no-else-global-existing-var-update.js(default) -annexB/language/global-code/if-decl-no-else-global-init.js(default) -annexB/language/global-code/if-decl-no-else-global-no-skip-try.js(default) -annexB/language/global-code/if-decl-no-else-global-skip-early-err-block.js(default) -annexB/language/global-code/if-decl-no-else-global-skip-early-err-for-in.js(default) -annexB/language/global-code/if-decl-no-else-global-skip-early-err-for-of.js(default) -annexB/language/global-code/if-decl-no-else-global-skip-early-err-for.js(default) -annexB/language/global-code/if-decl-no-else-global-skip-early-err-switch.js(default) -annexB/language/global-code/if-decl-no-else-global-skip-early-err-try.js(default) -annexB/language/global-code/if-decl-no-else-global-skip-early-err.js(default) -annexB/language/global-code/if-decl-no-else-global-update.js(default) -annexB/language/global-code/if-stmt-else-decl-global-block-scoping.js(default) -annexB/language/global-code/if-stmt-else-decl-global-existing-block-fn-no-init.js(default) -annexB/language/global-code/if-stmt-else-decl-global-existing-block-fn-update.js(default) -annexB/language/global-code/if-stmt-else-decl-global-existing-fn-no-init.js(default) -annexB/language/global-code/if-stmt-else-decl-global-existing-fn-update.js(default) -annexB/language/global-code/if-stmt-else-decl-global-existing-var-no-init.js(default) -annexB/language/global-code/if-stmt-else-decl-global-existing-var-update.js(default) -annexB/language/global-code/if-stmt-else-decl-global-init.js(default) -annexB/language/global-code/if-stmt-else-decl-global-no-skip-try.js(default) -annexB/language/global-code/if-stmt-else-decl-global-skip-early-err-block.js(default) -annexB/language/global-code/if-stmt-else-decl-global-skip-early-err-for-in.js(default) -annexB/language/global-code/if-stmt-else-decl-global-skip-early-err-for-of.js(default) -annexB/language/global-code/if-stmt-else-decl-global-skip-early-err-for.js(default) -annexB/language/global-code/if-stmt-else-decl-global-skip-early-err-switch.js(default) -annexB/language/global-code/if-stmt-else-decl-global-skip-early-err-try.js(default) -annexB/language/global-code/if-stmt-else-decl-global-skip-early-err.js(default) -annexB/language/global-code/if-stmt-else-decl-global-update.js(default) annexB/language/statements/for-in/bare-initializer.js(default) annexB/language/statements/for-in/bare-initializer.js(strict mode) built-ins/RegExp/property-escapes/binary-property-with-value-ASCII_-_F-negated.js(default) @@ -1165,7 +985,6 @@ language/statements/for/head-let-bound-names-in-stmt.js(default) language/statements/for/head-let-bound-names-in-stmt.js(strict mode) language/statements/function/dflt-params-duplicates.js(default) language/statements/generators/dflt-params-duplicates.js(default) -language/statements/labeled/let-identifier-with-newline.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(strict mode)