diff --git a/packages/babel-parser/src/parser/expression.js b/packages/babel-parser/src/parser/expression.js index ccdd7bf8fee4..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,7 +1818,7 @@ export default class ExpressionParser extends LValParser { if ( method.kind === "set" && - 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/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 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