Fix regression with let (#9477)

* Fix corner cases with let

* Handle generators correctly

* Fix flow plugin

* Fix typescript plugin
This commit is contained in:
Daniel Tschinder 2019-02-08 13:36:37 -08:00 committed by GitHub
parent 7943a48cc3
commit 2817844e89
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
20 changed files with 728 additions and 242 deletions

View File

@ -76,7 +76,7 @@ export default class StatementParser extends ExpressionParser {
return this.finishNode(node, "InterpreterDirective"); return this.finishNode(node, "InterpreterDirective");
} }
isLet(declaration?: boolean): boolean { isLet(context: ?string): boolean {
if (!this.isContextual("let")) { if (!this.isContextual("let")) {
return false; return false;
} }
@ -85,20 +85,16 @@ export default class StatementParser extends ExpressionParser {
// $FlowIgnore // $FlowIgnore
const next = this.state.pos + skip[0].length; const next = this.state.pos + skip[0].length;
const nextCh = this.state.input.charCodeAt(next); const nextCh = this.state.input.charCodeAt(next);
if ( // For ambiguous cases, determine if a LexicalDeclaration (or only a
(nextCh === charCodes.leftCurlyBrace && // Statement) is allowed here. If context is not empty then only a Statement
!lineBreak.test(this.state.input.slice(this.state.end, next))) || // is allowed. However, `let [` is an explicit negative lookahead for
nextCh === charCodes.leftSquareBracket // ExpressionStatement, so special-case it first.
) { if (nextCh === charCodes.leftSquareBracket) return true;
return true; if (context) return false;
}
if (nextCh === charCodes.leftCurlyBrace) return true;
if (isIdentifierStart(nextCh)) { if (isIdentifierStart(nextCh)) {
if (
!declaration &&
lineBreak.test(this.state.input.slice(this.state.end, next))
) {
return false;
}
let pos = next + 1; let pos = next + 1;
while (isIdentifierChar(this.state.input.charCodeAt(pos))) { while (isIdentifierChar(this.state.input.charCodeAt(pos))) {
++pos; ++pos;
@ -116,19 +112,19 @@ export default class StatementParser extends ExpressionParser {
// `if (foo) /blah/.exec(foo)`, where looking at the previous token // `if (foo) /blah/.exec(foo)`, where looking at the previous token
// does not help. // does not help.
parseStatement(declaration: boolean, topLevel?: boolean): N.Statement { parseStatement(context: ?string, topLevel?: boolean): N.Statement {
if (this.match(tt.at)) { if (this.match(tt.at)) {
this.parseDecorators(true); 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; let starttype = this.state.type;
const node = this.startNode(); const node = this.startNode();
let kind; let kind;
if (this.isLet(declaration)) { if (this.isLet(context)) {
starttype = tt._var; starttype = tt._var;
kind = "let"; kind = "let";
} }
@ -148,18 +144,28 @@ export default class StatementParser extends ExpressionParser {
return this.parseDoStatement(node); return this.parseDoStatement(node);
case tt._for: case tt._for:
return this.parseForStatement(node); return this.parseForStatement(node);
case tt._function: case tt._function: {
if (this.lookahead().type === tt.dot) break; if (this.lookahead().type === tt.dot) break;
if (!declaration) { if (
context &&
(this.state.strict || (context !== "if" && context !== "label"))
) {
this.raise( this.raise(
this.state.start, this.state.start,
"Function declaration not allowed in this context", "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: case tt._class:
if (!declaration) this.unexpected(); if (context) this.unexpected();
return this.parseClass(node, true); return this.parseClass(node, true);
case tt._if: case tt._if:
@ -176,7 +182,7 @@ export default class StatementParser extends ExpressionParser {
case tt._const: case tt._const:
case tt._var: case tt._var:
kind = kind || this.state.value; kind = kind || this.state.value;
if (!declaration && kind !== "var") this.unexpected(); if (context && kind !== "var") this.unexpected();
return this.parseVarStatement(node, kind); return this.parseVarStatement(node, kind);
case tt._while: case tt._while:
@ -237,7 +243,7 @@ export default class StatementParser extends ExpressionParser {
const state = this.state.clone(); const state = this.state.clone();
this.next(); this.next();
if (this.match(tt._function) && !this.canInsertSemicolon()) { if (this.match(tt._function) && !this.canInsertSemicolon()) {
if (!declaration) { if (context) {
this.raise( this.raise(
this.state.lastTokStart, this.state.lastTokStart,
"Function declaration not allowed in this context", "Function declaration not allowed in this context",
@ -264,7 +270,7 @@ export default class StatementParser extends ExpressionParser {
expr.type === "Identifier" && expr.type === "Identifier" &&
this.eat(tt.colon) this.eat(tt.colon)
) { ) {
return this.parseLabeledStatement(node, maybeName, expr, declaration); return this.parseLabeledStatement(node, maybeName, expr, context);
} else { } else {
return this.parseExpressionStatement(node, expr); return this.parseExpressionStatement(node, expr);
} }
@ -430,7 +436,7 @@ export default class StatementParser extends ExpressionParser {
// outside of the loop body. // outside of the loop body.
this.withTopicForbiddingContext(() => this.withTopicForbiddingContext(() =>
// Parse the loop body's body. // Parse the loop body's body.
this.parseStatement(false), this.parseStatement("do"),
); );
this.state.labels.pop(); this.state.labels.pop();
@ -526,8 +532,8 @@ export default class StatementParser extends ExpressionParser {
parseIfStatement(node: N.IfStatement): N.IfStatement { parseIfStatement(node: N.IfStatement): N.IfStatement {
this.next(); this.next();
node.test = this.parseParenExpression(); node.test = this.parseParenExpression();
node.consequent = this.parseStatement(false); node.consequent = this.parseStatement("if");
node.alternate = this.eat(tt._else) ? this.parseStatement(false) : null; node.alternate = this.eat(tt._else) ? this.parseStatement("if") : null;
return this.finishNode(node, "IfStatement"); return this.finishNode(node, "IfStatement");
} }
@ -583,7 +589,7 @@ export default class StatementParser extends ExpressionParser {
this.expect(tt.colon); this.expect(tt.colon);
} else { } else {
if (cur) { if (cur) {
cur.consequent.push(this.parseStatement(true)); cur.consequent.push(this.parseStatement(null));
} else { } else {
this.unexpected(); this.unexpected();
} }
@ -672,7 +678,7 @@ export default class StatementParser extends ExpressionParser {
// They are permitted in test expressions, outside of the loop body. // They are permitted in test expressions, outside of the loop body.
this.withTopicForbiddingContext(() => this.withTopicForbiddingContext(() =>
// Parse loop body. // Parse loop body.
this.parseStatement(false), this.parseStatement("while"),
); );
this.state.labels.pop(); this.state.labels.pop();
@ -694,7 +700,7 @@ export default class StatementParser extends ExpressionParser {
// part of the outer context, outside of the function body. // part of the outer context, outside of the function body.
this.withTopicForbiddingContext(() => this.withTopicForbiddingContext(() =>
// Parse the statement body. // Parse the statement body.
this.parseStatement(false), this.parseStatement("with"),
); );
return this.finishNode(node, "WithStatement"); return this.finishNode(node, "WithStatement");
@ -709,7 +715,7 @@ export default class StatementParser extends ExpressionParser {
node: N.LabeledStatement, node: N.LabeledStatement,
maybeName: string, maybeName: string,
expr: N.Identifier, expr: N.Identifier,
declaration: boolean, context: ?string,
): N.LabeledStatement { ): N.LabeledStatement {
for (const label of this.state.labels) { for (const label of this.state.labels) {
if (label.name === maybeName) { if (label.name === maybeName) {
@ -737,16 +743,13 @@ export default class StatementParser extends ExpressionParser {
kind: kind, kind: kind,
statementStart: this.state.start, statementStart: this.state.start,
}); });
node.body = this.parseStatement(declaration); node.body = this.parseStatement(
context
if ( ? context.indexOf("label") === -1
node.body.type === "ClassDeclaration" || ? context + "label"
(node.body.type === "VariableDeclaration" && node.body.kind !== "var") || : context
(node.body.type === "FunctionDeclaration" && : "label",
(this.state.strict || node.body.generator || node.body.async)) );
) {
this.raise(node.body.start, "Invalid labeled declaration");
}
this.state.labels.pop(); this.state.labels.pop();
node.label = expr; node.label = expr;
@ -813,7 +816,7 @@ export default class StatementParser extends ExpressionParser {
octalPosition = this.state.octalPosition; octalPosition = this.state.octalPosition;
} }
const stmt = this.parseStatement(true, topLevel); const stmt = this.parseStatement(null, topLevel);
if (directives && !parsedNonDirective && this.isValidDirective(stmt)) { if (directives && !parsedNonDirective && this.isValidDirective(stmt)) {
const directive = this.stmtToDirective(stmt); const directive = this.stmtToDirective(stmt);
@ -861,7 +864,7 @@ export default class StatementParser extends ExpressionParser {
// outside of the loop body. // outside of the loop body.
this.withTopicForbiddingContext(() => this.withTopicForbiddingContext(() =>
// Parse the loop body. // Parse the loop body.
this.parseStatement(false), this.parseStatement("for"),
); );
this.state.labels.pop(); 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. // They are permitted in test expressions, outside of the loop body.
this.withTopicForbiddingContext(() => this.withTopicForbiddingContext(() =>
// Parse loop body. // Parse loop body.
this.parseStatement(false), this.parseStatement("for"),
); );
this.state.labels.pop(); this.state.labels.pop();
@ -1700,7 +1703,7 @@ export default class StatementParser extends ExpressionParser {
// eslint-disable-next-line no-unused-vars // eslint-disable-next-line no-unused-vars
parseExportDeclaration(node: N.ExportNamedDeclaration): ?N.Declaration { parseExportDeclaration(node: N.ExportNamedDeclaration): ?N.Declaration {
return this.parseStatement(true); return this.parseStatement(null);
} }
isExportDefaultSpecifier(): boolean { isExportDefaultSpecifier(): boolean {

View File

@ -1566,7 +1566,7 @@ export default (superClass: Class<Parser>): Class<Parser> =>
} }
// interfaces // 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 // strict mode handling of `interface` since it's a reserved word
if ( if (
this.state.strict && this.state.strict &&
@ -1577,7 +1577,7 @@ export default (superClass: Class<Parser>): Class<Parser> =>
this.next(); this.next();
return this.flowParseInterface(node); return this.flowParseInterface(node);
} else { } 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. // We will parse a flow pragma in any comment before the first statement.
if (this.flowPragma === undefined && !this.isValidDirective(stmt)) { if (this.flowPragma === undefined && !this.isValidDirective(stmt)) {
this.flowPragma = null; this.flowPragma = null;

View File

@ -1699,10 +1699,7 @@ export default (superClass: Class<Parser>): Class<Parser> =>
return super.parseExportDefaultExpression(); return super.parseExportDefaultExpression();
} }
parseStatementContent( parseStatementContent(context: ?string, topLevel: ?boolean): N.Statement {
declaration: boolean,
topLevel: ?boolean,
): N.Statement {
if (this.state.type === tt._const) { if (this.state.type === tt._const) {
const ahead = this.lookahead(); const ahead = this.lookahead();
if (ahead.type === tt.name && ahead.value === "enum") { if (ahead.type === tt.name && ahead.value === "enum") {
@ -1712,7 +1709,7 @@ export default (superClass: Class<Parser>): Class<Parser> =>
return this.tsParseEnumDeclaration(node, /* isConst */ true); return this.tsParseEnumDeclaration(node, /* isConst */ true);
} }
} }
return super.parseStatementContent(declaration, topLevel); return super.parseStatementContent(context, topLevel);
} }
parseAccessModifier(): ?N.Accessibility { parseAccessModifier(): ?N.Accessibility {

View File

@ -0,0 +1,4 @@
if (false) {
L: let // ASI
{}
}

View File

@ -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
}
}
}
]
}

View File

@ -0,0 +1,2 @@
let
[a] = [1];

View File

@ -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": []
}
}

View File

@ -0,0 +1,2 @@
let
{ a } = { a: 1 };

View File

@ -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": []
}
}

View File

@ -0,0 +1,2 @@
let
a;

View File

@ -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": []
}
}

View File

@ -1,3 +1,3 @@
{ {
"throws": "Invalid labeled declaration (1:5)" "throws": "Unexpected token (1:5)"
} }

View File

@ -1,3 +1,3 @@
{ {
"throws": "Invalid labeled declaration (1:5)" "throws": "Unexpected token (1:5)"
} }

View File

@ -1,3 +1,3 @@
{ {
"throws": "Invalid labeled declaration (1:5)" "throws": "Function declaration not allowed in this context (1:5)"
} }

View File

@ -1,3 +1,3 @@
{ {
"throws": "Invalid labeled declaration (1:5)" "throws": "Unexpected token (1:5)"
} }

View File

@ -1,3 +1,3 @@
{ {
"throws": "Invalid labeled declaration (1:35)" "throws": "Function declaration not allowed in this context (1:35)"
} }

View File

@ -1,3 +1,3 @@
{ {
"throws": "Invalid labeled declaration (1:5)" "throws": "Unexpected token, expected \";\" (1:9)"
} }

View File

@ -1,3 +1,3 @@
{ {
"throws": "Unexpected token (1:7)" "throws": "Unexpected token, expected \";\" (1:11)"
} }

View File

@ -1,3 +1,3 @@
{ {
"throws": "Unexpected token (1:9)" "throws": "Unexpected token, expected \";\" (1:13)"
} }

View File

@ -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(default)
annexB/language/statements/for-in/bare-initializer.js(strict mode) annexB/language/statements/for-in/bare-initializer.js(strict mode)
built-ins/RegExp/property-escapes/binary-property-with-value-ASCII_-_F-negated.js(default) 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/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/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)