Fix some cases of invalid labeled declarations

This commit is contained in:
Brian Ng 2017-08-24 19:00:52 -05:00
parent 5d83e2692f
commit 5e60ad6688
No known key found for this signature in database
GPG Key ID: 3F2380E1E1508CA9
18 changed files with 274 additions and 36 deletions

View File

@ -430,22 +430,16 @@ language/statements/class/syntax/early-errors/class-definition-evaluation-script
language/statements/class/syntax/escaped-static.js(default)
language/statements/class/syntax/escaped-static.js(strict mode)
language/statements/const/redeclaration-error-from-within-strict-mode-function-const.js(default)
language/statements/const/syntax/with-initializer-label-statement.js(default)
language/statements/const/syntax/with-initializer-label-statement.js(strict mode)
language/statements/do-while/decl-async-fun.js(default)
language/statements/do-while/decl-async-fun.js(strict mode)
language/statements/do-while/labelled-fn-stmt.js(default)
language/statements/do-while/labelled-fn-stmt.js(strict mode)
language/statements/for/decl-async-fun.js(default)
language/statements/for/decl-async-fun.js(strict mode)
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/labelled-fn-stmt-expr.js(default)
language/statements/for/labelled-fn-stmt-expr.js(strict mode)
language/statements/for/labelled-fn-stmt-let.js(default)
language/statements/for/labelled-fn-stmt-let.js(strict mode)
language/statements/for/labelled-fn-stmt-var.js(default)
language/statements/for/labelled-fn-stmt-var.js(strict mode)
language/statements/for-in/decl-async-fun.js(default)
language/statements/for-in/decl-async-fun.js(strict mode)
language/statements/for-in/dstr-array-rest-before-elision.js(default)
@ -461,13 +455,9 @@ language/statements/for-in/head-let-bound-names-dup.js(strict mode)
language/statements/for-in/head-let-bound-names-in-stmt.js(default)
language/statements/for-in/head-let-bound-names-in-stmt.js(strict mode)
language/statements/for-in/labelled-fn-stmt-const.js(default)
language/statements/for-in/labelled-fn-stmt-const.js(strict mode)
language/statements/for-in/labelled-fn-stmt-let.js(default)
language/statements/for-in/labelled-fn-stmt-let.js(strict mode)
language/statements/for-in/labelled-fn-stmt-lhs.js(default)
language/statements/for-in/labelled-fn-stmt-lhs.js(strict mode)
language/statements/for-in/labelled-fn-stmt-var.js(default)
language/statements/for-in/labelled-fn-stmt-var.js(strict mode)
language/statements/for-of/decl-async-fun.js(default)
language/statements/for-of/decl-async-fun.js(strict mode)
language/statements/for-of/dstr-array-rest-before-elision.js(default)
@ -491,13 +481,9 @@ language/statements/for-of/head-let-bound-names-in-stmt.js(strict mode)
language/statements/for-of/head-var-no-expr.js(default)
language/statements/for-of/head-var-no-expr.js(strict mode)
language/statements/for-of/labelled-fn-stmt-const.js(default)
language/statements/for-of/labelled-fn-stmt-const.js(strict mode)
language/statements/for-of/labelled-fn-stmt-let.js(default)
language/statements/for-of/labelled-fn-stmt-let.js(strict mode)
language/statements/for-of/labelled-fn-stmt-lhs.js(default)
language/statements/for-of/labelled-fn-stmt-lhs.js(strict mode)
language/statements/for-of/labelled-fn-stmt-var.js(default)
language/statements/for-of/labelled-fn-stmt-var.js(strict mode)
language/statements/function/dflt-params-duplicates.js(default)
language/statements/function/param-dflt-yield-strict.js(strict mode)
language/statements/generators/dflt-params-duplicates.js(default)
@ -515,32 +501,13 @@ language/statements/if/if-async-fun-no-else.js(strict mode)
language/statements/if/if-stmt-else-async-fun.js(default)
language/statements/if/if-stmt-else-async-fun.js(strict mode)
language/statements/if/labelled-fn-stmt-first.js(default)
language/statements/if/labelled-fn-stmt-first.js(strict mode)
language/statements/if/labelled-fn-stmt-lone.js(default)
language/statements/if/labelled-fn-stmt-lone.js(strict mode)
language/statements/if/labelled-fn-stmt-second.js(default)
language/statements/if/labelled-fn-stmt-second.js(strict mode)
language/statements/labeled/decl-async-function.js(default)
language/statements/labeled/decl-async-function.js(strict mode)
language/statements/labeled/decl-cls.js(default)
language/statements/labeled/decl-cls.js(strict mode)
language/statements/labeled/decl-const.js(default)
language/statements/labeled/decl-const.js(strict mode)
language/statements/labeled/decl-fun-strict.js(strict mode)
language/statements/labeled/decl-gen.js(default)
language/statements/labeled/decl-gen.js(strict mode)
language/statements/labeled/decl-let.js(default)
language/statements/labeled/decl-let.js(strict mode)
language/statements/labeled/let-array-with-newline.js(default)
language/statements/let/redeclaration-error-from-within-strict-mode-function.js(default)
language/statements/let/syntax/attempt-to-redeclare-let-binding-with-function-declaration.js(default)
language/statements/let/syntax/attempt-to-redeclare-let-binding-with-function-declaration.js(strict mode)
language/statements/let/syntax/attempt-to-redeclare-let-binding-with-var.js(default)
language/statements/let/syntax/attempt-to-redeclare-let-binding-with-var.js(strict mode)
language/statements/let/syntax/with-initialisers-in-statement-positions-label-statement.js(default)
language/statements/let/syntax/with-initialisers-in-statement-positions-label-statement.js(strict mode)
language/statements/let/syntax/without-initialisers-in-statement-positions-label-statement.js(default)
language/statements/let/syntax/without-initialisers-in-statement-positions-label-statement.js(strict mode)
language/statements/switch/syntax/redeclaration/async-function-declaration-attempt-to-redeclare-with-async-function-declaration.js(default)
language/statements/switch/syntax/redeclaration/async-function-declaration-attempt-to-redeclare-with-async-function-declaration.js(strict mode)
language/statements/switch/syntax/redeclaration/async-function-declaration-attempt-to-redeclare-with-class-declaration.js(default)
@ -643,7 +610,6 @@ language/statements/try/early-catch-var.js(strict mode)
language/statements/while/decl-async-fun.js(default)
language/statements/while/decl-async-fun.js(strict mode)
language/statements/while/labelled-fn-stmt.js(default)
language/statements/while/labelled-fn-stmt.js(strict mode)
language/statements/with/decl-async-fun.js(default)
language/statements/with/labelled-fn-stmt.js(default)
language/white-space/mongolian-vowel-separator.js(default)
@ -1012,8 +978,6 @@ language/statements/if/if-async-gen-no-else.js(default)
language/statements/if/if-async-gen-no-else.js(strict mode)
language/statements/if/if-stmt-else-async-gen.js(default)
language/statements/if/if-stmt-else-async-gen.js(strict mode)
language/statements/labeled/decl-async-generator.js(default)
language/statements/labeled/decl-async-generator.js(strict mode)
language/statements/switch/syntax/redeclaration/async-function-declaration-attempt-to-redeclare-with-async-generator-declaration.js(default)
language/statements/switch/syntax/redeclaration/async-function-declaration-attempt-to-redeclare-with-async-generator-declaration.js(strict mode)
language/statements/switch/syntax/redeclaration/async-generator-declaration-attempt-to-redeclare-with-async-function-declaration.js(default)
@ -1532,3 +1496,5 @@ language/statements/try/optional-catch-binding-throws.js(default)
language/statements/try/optional-catch-binding-throws.js(strict mode)
language/statements/try/optional-catch-binding.js(default)
language/statements/try/optional-catch-binding.js(strict mode)
language/statements/labeled/let-identifier-with-newline.js(default)

View File

@ -576,6 +576,16 @@ export default class StatementParser extends ExpressionParser {
statementStart: this.state.start,
});
node.body = this.parseStatement(true);
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");
}
this.state.labels.pop();
node.label = expr;
return this.finishNode(node, "LabeledStatement");

View File

@ -0,0 +1 @@
foo: class X {}

View File

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

View File

@ -0,0 +1 @@
foo: const bar = null;

View File

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

View File

@ -0,0 +1 @@
foo: async function bar() {}

View File

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

View File

@ -0,0 +1 @@
foo: function* bar() {}

View File

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

View File

@ -0,0 +1 @@
function foo() {"use strict"; bar: function baz() {}}

View File

@ -0,0 +1,3 @@
{
"throws": "Invalid labeled declaration (1:35)"
}

View File

@ -0,0 +1 @@
foo: let bar;

View File

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

View File

@ -0,0 +1 @@
foo: function bar() {}

View File

@ -0,0 +1,119 @@
{
"type": "File",
"start": 0,
"end": 22,
"loc": {
"start": {
"line": 1,
"column": 0
},
"end": {
"line": 1,
"column": 22
}
},
"program": {
"type": "Program",
"start": 0,
"end": 22,
"loc": {
"start": {
"line": 1,
"column": 0
},
"end": {
"line": 1,
"column": 22
}
},
"sourceType": "script",
"body": [
{
"type": "LabeledStatement",
"start": 0,
"end": 22,
"loc": {
"start": {
"line": 1,
"column": 0
},
"end": {
"line": 1,
"column": 22
}
},
"body": {
"type": "FunctionDeclaration",
"start": 5,
"end": 22,
"loc": {
"start": {
"line": 1,
"column": 5
},
"end": {
"line": 1,
"column": 22
}
},
"id": {
"type": "Identifier",
"start": 14,
"end": 17,
"loc": {
"start": {
"line": 1,
"column": 14
},
"end": {
"line": 1,
"column": 17
},
"identifierName": "bar"
},
"name": "bar"
},
"generator": false,
"expression": false,
"async": false,
"params": [],
"body": {
"type": "BlockStatement",
"start": 20,
"end": 22,
"loc": {
"start": {
"line": 1,
"column": 20
},
"end": {
"line": 1,
"column": 22
}
},
"body": [],
"directives": []
}
},
"label": {
"type": "Identifier",
"start": 0,
"end": 3,
"loc": {
"start": {
"line": 1,
"column": 0
},
"end": {
"line": 1,
"column": 3
},
"identifierName": "foo"
},
"name": "foo"
}
}
],
"directives": []
}
}

View File

@ -0,0 +1 @@
foo: var bar;

View File

@ -0,0 +1,117 @@
{
"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",
"body": [
{
"type": "LabeledStatement",
"start": 0,
"end": 13,
"loc": {
"start": {
"line": 1,
"column": 0
},
"end": {
"line": 1,
"column": 13
}
},
"body": {
"type": "VariableDeclaration",
"start": 5,
"end": 13,
"loc": {
"start": {
"line": 1,
"column": 5
},
"end": {
"line": 1,
"column": 13
}
},
"declarations": [
{
"type": "VariableDeclarator",
"start": 9,
"end": 12,
"loc": {
"start": {
"line": 1,
"column": 9
},
"end": {
"line": 1,
"column": 12
}
},
"id": {
"type": "Identifier",
"start": 9,
"end": 12,
"loc": {
"start": {
"line": 1,
"column": 9
},
"end": {
"line": 1,
"column": 12
},
"identifierName": "bar"
},
"name": "bar"
},
"init": null
}
],
"kind": "var"
},
"label": {
"type": "Identifier",
"start": 0,
"end": 3,
"loc": {
"start": {
"line": 1,
"column": 0
},
"end": {
"line": 1,
"column": 3
},
"identifierName": "foo"
},
"name": "foo"
}
}
],
"directives": []
}
}