From a62cfe904586bea845549f8578872ef40e67183c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Thu, 12 Apr 2018 15:06:48 +0200 Subject: [PATCH] Disallow arguments in class properties --- .../input.js | 4 - .../output.js | 4 - packages/babylon/src/parser/expression.js | 7 + .../arguments-in-arrow-function/input.js | 5 + .../arguments-in-arrow-function/options.json | 4 + .../arguments-in-function/input.js | 5 + .../arguments-in-function/options.json | 3 + .../arguments-in-function/output.json | 256 ++++++++++++++++++ .../arguments-in-key/input.js | 5 + .../arguments-in-key/options.json | 3 + .../arguments-in-key/output.json | 191 +++++++++++++ .../class-properties/arguments/input.js | 5 + .../class-properties/arguments/options.json | 4 + 13 files changed, 488 insertions(+), 8 deletions(-) create mode 100644 packages/babylon/test/fixtures/experimental/class-properties/arguments-in-arrow-function/input.js create mode 100644 packages/babylon/test/fixtures/experimental/class-properties/arguments-in-arrow-function/options.json create mode 100644 packages/babylon/test/fixtures/experimental/class-properties/arguments-in-function/input.js create mode 100644 packages/babylon/test/fixtures/experimental/class-properties/arguments-in-function/options.json create mode 100644 packages/babylon/test/fixtures/experimental/class-properties/arguments-in-function/output.json create mode 100644 packages/babylon/test/fixtures/experimental/class-properties/arguments-in-key/input.js create mode 100644 packages/babylon/test/fixtures/experimental/class-properties/arguments-in-key/options.json create mode 100644 packages/babylon/test/fixtures/experimental/class-properties/arguments-in-key/output.json create mode 100644 packages/babylon/test/fixtures/experimental/class-properties/arguments/input.js create mode 100644 packages/babylon/test/fixtures/experimental/class-properties/arguments/options.json diff --git a/packages/babel-core/test/fixtures/transformation/misc/class-property-initializer-blocks-shadow/input.js b/packages/babel-core/test/fixtures/transformation/misc/class-property-initializer-blocks-shadow/input.js index 0a1fda2178..f9ada88ec6 100644 --- a/packages/babel-core/test/fixtures/transformation/misc/class-property-initializer-blocks-shadow/input.js +++ b/packages/babel-core/test/fixtures/transformation/misc/class-property-initializer-blocks-shadow/input.js @@ -1,10 +1,6 @@ class A { prop1 = () => this; static prop2 = () => this; - prop3 = () => arguments; - static prop4 = () => arguments; prop5 = this; static prop6 = this; - prop7 = arguments; - static prop8 = arguments; } diff --git a/packages/babel-core/test/fixtures/transformation/misc/class-property-initializer-blocks-shadow/output.js b/packages/babel-core/test/fixtures/transformation/misc/class-property-initializer-blocks-shadow/output.js index 0a1fda2178..f9ada88ec6 100644 --- a/packages/babel-core/test/fixtures/transformation/misc/class-property-initializer-blocks-shadow/output.js +++ b/packages/babel-core/test/fixtures/transformation/misc/class-property-initializer-blocks-shadow/output.js @@ -1,10 +1,6 @@ class A { prop1 = () => this; static prop2 = () => this; - prop3 = () => arguments; - static prop4 = () => arguments; prop5 = this; static prop6 = this; - prop7 = arguments; - static prop8 = arguments; } diff --git a/packages/babylon/src/parser/expression.js b/packages/babylon/src/parser/expression.js index d7d4429dcc..c018dca0a5 100644 --- a/packages/babylon/src/parser/expression.js +++ b/packages/babylon/src/parser/expression.js @@ -1861,6 +1861,13 @@ export default class ExpressionParser extends LValParser { ); } + if (this.state.inClassProperty && word === "arguments") { + this.raise( + startLoc, + "'arguments' is not allowed in class field initializer", + ); + } + if (this.isReservedWord(word) || (checkKeywords && this.isKeyword(word))) { this.raise(startLoc, word + " is a reserved word"); } diff --git a/packages/babylon/test/fixtures/experimental/class-properties/arguments-in-arrow-function/input.js b/packages/babylon/test/fixtures/experimental/class-properties/arguments-in-arrow-function/input.js new file mode 100644 index 0000000000..c8ebc4fb14 --- /dev/null +++ b/packages/babylon/test/fixtures/experimental/class-properties/arguments-in-arrow-function/input.js @@ -0,0 +1,5 @@ +function fn() { + class A { + foo = () => arguments; + } +} \ No newline at end of file diff --git a/packages/babylon/test/fixtures/experimental/class-properties/arguments-in-arrow-function/options.json b/packages/babylon/test/fixtures/experimental/class-properties/arguments-in-arrow-function/options.json new file mode 100644 index 0000000000..a567b19a72 --- /dev/null +++ b/packages/babylon/test/fixtures/experimental/class-properties/arguments-in-arrow-function/options.json @@ -0,0 +1,4 @@ +{ + "plugins": ["classProperties"], + "throws": "'arguments' is not allowed in class field initializer (3:16)" +} diff --git a/packages/babylon/test/fixtures/experimental/class-properties/arguments-in-function/input.js b/packages/babylon/test/fixtures/experimental/class-properties/arguments-in-function/input.js new file mode 100644 index 0000000000..b68bc4f92d --- /dev/null +++ b/packages/babylon/test/fixtures/experimental/class-properties/arguments-in-function/input.js @@ -0,0 +1,5 @@ +function fn() { + class A { + foo = function f() { arguments }; + } +} \ No newline at end of file diff --git a/packages/babylon/test/fixtures/experimental/class-properties/arguments-in-function/options.json b/packages/babylon/test/fixtures/experimental/class-properties/arguments-in-function/options.json new file mode 100644 index 0000000000..9c27576d4a --- /dev/null +++ b/packages/babylon/test/fixtures/experimental/class-properties/arguments-in-function/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["classProperties"] +} diff --git a/packages/babylon/test/fixtures/experimental/class-properties/arguments-in-function/output.json b/packages/babylon/test/fixtures/experimental/class-properties/arguments-in-function/output.json new file mode 100644 index 0000000000..ec7ac58529 --- /dev/null +++ b/packages/babylon/test/fixtures/experimental/class-properties/arguments-in-function/output.json @@ -0,0 +1,256 @@ +{ + "type": "File", + "start": 0, + "end": 71, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 5, + "column": 1 + } + }, + "program": { + "type": "Program", + "start": 0, + "end": 71, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 5, + "column": 1 + } + }, + "sourceType": "script", + "body": [ + { + "type": "FunctionDeclaration", + "start": 0, + "end": 71, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 5, + "column": 1 + } + }, + "id": { + "type": "Identifier", + "start": 9, + "end": 11, + "loc": { + "start": { + "line": 1, + "column": 9 + }, + "end": { + "line": 1, + "column": 11 + }, + "identifierName": "fn" + }, + "name": "fn" + }, + "generator": false, + "async": false, + "params": [], + "body": { + "type": "BlockStatement", + "start": 14, + "end": 71, + "loc": { + "start": { + "line": 1, + "column": 14 + }, + "end": { + "line": 5, + "column": 1 + } + }, + "body": [ + { + "type": "ClassDeclaration", + "start": 18, + "end": 69, + "loc": { + "start": { + "line": 2, + "column": 2 + }, + "end": { + "line": 4, + "column": 3 + } + }, + "id": { + "type": "Identifier", + "start": 24, + "end": 25, + "loc": { + "start": { + "line": 2, + "column": 8 + }, + "end": { + "line": 2, + "column": 9 + }, + "identifierName": "A" + }, + "name": "A" + }, + "superClass": null, + "body": { + "type": "ClassBody", + "start": 26, + "end": 69, + "loc": { + "start": { + "line": 2, + "column": 10 + }, + "end": { + "line": 4, + "column": 3 + } + }, + "body": [ + { + "type": "ClassProperty", + "start": 32, + "end": 65, + "loc": { + "start": { + "line": 3, + "column": 4 + }, + "end": { + "line": 3, + "column": 37 + } + }, + "static": false, + "key": { + "type": "Identifier", + "start": 32, + "end": 35, + "loc": { + "start": { + "line": 3, + "column": 4 + }, + "end": { + "line": 3, + "column": 7 + }, + "identifierName": "foo" + }, + "name": "foo" + }, + "computed": false, + "value": { + "type": "FunctionExpression", + "start": 38, + "end": 64, + "loc": { + "start": { + "line": 3, + "column": 10 + }, + "end": { + "line": 3, + "column": 36 + } + }, + "id": { + "type": "Identifier", + "start": 47, + "end": 48, + "loc": { + "start": { + "line": 3, + "column": 19 + }, + "end": { + "line": 3, + "column": 20 + }, + "identifierName": "f" + }, + "name": "f" + }, + "generator": false, + "async": false, + "params": [], + "body": { + "type": "BlockStatement", + "start": 51, + "end": 64, + "loc": { + "start": { + "line": 3, + "column": 23 + }, + "end": { + "line": 3, + "column": 36 + } + }, + "body": [ + { + "type": "ExpressionStatement", + "start": 53, + "end": 62, + "loc": { + "start": { + "line": 3, + "column": 25 + }, + "end": { + "line": 3, + "column": 34 + } + }, + "expression": { + "type": "Identifier", + "start": 53, + "end": 62, + "loc": { + "start": { + "line": 3, + "column": 25 + }, + "end": { + "line": 3, + "column": 34 + }, + "identifierName": "arguments" + }, + "name": "arguments" + } + } + ], + "directives": [] + } + } + } + ] + } + } + ], + "directives": [] + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babylon/test/fixtures/experimental/class-properties/arguments-in-key/input.js b/packages/babylon/test/fixtures/experimental/class-properties/arguments-in-key/input.js new file mode 100644 index 0000000000..a5786c4671 --- /dev/null +++ b/packages/babylon/test/fixtures/experimental/class-properties/arguments-in-key/input.js @@ -0,0 +1,5 @@ +function fn() { + class A { + [arguments] = 2; + } +} \ No newline at end of file diff --git a/packages/babylon/test/fixtures/experimental/class-properties/arguments-in-key/options.json b/packages/babylon/test/fixtures/experimental/class-properties/arguments-in-key/options.json new file mode 100644 index 0000000000..9c27576d4a --- /dev/null +++ b/packages/babylon/test/fixtures/experimental/class-properties/arguments-in-key/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["classProperties"] +} diff --git a/packages/babylon/test/fixtures/experimental/class-properties/arguments-in-key/output.json b/packages/babylon/test/fixtures/experimental/class-properties/arguments-in-key/output.json new file mode 100644 index 0000000000..8676cc91a8 --- /dev/null +++ b/packages/babylon/test/fixtures/experimental/class-properties/arguments-in-key/output.json @@ -0,0 +1,191 @@ +{ + "type": "File", + "start": 0, + "end": 54, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 5, + "column": 1 + } + }, + "program": { + "type": "Program", + "start": 0, + "end": 54, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 5, + "column": 1 + } + }, + "sourceType": "script", + "body": [ + { + "type": "FunctionDeclaration", + "start": 0, + "end": 54, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 5, + "column": 1 + } + }, + "id": { + "type": "Identifier", + "start": 9, + "end": 11, + "loc": { + "start": { + "line": 1, + "column": 9 + }, + "end": { + "line": 1, + "column": 11 + }, + "identifierName": "fn" + }, + "name": "fn" + }, + "generator": false, + "async": false, + "params": [], + "body": { + "type": "BlockStatement", + "start": 14, + "end": 54, + "loc": { + "start": { + "line": 1, + "column": 14 + }, + "end": { + "line": 5, + "column": 1 + } + }, + "body": [ + { + "type": "ClassDeclaration", + "start": 18, + "end": 52, + "loc": { + "start": { + "line": 2, + "column": 2 + }, + "end": { + "line": 4, + "column": 3 + } + }, + "id": { + "type": "Identifier", + "start": 24, + "end": 25, + "loc": { + "start": { + "line": 2, + "column": 8 + }, + "end": { + "line": 2, + "column": 9 + }, + "identifierName": "A" + }, + "name": "A" + }, + "superClass": null, + "body": { + "type": "ClassBody", + "start": 26, + "end": 52, + "loc": { + "start": { + "line": 2, + "column": 10 + }, + "end": { + "line": 4, + "column": 3 + } + }, + "body": [ + { + "type": "ClassProperty", + "start": 32, + "end": 48, + "loc": { + "start": { + "line": 3, + "column": 4 + }, + "end": { + "line": 3, + "column": 20 + } + }, + "static": false, + "computed": true, + "key": { + "type": "Identifier", + "start": 33, + "end": 42, + "loc": { + "start": { + "line": 3, + "column": 5 + }, + "end": { + "line": 3, + "column": 14 + }, + "identifierName": "arguments" + }, + "name": "arguments" + }, + "value": { + "type": "NumericLiteral", + "start": 46, + "end": 47, + "loc": { + "start": { + "line": 3, + "column": 18 + }, + "end": { + "line": 3, + "column": 19 + } + }, + "extra": { + "rawValue": 2, + "raw": "2" + }, + "value": 2 + } + } + ] + } + } + ], + "directives": [] + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/packages/babylon/test/fixtures/experimental/class-properties/arguments/input.js b/packages/babylon/test/fixtures/experimental/class-properties/arguments/input.js new file mode 100644 index 0000000000..3894e8aa72 --- /dev/null +++ b/packages/babylon/test/fixtures/experimental/class-properties/arguments/input.js @@ -0,0 +1,5 @@ +function fn() { + class A { + foo = arguments; + } +} \ No newline at end of file diff --git a/packages/babylon/test/fixtures/experimental/class-properties/arguments/options.json b/packages/babylon/test/fixtures/experimental/class-properties/arguments/options.json new file mode 100644 index 0000000000..e79a44db0b --- /dev/null +++ b/packages/babylon/test/fixtures/experimental/class-properties/arguments/options.json @@ -0,0 +1,4 @@ +{ + "plugins": ["classProperties"], + "throws": "'arguments' is not allowed in class field initializer (3:10)" +}