From cd577eedfd95bc0d8ee36b9f57e3cc16d72988e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hu=C3=A1ng=20J=C3=B9nli=C3=A0ng?= Date: Wed, 5 Aug 2020 17:52:13 -0400 Subject: [PATCH] refactor: add recoverable error on accessorIsGenerator (#11921) * refactor: add recoverable error on accessorIsGenerator * Update packages/babel-parser/src/parser/error-message.js Co-authored-by: Brian Ng * Apply suggestions from code review Co-authored-by: Brian Ng --- .../babel-parser/src/parser/error-message.js | 1 + .../babel-parser/src/parser/expression.js | 8 +- .../invalid-accessor-generator/input.js | 4 + .../invalid-accessor-generator/output.json | 81 +++++++++++++++++++ 4 files changed, 91 insertions(+), 3 deletions(-) create mode 100644 packages/babel-parser/test/fixtures/es2015/object/invalid-accessor-generator/input.js create mode 100644 packages/babel-parser/test/fixtures/es2015/object/invalid-accessor-generator/output.json diff --git a/packages/babel-parser/src/parser/error-message.js b/packages/babel-parser/src/parser/error-message.js index f9e95d039e65..05518147755a 100644 --- a/packages/babel-parser/src/parser/error-message.js +++ b/packages/babel-parser/src/parser/error-message.js @@ -3,6 +3,7 @@ // The Errors key follows https://cs.chromium.org/chromium/src/v8/src/common/message-template.h unless it does not exist export const ErrorMessages = Object.freeze({ + AccessorIsGenerator: "A %0ter cannot be a generator", ArgumentsDisallowedInInitializer: "'arguments' is not allowed in class field initializer", AsyncFunctionInSingleStatementContext: diff --git a/packages/babel-parser/src/parser/expression.js b/packages/babel-parser/src/parser/expression.js index 18353b957ef1..a0c621f6a60e 100644 --- a/packages/babel-parser/src/parser/expression.js +++ b/packages/babel-parser/src/parser/expression.js @@ -1757,8 +1757,11 @@ export default class ExpressionParser extends LValParser { // set PropertyName[?Yield, ?Await] ( PropertySetParameterList ) { FunctionBody[~Yield, ~Await] } if (keyName === "get" || keyName === "set") { isAccessor = true; - isGenerator = this.eat(tt.star); // tt.star is allowed in `maybeAsyncOrAccessorProp`, we will throw in `parseObjectMethod` later prop.kind = keyName; + if (this.match(tt.star)) { + this.raise(this.state.pos, Errors.AccessorIsGenerator, keyName); + this.next(); + } this.parsePropertyName(prop, /* isPrivateNameAllowed */ false); } } @@ -1813,8 +1816,7 @@ export default class ExpressionParser extends LValParser { isAccessor: boolean, ): ?N.ObjectMethod { if (isAccessor) { - // isAccessor implies isAsync: false, isPattern: false - if (isGenerator) this.unexpected(); + // isAccessor implies isAsync: false, isPattern: false, isGenerator: false this.parseMethod( prop, /* isGenerator */ false, diff --git a/packages/babel-parser/test/fixtures/es2015/object/invalid-accessor-generator/input.js b/packages/babel-parser/test/fixtures/es2015/object/invalid-accessor-generator/input.js new file mode 100644 index 000000000000..e535a197e006 --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2015/object/invalid-accessor-generator/input.js @@ -0,0 +1,4 @@ +({ + get *iterator() { }, + set *iterator(iter) { } +}) diff --git a/packages/babel-parser/test/fixtures/es2015/object/invalid-accessor-generator/output.json b/packages/babel-parser/test/fixtures/es2015/object/invalid-accessor-generator/output.json new file mode 100644 index 000000000000..0049c946dc8c --- /dev/null +++ b/packages/babel-parser/test/fixtures/es2015/object/invalid-accessor-generator/output.json @@ -0,0 +1,81 @@ +{ + "type": "File", + "start":0,"end":58,"loc":{"start":{"line":1,"column":0},"end":{"line":4,"column":2}}, + "errors": [ + "SyntaxError: A getter cannot be a generator (2:9)", + "SyntaxError: A setter cannot be a generator (3:9)" + ], + "program": { + "type": "Program", + "start":0,"end":58,"loc":{"start":{"line":1,"column":0},"end":{"line":4,"column":2}}, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "ExpressionStatement", + "start":0,"end":58,"loc":{"start":{"line":1,"column":0},"end":{"line":4,"column":2}}, + "expression": { + "type": "ObjectExpression", + "start":1,"end":57,"loc":{"start":{"line":1,"column":1},"end":{"line":4,"column":1}}, + "properties": [ + { + "type": "ObjectMethod", + "start":7,"end":26,"loc":{"start":{"line":2,"column":4},"end":{"line":2,"column":23}}, + "method": false, + "key": { + "type": "Identifier", + "start":12,"end":20,"loc":{"start":{"line":2,"column":9},"end":{"line":2,"column":17},"identifierName":"iterator"}, + "name": "iterator" + }, + "computed": false, + "kind": "get", + "id": null, + "generator": false, + "async": false, + "params": [], + "body": { + "type": "BlockStatement", + "start":23,"end":26,"loc":{"start":{"line":2,"column":20},"end":{"line":2,"column":23}}, + "body": [], + "directives": [] + } + }, + { + "type": "ObjectMethod", + "start":32,"end":55,"loc":{"start":{"line":3,"column":4},"end":{"line":3,"column":27}}, + "method": false, + "key": { + "type": "Identifier", + "start":37,"end":45,"loc":{"start":{"line":3,"column":9},"end":{"line":3,"column":17},"identifierName":"iterator"}, + "name": "iterator" + }, + "computed": false, + "kind": "set", + "id": null, + "generator": false, + "async": false, + "params": [ + { + "type": "Identifier", + "start":46,"end":50,"loc":{"start":{"line":3,"column":18},"end":{"line":3,"column":22},"identifierName":"iter"}, + "name": "iter" + } + ], + "body": { + "type": "BlockStatement", + "start":52,"end":55,"loc":{"start":{"line":3,"column":24},"end":{"line":3,"column":27}}, + "body": [], + "directives": [] + } + } + ], + "extra": { + "parenthesized": true, + "parenStart": 0 + } + } + } + ], + "directives": [] + } +}