From 13ba386a413bb0ec9c147af278589212c770e1de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hu=C3=A1ng=20J=C3=B9nli=C3=A0ng?= Date: Wed, 5 Aug 2020 15:45:26 -0400 Subject: [PATCH 1/3] refactor: add recoverable error on accessorIsGenerator --- .../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..8fdbcaa03dd2 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 can not 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..fdd6c586de1a --- /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 can not be a generator (2:9)", + "SyntaxError: A setter can not 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": [] + } +} From 355ff59f212d584bab8f7d9089eef3fdc61e4dd1 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:14:04 -0400 Subject: [PATCH 2/3] Update packages/babel-parser/src/parser/error-message.js Co-authored-by: Brian Ng --- packages/babel-parser/src/parser/error-message.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/babel-parser/src/parser/error-message.js b/packages/babel-parser/src/parser/error-message.js index 8fdbcaa03dd2..05518147755a 100644 --- a/packages/babel-parser/src/parser/error-message.js +++ b/packages/babel-parser/src/parser/error-message.js @@ -3,7 +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 can not be a generator", + AccessorIsGenerator: "A %0ter cannot be a generator", ArgumentsDisallowedInInitializer: "'arguments' is not allowed in class field initializer", AsyncFunctionInSingleStatementContext: From f9e19f35fcfeb7167e5eea228cb52a2d3c54ca5e 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:14:34 -0400 Subject: [PATCH 3/3] Apply suggestions from code review --- .../es2015/object/invalid-accessor-generator/output.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 index fdd6c586de1a..0049c946dc8c 100644 --- 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 @@ -2,8 +2,8 @@ "type": "File", "start":0,"end":58,"loc":{"start":{"line":1,"column":0},"end":{"line":4,"column":2}}, "errors": [ - "SyntaxError: A getter can not be a generator (2:9)", - "SyntaxError: A setter can not be a generator (3:9)" + "SyntaxError: A getter cannot be a generator (2:9)", + "SyntaxError: A setter cannot be a generator (3:9)" ], "program": { "type": "Program",