diff --git a/packages/babel-parser/src/parser/statement.js b/packages/babel-parser/src/parser/statement.js index a3e17975d1..a9c903e525 100644 --- a/packages/babel-parser/src/parser/statement.js +++ b/packages/babel-parser/src/parser/statement.js @@ -1258,20 +1258,6 @@ export default class StatementParser extends ExpressionParser { return this.finishNode(classBody, "ClassBody"); } - // Check grammar production: - // IdentifierName *_opt ClassElementName - // It is used in `parsePropertyDefinition` to detect AsyncMethod and Accessors - maybeClassModifier(prop: N.ObjectProperty): boolean { - return ( - !prop.computed && - prop.key.type === "Identifier" && - (this.isLiteralPropertyName() || - this.match(tt.bracketL) || - this.match(tt.star) || - this.match(tt.hash)) - ); - } - // returns true if the current identifier is a method/field name, // false if it is a modifier parseClassMemberFromModifier( @@ -1611,11 +1597,6 @@ export default class StatementParser extends ExpressionParser { methodOrProp: N.ClassMethod | N.ClassProperty, ): void {} - // Overridden in typescript.js - parseAccessModifier(): ?N.Accessibility { - return undefined; - } - parseClassPrivateProperty( node: N.ClassPrivateProperty, ): N.ClassPrivateProperty { @@ -1784,19 +1765,9 @@ export default class StatementParser extends ExpressionParser { maybeParseExportDeclaration(node: N.Node): boolean { if (this.shouldParseExportDeclaration()) { - if (this.isContextual("async")) { - const next = this.nextTokenStart(); - - // export async; - if (!this.isUnparsedContextual(next, "function")) { - this.unexpected(next, tt._function); - } - } - node.specifiers = []; node.source = null; node.declaration = this.parseExportDeclaration(node); - return true; } return false; @@ -1999,15 +1970,10 @@ export default class StatementParser extends ExpressionParser { const currentContextDecorators = this.state.decoratorStack[ this.state.decoratorStack.length - 1 ]; + // If node.declaration is a class, it will take all decorators in the current context. + // Thus we should throw if we see non-empty decorators here. if (currentContextDecorators.length) { - const isClass = - node.declaration && - (node.declaration.type === "ClassDeclaration" || - node.declaration.type === "ClassExpression"); - if (!node.declaration || !isClass) { - throw this.raise(node.start, Errors.UnsupportedDecoratorExport); - } - this.takeDecorators(node.declaration); + throw this.raise(node.start, Errors.UnsupportedDecoratorExport); } } diff --git a/packages/babel-parser/test/expressions/experimental/top-level-await/module/input.js b/packages/babel-parser/test/expressions/experimental/top-level-await/module/input.js new file mode 100644 index 0000000000..3bd1880690 --- /dev/null +++ b/packages/babel-parser/test/expressions/experimental/top-level-await/module/input.js @@ -0,0 +1,2 @@ +// prettier-ignore +await +42 diff --git a/packages/babel-parser/test/expressions/experimental/top-level-await/module/options.json b/packages/babel-parser/test/expressions/experimental/top-level-await/module/options.json new file mode 100644 index 0000000000..2104ca4328 --- /dev/null +++ b/packages/babel-parser/test/expressions/experimental/top-level-await/module/options.json @@ -0,0 +1,3 @@ +{ + "sourceType": "module" +} diff --git a/packages/babel-parser/test/expressions/experimental/top-level-await/module/output.json b/packages/babel-parser/test/expressions/experimental/top-level-await/module/output.json new file mode 100644 index 0000000000..f961d5d8b8 --- /dev/null +++ b/packages/babel-parser/test/expressions/experimental/top-level-await/module/output.json @@ -0,0 +1,33 @@ +{ + "type": "AwaitExpression", + "start":19,"end":28,"loc":{"start":{"line":2,"column":0},"end":{"line":2,"column":9}}, + "argument": { + "type": "UnaryExpression", + "start":25,"end":28,"loc":{"start":{"line":2,"column":6},"end":{"line":2,"column":9}}, + "operator": "+", + "prefix": true, + "argument": { + "type": "NumericLiteral", + "start":26,"end":28,"loc":{"start":{"line":2,"column":7},"end":{"line":2,"column":9}}, + "extra": { + "rawValue": 42, + "raw": "42" + }, + "value": 42 + } + }, + "leadingComments": [ + { + "type": "CommentLine", + "value": " prettier-ignore", + "start":0,"end":18,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":18}} + } + ], + "comments": [ + { + "type": "CommentLine", + "value": " prettier-ignore", + "start":0,"end":18,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":18}} + } + ] +} \ No newline at end of file diff --git a/packages/babel-parser/test/expressions/experimental/top-level-await/options.json b/packages/babel-parser/test/expressions/experimental/top-level-await/options.json new file mode 100644 index 0000000000..016d522a61 --- /dev/null +++ b/packages/babel-parser/test/expressions/experimental/top-level-await/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["topLevelAwait"] +} diff --git a/packages/babel-parser/test/expressions/experimental/top-level-await/script/input.js b/packages/babel-parser/test/expressions/experimental/top-level-await/script/input.js new file mode 100644 index 0000000000..3bd1880690 --- /dev/null +++ b/packages/babel-parser/test/expressions/experimental/top-level-await/script/input.js @@ -0,0 +1,2 @@ +// prettier-ignore +await +42 diff --git a/packages/babel-parser/test/expressions/experimental/top-level-await/script/options.json b/packages/babel-parser/test/expressions/experimental/top-level-await/script/options.json new file mode 100644 index 0000000000..b412ffe671 --- /dev/null +++ b/packages/babel-parser/test/expressions/experimental/top-level-await/script/options.json @@ -0,0 +1,3 @@ +{ + "sourceType": "script" +} diff --git a/packages/babel-parser/test/expressions/experimental/top-level-await/script/output.json b/packages/babel-parser/test/expressions/experimental/top-level-await/script/output.json new file mode 100644 index 0000000000..6763d89fd1 --- /dev/null +++ b/packages/babel-parser/test/expressions/experimental/top-level-await/script/output.json @@ -0,0 +1,33 @@ +{ + "type": "BinaryExpression", + "start":19,"end":28,"loc":{"start":{"line":2,"column":0},"end":{"line":2,"column":9}}, + "left": { + "type": "Identifier", + "start":19,"end":24,"loc":{"start":{"line":2,"column":0},"end":{"line":2,"column":5},"identifierName":"await"}, + "name": "await" + }, + "operator": "+", + "right": { + "type": "NumericLiteral", + "start":26,"end":28,"loc":{"start":{"line":2,"column":7},"end":{"line":2,"column":9}}, + "extra": { + "rawValue": 42, + "raw": "42" + }, + "value": 42 + }, + "leadingComments": [ + { + "type": "CommentLine", + "value": " prettier-ignore", + "start":0,"end":18,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":18}} + } + ], + "comments": [ + { + "type": "CommentLine", + "value": " prettier-ignore", + "start":0,"end":18,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":18}} + } + ] +} \ No newline at end of file diff --git a/packages/babel-parser/test/expressions/experimental/top-level-await/unambiguous/input.js b/packages/babel-parser/test/expressions/experimental/top-level-await/unambiguous/input.js new file mode 100644 index 0000000000..3bd1880690 --- /dev/null +++ b/packages/babel-parser/test/expressions/experimental/top-level-await/unambiguous/input.js @@ -0,0 +1,2 @@ +// prettier-ignore +await +42 diff --git a/packages/babel-parser/test/expressions/experimental/top-level-await/unambiguous/options.json b/packages/babel-parser/test/expressions/experimental/top-level-await/unambiguous/options.json new file mode 100644 index 0000000000..e69c4497f5 --- /dev/null +++ b/packages/babel-parser/test/expressions/experimental/top-level-await/unambiguous/options.json @@ -0,0 +1,3 @@ +{ + "sourceType": "unambiguous" +} diff --git a/packages/babel-parser/test/expressions/experimental/top-level-await/unambiguous/output.json b/packages/babel-parser/test/expressions/experimental/top-level-await/unambiguous/output.json new file mode 100644 index 0000000000..6763d89fd1 --- /dev/null +++ b/packages/babel-parser/test/expressions/experimental/top-level-await/unambiguous/output.json @@ -0,0 +1,33 @@ +{ + "type": "BinaryExpression", + "start":19,"end":28,"loc":{"start":{"line":2,"column":0},"end":{"line":2,"column":9}}, + "left": { + "type": "Identifier", + "start":19,"end":24,"loc":{"start":{"line":2,"column":0},"end":{"line":2,"column":5},"identifierName":"await"}, + "name": "await" + }, + "operator": "+", + "right": { + "type": "NumericLiteral", + "start":26,"end":28,"loc":{"start":{"line":2,"column":7},"end":{"line":2,"column":9}}, + "extra": { + "rawValue": 42, + "raw": "42" + }, + "value": 42 + }, + "leadingComments": [ + { + "type": "CommentLine", + "value": " prettier-ignore", + "start":0,"end":18,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":18}} + } + ], + "comments": [ + { + "type": "CommentLine", + "value": " prettier-ignore", + "start":0,"end":18,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":18}} + } + ] +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/es2015/destructuring/invalid-object-method/input.js b/packages/babel-parser/test/fixtures/es2015/destructuring/invalid-object-method/input.js new file mode 100644 index 0000000000..6264a77434 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2015/destructuring/invalid-object-method/input.js @@ -0,0 +1 @@ +const { foo() {} } = foo(); diff --git a/packages/babel-parser/test/fixtures/es2015/destructuring/invalid-object-method/options.json b/packages/babel-parser/test/fixtures/es2015/destructuring/invalid-object-method/options.json new file mode 100644 index 0000000000..3e33f7730f --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2015/destructuring/invalid-object-method/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Unexpected token (1:11)" +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/es2020/export-ns-from/ns-dangling-comma/input.js b/packages/babel-parser/test/fixtures/es2020/export-ns-from/ns-dangling-comma/input.js new file mode 100644 index 0000000000..be1347b46c --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2020/export-ns-from/ns-dangling-comma/input.js @@ -0,0 +1 @@ +export * as foo, diff --git a/packages/babel-parser/test/fixtures/es2020/export-ns-from/ns-dangling-comma/options.json b/packages/babel-parser/test/fixtures/es2020/export-ns-from/ns-dangling-comma/options.json new file mode 100644 index 0000000000..5fc5536456 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2020/export-ns-from/ns-dangling-comma/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Unexpected token, expected \"{\" (1:16)" +} diff --git a/packages/babel-parser/test/fixtures/experimental/bind-operator/invalid-non-member-expression/input.js b/packages/babel-parser/test/fixtures/experimental/bind-operator/invalid-non-member-expression/input.js new file mode 100644 index 0000000000..7b1f4ab04b --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/bind-operator/invalid-non-member-expression/input.js @@ -0,0 +1 @@ +::a?.b; diff --git a/packages/babel-parser/test/fixtures/experimental/bind-operator/invalid-non-member-expression/options.json b/packages/babel-parser/test/fixtures/experimental/bind-operator/invalid-non-member-expression/options.json new file mode 100644 index 0000000000..e76281a4da --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/bind-operator/invalid-non-member-expression/options.json @@ -0,0 +1,6 @@ +{ + "plugins": [ + "functionBind" + ], + "throws": "Binding should be performed on object property. (1:2)" +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/experimental/bind-operator/options.json b/packages/babel-parser/test/fixtures/experimental/bind-operator/options.json new file mode 100644 index 0000000000..739c075989 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/bind-operator/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["functionBind"] +} diff --git a/packages/babel-parser/test/fixtures/experimental/decorators/invalid-decorator-spread-element/input.js b/packages/babel-parser/test/fixtures/experimental/decorators/invalid-decorator-spread-element/input.js new file mode 100644 index 0000000000..5b97a2b651 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/decorators/invalid-decorator-spread-element/input.js @@ -0,0 +1 @@ +({ @foo ...foo }); diff --git a/packages/babel-parser/test/fixtures/experimental/decorators/invalid-decorator-spread-element/options.json b/packages/babel-parser/test/fixtures/experimental/decorators/invalid-decorator-spread-element/options.json new file mode 100644 index 0000000000..e2bd94fc31 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/decorators/invalid-decorator-spread-element/options.json @@ -0,0 +1,4 @@ +{ + "plugins": ["decorators-legacy"], + "throws": "Unexpected token (1:8)" +} diff --git a/packages/babel-parser/test/fixtures/experimental/export-extensions/default-dangling-comma/input.js b/packages/babel-parser/test/fixtures/experimental/export-extensions/default-dangling-comma/input.js new file mode 100644 index 0000000000..2eac343a35 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/export-extensions/default-dangling-comma/input.js @@ -0,0 +1 @@ +export default, diff --git a/packages/babel-parser/test/fixtures/experimental/export-extensions/default-dangling-comma/options.json b/packages/babel-parser/test/fixtures/experimental/export-extensions/default-dangling-comma/options.json new file mode 100644 index 0000000000..78ef8d2246 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/export-extensions/default-dangling-comma/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Unexpected token, expected \"{\" (1:15)" +} diff --git a/packages/babel-parser/test/fixtures/experimental/pipeline-operator/proposal-fsharp-invalid-primary-topic/input.js b/packages/babel-parser/test/fixtures/experimental/pipeline-operator/proposal-fsharp-invalid-primary-topic/input.js new file mode 100644 index 0000000000..7b96ee2275 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/pipeline-operator/proposal-fsharp-invalid-primary-topic/input.js @@ -0,0 +1 @@ +x |> # + 1 diff --git a/packages/babel-parser/test/fixtures/experimental/pipeline-operator/proposal-fsharp-invalid-primary-topic/options.json b/packages/babel-parser/test/fixtures/experimental/pipeline-operator/proposal-fsharp-invalid-primary-topic/options.json new file mode 100644 index 0000000000..f95ecc7d6c --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/pipeline-operator/proposal-fsharp-invalid-primary-topic/options.json @@ -0,0 +1,3 @@ +{ + "plugins": [["pipelineOperator", { "proposal": "fsharp" }]] +} diff --git a/packages/babel-parser/test/fixtures/experimental/pipeline-operator/proposal-fsharp-invalid-primary-topic/output.json b/packages/babel-parser/test/fixtures/experimental/pipeline-operator/proposal-fsharp-invalid-primary-topic/output.json new file mode 100644 index 0000000000..6c724302e0 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/pipeline-operator/proposal-fsharp-invalid-primary-topic/output.json @@ -0,0 +1,49 @@ +{ + "type": "File", + "start":0,"end":10,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":10}}, + "errors": [ + "SyntaxError: Primary Topic Reference found but pipelineOperator not passed 'smart' for 'proposal' option. (1:5)", + "SyntaxError: Topic reference was used in a lexical context without topic binding (1:5)" + ], + "program": { + "type": "Program", + "start":0,"end":10,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":10}}, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "ExpressionStatement", + "start":0,"end":10,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":10}}, + "expression": { + "type": "BinaryExpression", + "start":0,"end":10,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":10}}, + "left": { + "type": "Identifier", + "start":0,"end":1,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":1},"identifierName":"x"}, + "name": "x" + }, + "operator": "|>", + "right": { + "type": "BinaryExpression", + "start":5,"end":10,"loc":{"start":{"line":1,"column":5},"end":{"line":1,"column":10}}, + "left": { + "type": "PipelinePrimaryTopicReference", + "start":5,"end":6,"loc":{"start":{"line":1,"column":5},"end":{"line":1,"column":6}} + }, + "operator": "+", + "right": { + "type": "NumericLiteral", + "start":9,"end":10,"loc":{"start":{"line":1,"column":9},"end":{"line":1,"column":10}}, + "extra": { + "rawValue": 1, + "raw": "1" + }, + "value": 1 + } + } + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/experimental/record-and-tuple/invalid-record-proto/input.js b/packages/babel-parser/test/fixtures/experimental/record-and-tuple/invalid-record-proto/input.js new file mode 100644 index 0000000000..68e990891a --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/record-and-tuple/invalid-record-proto/input.js @@ -0,0 +1 @@ +#{ __proto__: null } diff --git a/packages/babel-parser/test/fixtures/experimental/record-and-tuple/invalid-record-proto/options.json b/packages/babel-parser/test/fixtures/experimental/record-and-tuple/invalid-record-proto/options.json new file mode 100644 index 0000000000..703c537be3 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/record-and-tuple/invalid-record-proto/options.json @@ -0,0 +1,3 @@ +{ + "plugins": [["recordAndTuple", { "syntaxType": "hash" }]] +} diff --git a/packages/babel-parser/test/fixtures/experimental/record-and-tuple/invalid-record-proto/output.json b/packages/babel-parser/test/fixtures/experimental/record-and-tuple/invalid-record-proto/output.json new file mode 100644 index 0000000000..4f409dffa2 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/record-and-tuple/invalid-record-proto/output.json @@ -0,0 +1,42 @@ +{ + "type": "File", + "start":0,"end":20,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":20}}, + "errors": [ + "SyntaxError: '__proto__' is not allowed in Record expressions (1:3)" + ], + "program": { + "type": "Program", + "start":0,"end":20,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":20}}, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "ExpressionStatement", + "start":0,"end":20,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":20}}, + "expression": { + "type": "RecordExpression", + "start":0,"end":20,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":20}}, + "properties": [ + { + "type": "ObjectProperty", + "start":3,"end":18,"loc":{"start":{"line":1,"column":3},"end":{"line":1,"column":18}}, + "method": false, + "key": { + "type": "Identifier", + "start":3,"end":12,"loc":{"start":{"line":1,"column":3},"end":{"line":1,"column":12},"identifierName":"__proto__"}, + "name": "__proto__" + }, + "computed": false, + "shorthand": false, + "value": { + "type": "NullLiteral", + "start":14,"end":18,"loc":{"start":{"line":1,"column":14},"end":{"line":1,"column":18}} + } + } + ] + } + } + ], + "directives": [] + } +} \ No newline at end of file