From f09ab3ffb69585ed2730f3651ca3cb726f910e0b Mon Sep 17 00:00:00 2001 From: Moti Zilberman Date: Sun, 11 Sep 2016 15:59:36 +0300 Subject: [PATCH] Add support for computed class property names (#120) --- ast/spec.md | 1 + src/parser/statement.js | 4 +- .../class-properties/computed/actual.js | 9 + .../class-properties/computed/expected.json | 299 ++++++++++++++++++ .../class-properties/computed/options.json | 3 + 5 files changed, 314 insertions(+), 2 deletions(-) create mode 100644 test/fixtures/experimental/class-properties/computed/actual.js create mode 100644 test/fixtures/experimental/class-properties/computed/expected.json create mode 100644 test/fixtures/experimental/class-properties/computed/options.json diff --git a/ast/spec.md b/ast/spec.md index d37c2265e9..4435b41d4b 100644 --- a/ast/spec.md +++ b/ast/spec.md @@ -1021,6 +1021,7 @@ interface ClassProperty <: Node { type: "ClassProperty"; key: Identifier; value: Expression; + computed: boolean; } ``` diff --git a/src/parser/statement.js b/src/parser/statement.js index bc9148e46c..d5ff1cc175 100644 --- a/src/parser/statement.js +++ b/src/parser/statement.js @@ -672,13 +672,13 @@ pp.parseClassBody = function (node) { this.parsePropertyName(method); } - if (!isGenerator && method.key.type === "Identifier" && !method.computed) { + if (!isGenerator) { if (this.isClassProperty()) { classBody.body.push(this.parseClassProperty(method)); continue; } - if (this.hasPlugin("classConstructorCall") && method.key.name === "call" && this.match(tt.name) && this.state.value === "constructor") { + if (method.key.type === "Identifier" && !method.computed && this.hasPlugin("classConstructorCall") && method.key.name === "call" && this.match(tt.name) && this.state.value === "constructor") { isConstructorCall = true; this.parsePropertyName(method); } diff --git a/test/fixtures/experimental/class-properties/computed/actual.js b/test/fixtures/experimental/class-properties/computed/actual.js new file mode 100644 index 0000000000..d3bc5e5d6f --- /dev/null +++ b/test/fixtures/experimental/class-properties/computed/actual.js @@ -0,0 +1,9 @@ +class Foo { + [x] + ['y'] +} + +class Foo { + [p] + [m] () {} +} diff --git a/test/fixtures/experimental/class-properties/computed/expected.json b/test/fixtures/experimental/class-properties/computed/expected.json new file mode 100644 index 0000000000..763fedb8d0 --- /dev/null +++ b/test/fixtures/experimental/class-properties/computed/expected.json @@ -0,0 +1,299 @@ +{ + "type": "File", + "start": 0, + "end": 60, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 9, + "column": 1 + } + }, + "program": { + "type": "Program", + "start": 0, + "end": 60, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 9, + "column": 1 + } + }, + "sourceType": "script", + "body": [ + { + "type": "ClassDeclaration", + "start": 0, + "end": 27, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 4, + "column": 1 + } + }, + "id": { + "type": "Identifier", + "start": 6, + "end": 9, + "loc": { + "start": { + "line": 1, + "column": 6 + }, + "end": { + "line": 1, + "column": 9 + }, + "identifierName": "Foo" + }, + "name": "Foo" + }, + "superClass": null, + "body": { + "type": "ClassBody", + "start": 10, + "end": 27, + "loc": { + "start": { + "line": 1, + "column": 10 + }, + "end": { + "line": 4, + "column": 1 + } + }, + "body": [ + { + "type": "ClassProperty", + "start": 14, + "end": 17, + "loc": { + "start": { + "line": 2, + "column": 2 + }, + "end": { + "line": 2, + "column": 5 + } + }, + "computed": true, + "key": { + "type": "Identifier", + "start": 15, + "end": 16, + "loc": { + "start": { + "line": 2, + "column": 3 + }, + "end": { + "line": 2, + "column": 4 + }, + "identifierName": "x" + }, + "name": "x" + }, + "static": false, + "value": null + }, + { + "type": "ClassProperty", + "start": 20, + "end": 25, + "loc": { + "start": { + "line": 3, + "column": 2 + }, + "end": { + "line": 3, + "column": 7 + } + }, + "computed": true, + "key": { + "type": "StringLiteral", + "start": 21, + "end": 24, + "loc": { + "start": { + "line": 3, + "column": 3 + }, + "end": { + "line": 3, + "column": 6 + } + }, + "extra": { + "rawValue": "y", + "raw": "'y'" + }, + "value": "y" + }, + "static": false, + "value": null + } + ] + } + }, + { + "type": "ClassDeclaration", + "start": 29, + "end": 60, + "loc": { + "start": { + "line": 6, + "column": 0 + }, + "end": { + "line": 9, + "column": 1 + } + }, + "id": { + "type": "Identifier", + "start": 35, + "end": 38, + "loc": { + "start": { + "line": 6, + "column": 6 + }, + "end": { + "line": 6, + "column": 9 + }, + "identifierName": "Foo" + }, + "name": "Foo" + }, + "superClass": null, + "body": { + "type": "ClassBody", + "start": 39, + "end": 60, + "loc": { + "start": { + "line": 6, + "column": 10 + }, + "end": { + "line": 9, + "column": 1 + } + }, + "body": [ + { + "type": "ClassProperty", + "start": 43, + "end": 46, + "loc": { + "start": { + "line": 7, + "column": 2 + }, + "end": { + "line": 7, + "column": 5 + } + }, + "computed": true, + "key": { + "type": "Identifier", + "start": 44, + "end": 45, + "loc": { + "start": { + "line": 7, + "column": 3 + }, + "end": { + "line": 7, + "column": 4 + }, + "identifierName": "p" + }, + "name": "p" + }, + "static": false, + "value": null + }, + { + "type": "ClassMethod", + "start": 49, + "end": 58, + "loc": { + "start": { + "line": 8, + "column": 2 + }, + "end": { + "line": 8, + "column": 11 + } + }, + "computed": true, + "key": { + "type": "Identifier", + "start": 50, + "end": 51, + "loc": { + "start": { + "line": 8, + "column": 3 + }, + "end": { + "line": 8, + "column": 4 + }, + "identifierName": "m" + }, + "name": "m" + }, + "static": false, + "kind": "method", + "id": null, + "generator": false, + "expression": false, + "async": false, + "params": [], + "body": { + "type": "BlockStatement", + "start": 56, + "end": 58, + "loc": { + "start": { + "line": 8, + "column": 9 + }, + "end": { + "line": 8, + "column": 11 + } + }, + "body": [], + "directives": [] + } + } + ] + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/test/fixtures/experimental/class-properties/computed/options.json b/test/fixtures/experimental/class-properties/computed/options.json new file mode 100644 index 0000000000..9c27576d4a --- /dev/null +++ b/test/fixtures/experimental/class-properties/computed/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["classProperties"] +}