From 9826ef13cf0c481a70f9682ff099fea35654aab2 Mon Sep 17 00:00:00 2001 From: fisker Date: Fri, 18 Sep 2020 15:32:49 +0800 Subject: [PATCH 1/2] Fix invalid `setter` parse --- .../babel-parser/src/parser/expression.js | 1 + .../core/object/invalid-setter/input.js | 1 + .../core/object/invalid-setter/output.json | 52 +++++++++++++++++++ 3 files changed, 54 insertions(+) create mode 100644 packages/babel-parser/test/fixtures/core/object/invalid-setter/input.js create mode 100644 packages/babel-parser/test/fixtures/core/object/invalid-setter/output.json diff --git a/packages/babel-parser/src/parser/expression.js b/packages/babel-parser/src/parser/expression.js index ccdd7bf8fee4..0e16691249b2 100644 --- a/packages/babel-parser/src/parser/expression.js +++ b/packages/babel-parser/src/parser/expression.js @@ -1810,6 +1810,7 @@ export default class ExpressionParser extends LValParser { if ( method.kind === "set" && + method.params.length !== 0 && method.params[method.params.length - 1].type === "RestElement" ) { this.raise(start, Errors.BadSetterRestParameter); diff --git a/packages/babel-parser/test/fixtures/core/object/invalid-setter/input.js b/packages/babel-parser/test/fixtures/core/object/invalid-setter/input.js new file mode 100644 index 000000000000..986250c287b7 --- /dev/null +++ b/packages/babel-parser/test/fixtures/core/object/invalid-setter/input.js @@ -0,0 +1 @@ +({ set x(){} }) diff --git a/packages/babel-parser/test/fixtures/core/object/invalid-setter/output.json b/packages/babel-parser/test/fixtures/core/object/invalid-setter/output.json new file mode 100644 index 000000000000..67751ab07b1f --- /dev/null +++ b/packages/babel-parser/test/fixtures/core/object/invalid-setter/output.json @@ -0,0 +1,52 @@ +{ + "type": "File", + "start":0,"end":15,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":15}}, + "errors": [ + "SyntaxError: setter must have exactly one formal parameter (1:3)" + ], + "program": { + "type": "Program", + "start":0,"end":15,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":15}}, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "ExpressionStatement", + "start":0,"end":15,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":15}}, + "expression": { + "type": "ObjectExpression", + "start":1,"end":14,"loc":{"start":{"line":1,"column":1},"end":{"line":1,"column":14}}, + "properties": [ + { + "type": "ObjectMethod", + "start":3,"end":12,"loc":{"start":{"line":1,"column":3},"end":{"line":1,"column":12}}, + "method": false, + "key": { + "type": "Identifier", + "start":7,"end":8,"loc":{"start":{"line":1,"column":7},"end":{"line":1,"column":8},"identifierName":"x"}, + "name": "x" + }, + "computed": false, + "kind": "set", + "id": null, + "generator": false, + "async": false, + "params": [], + "body": { + "type": "BlockStatement", + "start":10,"end":12,"loc":{"start":{"line":1,"column":10},"end":{"line":1,"column":12}}, + "body": [], + "directives": [] + } + } + ], + "extra": { + "parenthesized": true, + "parenStart": 0 + } + } + } + ], + "directives": [] + } +} \ No newline at end of file From 8a156773399e1d4e28354a6087839d76538fffc9 Mon Sep 17 00:00:00 2001 From: Brian Ng Date: Fri, 18 Sep 2020 09:38:10 -0500 Subject: [PATCH 2/2] estree --- .../babel-parser/src/parser/expression.js | 13 ++++- packages/babel-parser/src/plugins/estree.js | 19 +------ .../object-method/invalid-setter/input.js | 1 + .../object-method/invalid-setter/output.json | 56 +++++++++++++++++++ 4 files changed, 70 insertions(+), 19 deletions(-) create mode 100644 packages/babel-parser/test/fixtures/estree/object-method/invalid-setter/input.js create mode 100644 packages/babel-parser/test/fixtures/estree/object-method/invalid-setter/output.json diff --git a/packages/babel-parser/src/parser/expression.js b/packages/babel-parser/src/parser/expression.js index 0e16691249b2..4321bbf5f437 100644 --- a/packages/babel-parser/src/parser/expression.js +++ b/packages/babel-parser/src/parser/expression.js @@ -1795,12 +1795,20 @@ export default class ExpressionParser extends LValParser { return method.kind === "get" ? 0 : 1; } + // This exists so we can override within the ESTree plugin + getObjectOrClassMethodParams(method: N.ObjectMethod | N.ClassMethod) { + return method.params; + } + // get methods aren't allowed to have any parameters // set methods must have exactly 1 parameter which is not a rest parameter checkGetterSetterParams(method: N.ObjectMethod | N.ClassMethod): void { const paramCount = this.getGetterSetterExpectedParamCount(method); + const params = this.getObjectOrClassMethodParams(method); + const start = method.start; - if (method.params.length !== paramCount) { + + if (params.length !== paramCount) { if (method.kind === "get") { this.raise(start, Errors.BadGetterArity); } else { @@ -1810,8 +1818,7 @@ export default class ExpressionParser extends LValParser { if ( method.kind === "set" && - method.params.length !== 0 && - method.params[method.params.length - 1].type === "RestElement" + params[params.length - 1]?.type === "RestElement" ) { this.raise(start, Errors.BadSetterRestParameter); } diff --git a/packages/babel-parser/src/plugins/estree.js b/packages/babel-parser/src/plugins/estree.js index 579f45e0b279..fe0936d7d048 100644 --- a/packages/babel-parser/src/plugins/estree.js +++ b/packages/babel-parser/src/plugins/estree.js @@ -105,22 +105,9 @@ export default (superClass: Class): Class => } } - checkGetterSetterParams(method: N.ObjectMethod | N.ClassMethod): void { - const prop = ((method: any): N.EstreeProperty | N.EstreeMethodDefinition); - const paramCount = prop.kind === "get" ? 0 : 1; - const start = prop.start; - if (prop.value.params.length !== paramCount) { - if (method.kind === "get") { - this.raise(start, Errors.BadGetterArity); - } else { - this.raise(start, Errors.BadSetterArity); - } - } else if ( - prop.kind === "set" && - prop.value.params[0].type === "RestElement" - ) { - this.raise(start, Errors.BadSetterRestParameter); - } + getObjectOrClassMethodParams(method: N.ObjectMethod | N.ClassMethod) { + return ((method: any): N.EstreeProperty | N.EstreeMethodDefinition).value + .params; } checkLVal( diff --git a/packages/babel-parser/test/fixtures/estree/object-method/invalid-setter/input.js b/packages/babel-parser/test/fixtures/estree/object-method/invalid-setter/input.js new file mode 100644 index 000000000000..986250c287b7 --- /dev/null +++ b/packages/babel-parser/test/fixtures/estree/object-method/invalid-setter/input.js @@ -0,0 +1 @@ +({ set x(){} }) diff --git a/packages/babel-parser/test/fixtures/estree/object-method/invalid-setter/output.json b/packages/babel-parser/test/fixtures/estree/object-method/invalid-setter/output.json new file mode 100644 index 000000000000..bba388a4344b --- /dev/null +++ b/packages/babel-parser/test/fixtures/estree/object-method/invalid-setter/output.json @@ -0,0 +1,56 @@ +{ + "type": "File", + "start":0,"end":15,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":15}}, + "errors": [ + "SyntaxError: setter must have exactly one formal parameter (1:3)" + ], + "program": { + "type": "Program", + "start":0,"end":15,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":15}}, + "sourceType": "script", + "interpreter": null, + "body": [ + { + "type": "ExpressionStatement", + "start":0,"end":15,"loc":{"start":{"line":1,"column":0},"end":{"line":1,"column":15}}, + "expression": { + "type": "ObjectExpression", + "start":1,"end":14,"loc":{"start":{"line":1,"column":1},"end":{"line":1,"column":14}}, + "properties": [ + { + "type": "Property", + "start":3,"end":12,"loc":{"start":{"line":1,"column":3},"end":{"line":1,"column":12}}, + "method": false, + "key": { + "type": "Identifier", + "start":7,"end":8,"loc":{"start":{"line":1,"column":7},"end":{"line":1,"column":8},"identifierName":"x"}, + "name": "x" + }, + "computed": false, + "kind": "set", + "value": { + "type": "FunctionExpression", + "start":8,"end":12,"loc":{"start":{"line":1,"column":8},"end":{"line":1,"column":12}}, + "id": null, + "generator": false, + "async": false, + "expression": false, + "params": [], + "body": { + "type": "BlockStatement", + "start":10,"end":12,"loc":{"start":{"line":1,"column":10},"end":{"line":1,"column":12}}, + "body": [] + } + }, + "shorthand": false + } + ], + "extra": { + "parenthesized": true, + "parenStart": 0 + } + } + } + ] + } +} \ No newline at end of file