From 06afa0761bc77664ab87007b3638bed78f051135 Mon Sep 17 00:00:00 2001 From: Kevin Gibbons Date: Sat, 17 Jun 2017 13:23:30 +0530 Subject: [PATCH 01/13] Update decorator parsing to match current spec Refer to PR #353 --- src/parser/statement.js | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/src/parser/statement.js b/src/parser/statement.js index 610f7b4f53..82490e0779 100644 --- a/src/parser/statement.js +++ b/src/parser/statement.js @@ -175,9 +175,31 @@ export default class StatementParser extends ExpressionParser { if (!this.hasPlugin("decorators")) { this.unexpected(); } + const node = this.startNode(); this.next(); - node.expression = this.parseMaybeAssign(); + + const startPos = this.state.start; + const startLoc = this.state.startLoc; + let expr = this.parseIdentifier(false); + + while (this.eat(tt.dot)) { + const node = this.startNodeAt(startPos, startLoc); + node.object = expr; + node.property = this.parseIdentifier(true); + node.computed = false; + expr = this.finishNode(node, "MemberExpression"); + } + + if (this.eat(tt.parenL)) { + const node = this.startNodeAt(startPos, startLoc); + node.callee = expr; + node.arguments = this.parseCallExpressionArguments(tt.parenR, false); + expr = this.finishNode(node, "CallExpression"); + this.toReferencedList(expr.arguments); + } + + node.expression = expr; return this.finishNode(node, "Decorator"); } From a24dc6e6301e28c8b333524b958846b15d6353ee Mon Sep 17 00:00:00 2001 From: Peeyush Kushwaha Date: Sat, 17 Jun 2017 13:25:21 +0530 Subject: [PATCH 02/13] Let decorator stage 2 parsing be under a new plugin name Parse stage 0 decorators when "decorators" plugin is active and parse stage 2 decorators when "decorators-stage-2" plugin is active --- src/parser/statement.js | 44 ++++++++++++++++++++++------------------- 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/src/parser/statement.js b/src/parser/statement.js index 82490e0779..7731c7a9f3 100644 --- a/src/parser/statement.js +++ b/src/parser/statement.js @@ -172,34 +172,38 @@ export default class StatementParser extends ExpressionParser { } parseDecorator(): N.Decorator { - if (!this.hasPlugin("decorators")) { + if (!(this.hasPlugin("decorators") || this.hasPlugin("decorators-stage-2"))) { this.unexpected(); } const node = this.startNode(); this.next(); - const startPos = this.state.start; - const startLoc = this.state.startLoc; - let expr = this.parseIdentifier(false); + if (this.hasPlugin("decorators-stage-2")) { + const startPos = this.state.start; + const startLoc = this.state.startLoc; + let expr = this.parseIdentifier(false); - while (this.eat(tt.dot)) { - const node = this.startNodeAt(startPos, startLoc); - node.object = expr; - node.property = this.parseIdentifier(true); - node.computed = false; - expr = this.finishNode(node, "MemberExpression"); + while (this.eat(tt.dot)) { + const node = this.startNodeAt(startPos, startLoc); + node.object = expr; + node.property = this.parseIdentifier(true); + node.computed = false; + expr = this.finishNode(node, "MemberExpression"); + } + + if (this.eat(tt.parenL)) { + const node = this.startNodeAt(startPos, startLoc); + node.callee = expr; + node.arguments = this.parseCallExpressionArguments(tt.parenR, false); + expr = this.finishNode(node, "CallExpression"); + this.toReferencedList(expr.arguments); + } + + node.expression = expr; + } else { + node.expression = this.parseMaybeAssign(); } - - if (this.eat(tt.parenL)) { - const node = this.startNodeAt(startPos, startLoc); - node.callee = expr; - node.arguments = this.parseCallExpressionArguments(tt.parenR, false); - expr = this.finishNode(node, "CallExpression"); - this.toReferencedList(expr.arguments); - } - - node.expression = expr; return this.finishNode(node, "Decorator"); } From 001044ffa70230fcaa9a1e236197f3284f206647 Mon Sep 17 00:00:00 2001 From: Peeyush Kushwaha Date: Sat, 17 Jun 2017 13:33:42 +0530 Subject: [PATCH 03/13] Add tests for stage 2 decorators from PR#353 --- .../class-generator/actual.js | 3 + .../class-generator/expected.json | 175 ++++++++++ .../decorators-stage-2/complex-expr/actual.js | 4 + .../complex-expr/expected.json | 325 ++++++++++++++++++ .../on-computed-name-method/actual.js | 4 + .../on-computed-name-method/expected.json | 178 ++++++++++ .../on-computed-name-prop/actual.js | 3 + .../on-computed-name-prop/expected.json | 175 ++++++++++ .../on-computed-name-prop/options.json | 3 + .../decorators-stage-2/options.json | 3 + 10 files changed, 873 insertions(+) create mode 100644 test/fixtures/experimental/decorators-stage-2/class-generator/actual.js create mode 100644 test/fixtures/experimental/decorators-stage-2/class-generator/expected.json create mode 100644 test/fixtures/experimental/decorators-stage-2/complex-expr/actual.js create mode 100644 test/fixtures/experimental/decorators-stage-2/complex-expr/expected.json create mode 100644 test/fixtures/experimental/decorators-stage-2/on-computed-name-method/actual.js create mode 100644 test/fixtures/experimental/decorators-stage-2/on-computed-name-method/expected.json create mode 100644 test/fixtures/experimental/decorators-stage-2/on-computed-name-prop/actual.js create mode 100644 test/fixtures/experimental/decorators-stage-2/on-computed-name-prop/expected.json create mode 100644 test/fixtures/experimental/decorators-stage-2/on-computed-name-prop/options.json create mode 100644 test/fixtures/experimental/decorators-stage-2/options.json diff --git a/test/fixtures/experimental/decorators-stage-2/class-generator/actual.js b/test/fixtures/experimental/decorators-stage-2/class-generator/actual.js new file mode 100644 index 0000000000..65db374bbc --- /dev/null +++ b/test/fixtures/experimental/decorators-stage-2/class-generator/actual.js @@ -0,0 +1,3 @@ +class A { + @dec *m(){} +} diff --git a/test/fixtures/experimental/decorators-stage-2/class-generator/expected.json b/test/fixtures/experimental/decorators-stage-2/class-generator/expected.json new file mode 100644 index 0000000000..a248b8b5ec --- /dev/null +++ b/test/fixtures/experimental/decorators-stage-2/class-generator/expected.json @@ -0,0 +1,175 @@ +{ + "type": "File", + "start": 0, + "end": 25, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 3, + "column": 1 + } + }, + "program": { + "type": "Program", + "start": 0, + "end": 25, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 3, + "column": 1 + } + }, + "sourceType": "script", + "body": [ + { + "type": "ClassDeclaration", + "start": 0, + "end": 25, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 3, + "column": 1 + } + }, + "id": { + "type": "Identifier", + "start": 6, + "end": 7, + "loc": { + "start": { + "line": 1, + "column": 6 + }, + "end": { + "line": 1, + "column": 7 + }, + "identifierName": "A" + }, + "name": "A" + }, + "superClass": null, + "body": { + "type": "ClassBody", + "start": 8, + "end": 25, + "loc": { + "start": { + "line": 1, + "column": 8 + }, + "end": { + "line": 3, + "column": 1 + } + }, + "body": [ + { + "type": "ClassMethod", + "start": 17, + "end": 23, + "loc": { + "start": { + "line": 2, + "column": 7 + }, + "end": { + "line": 2, + "column": 13 + } + }, + "decorators": [ + { + "type": "Decorator", + "start": 12, + "end": 16, + "loc": { + "start": { + "line": 2, + "column": 2 + }, + "end": { + "line": 2, + "column": 6 + } + }, + "expression": { + "type": "Identifier", + "start": 13, + "end": 16, + "loc": { + "start": { + "line": 2, + "column": 3 + }, + "end": { + "line": 2, + "column": 6 + }, + "identifierName": "dec" + }, + "name": "dec" + } + } + ], + "static": false, + "kind": "method", + "computed": false, + "key": { + "type": "Identifier", + "start": 18, + "end": 19, + "loc": { + "start": { + "line": 2, + "column": 8 + }, + "end": { + "line": 2, + "column": 9 + }, + "identifierName": "m" + }, + "name": "m" + }, + "id": null, + "generator": true, + "expression": false, + "async": false, + "params": [], + "body": { + "type": "BlockStatement", + "start": 21, + "end": 23, + "loc": { + "start": { + "line": 2, + "column": 11 + }, + "end": { + "line": 2, + "column": 13 + } + }, + "body": [], + "directives": [] + } + } + ] + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/test/fixtures/experimental/decorators-stage-2/complex-expr/actual.js b/test/fixtures/experimental/decorators-stage-2/complex-expr/actual.js new file mode 100644 index 0000000000..fb98deaf3d --- /dev/null +++ b/test/fixtures/experimental/decorators-stage-2/complex-expr/actual.js @@ -0,0 +1,4 @@ +class A { + @a.b.c.d(e, f) + m(){} +} diff --git a/test/fixtures/experimental/decorators-stage-2/complex-expr/expected.json b/test/fixtures/experimental/decorators-stage-2/complex-expr/expected.json new file mode 100644 index 0000000000..bc2d356463 --- /dev/null +++ b/test/fixtures/experimental/decorators-stage-2/complex-expr/expected.json @@ -0,0 +1,325 @@ +{ + "type": "File", + "start": 0, + "end": 36, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 4, + "column": 1 + } + }, + "program": { + "type": "Program", + "start": 0, + "end": 36, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 4, + "column": 1 + } + }, + "sourceType": "script", + "body": [ + { + "type": "ClassDeclaration", + "start": 0, + "end": 36, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 4, + "column": 1 + } + }, + "id": { + "type": "Identifier", + "start": 6, + "end": 7, + "loc": { + "start": { + "line": 1, + "column": 6 + }, + "end": { + "line": 1, + "column": 7 + }, + "identifierName": "A" + }, + "name": "A" + }, + "superClass": null, + "body": { + "type": "ClassBody", + "start": 8, + "end": 36, + "loc": { + "start": { + "line": 1, + "column": 8 + }, + "end": { + "line": 4, + "column": 1 + } + }, + "body": [ + { + "type": "ClassMethod", + "start": 29, + "end": 34, + "loc": { + "start": { + "line": 3, + "column": 2 + }, + "end": { + "line": 3, + "column": 7 + } + }, + "decorators": [ + { + "type": "Decorator", + "start": 12, + "end": 26, + "loc": { + "start": { + "line": 2, + "column": 2 + }, + "end": { + "line": 2, + "column": 16 + } + }, + "expression": { + "type": "CallExpression", + "start": 13, + "end": 26, + "loc": { + "start": { + "line": 2, + "column": 3 + }, + "end": { + "line": 2, + "column": 16 + } + }, + "callee": { + "type": "MemberExpression", + "start": 13, + "end": 20, + "loc": { + "start": { + "line": 2, + "column": 3 + }, + "end": { + "line": 2, + "column": 10 + } + }, + "object": { + "type": "MemberExpression", + "start": 13, + "end": 18, + "loc": { + "start": { + "line": 2, + "column": 3 + }, + "end": { + "line": 2, + "column": 8 + } + }, + "object": { + "type": "MemberExpression", + "start": 13, + "end": 16, + "loc": { + "start": { + "line": 2, + "column": 3 + }, + "end": { + "line": 2, + "column": 6 + } + }, + "object": { + "type": "Identifier", + "start": 13, + "end": 14, + "loc": { + "start": { + "line": 2, + "column": 3 + }, + "end": { + "line": 2, + "column": 4 + }, + "identifierName": "a" + }, + "name": "a" + }, + "property": { + "type": "Identifier", + "start": 15, + "end": 16, + "loc": { + "start": { + "line": 2, + "column": 5 + }, + "end": { + "line": 2, + "column": 6 + }, + "identifierName": "b" + }, + "name": "b" + }, + "computed": false + }, + "property": { + "type": "Identifier", + "start": 17, + "end": 18, + "loc": { + "start": { + "line": 2, + "column": 7 + }, + "end": { + "line": 2, + "column": 8 + }, + "identifierName": "c" + }, + "name": "c" + }, + "computed": false + }, + "property": { + "type": "Identifier", + "start": 19, + "end": 20, + "loc": { + "start": { + "line": 2, + "column": 9 + }, + "end": { + "line": 2, + "column": 10 + }, + "identifierName": "d" + }, + "name": "d" + }, + "computed": false + }, + "arguments": [ + { + "type": "Identifier", + "start": 21, + "end": 22, + "loc": { + "start": { + "line": 2, + "column": 11 + }, + "end": { + "line": 2, + "column": 12 + }, + "identifierName": "e" + }, + "name": "e" + }, + { + "type": "Identifier", + "start": 24, + "end": 25, + "loc": { + "start": { + "line": 2, + "column": 14 + }, + "end": { + "line": 2, + "column": 15 + }, + "identifierName": "f" + }, + "name": "f" + } + ] + } + } + ], + "static": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 29, + "end": 30, + "loc": { + "start": { + "line": 3, + "column": 2 + }, + "end": { + "line": 3, + "column": 3 + }, + "identifierName": "m" + }, + "name": "m" + }, + "kind": "method", + "id": null, + "generator": false, + "expression": false, + "async": false, + "params": [], + "body": { + "type": "BlockStatement", + "start": 32, + "end": 34, + "loc": { + "start": { + "line": 3, + "column": 5 + }, + "end": { + "line": 3, + "column": 7 + } + }, + "body": [], + "directives": [] + } + } + ] + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/test/fixtures/experimental/decorators-stage-2/on-computed-name-method/actual.js b/test/fixtures/experimental/decorators-stage-2/on-computed-name-method/actual.js new file mode 100644 index 0000000000..39663850c3 --- /dev/null +++ b/test/fixtures/experimental/decorators-stage-2/on-computed-name-method/actual.js @@ -0,0 +1,4 @@ +class A { + @dec + ['name'](){} +} diff --git a/test/fixtures/experimental/decorators-stage-2/on-computed-name-method/expected.json b/test/fixtures/experimental/decorators-stage-2/on-computed-name-method/expected.json new file mode 100644 index 0000000000..a9f30a4ca9 --- /dev/null +++ b/test/fixtures/experimental/decorators-stage-2/on-computed-name-method/expected.json @@ -0,0 +1,178 @@ +{ + "type": "File", + "start": 0, + "end": 33, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 4, + "column": 1 + } + }, + "program": { + "type": "Program", + "start": 0, + "end": 33, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 4, + "column": 1 + } + }, + "sourceType": "script", + "body": [ + { + "type": "ClassDeclaration", + "start": 0, + "end": 33, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 4, + "column": 1 + } + }, + "id": { + "type": "Identifier", + "start": 6, + "end": 7, + "loc": { + "start": { + "line": 1, + "column": 6 + }, + "end": { + "line": 1, + "column": 7 + }, + "identifierName": "A" + }, + "name": "A" + }, + "superClass": null, + "body": { + "type": "ClassBody", + "start": 8, + "end": 33, + "loc": { + "start": { + "line": 1, + "column": 8 + }, + "end": { + "line": 4, + "column": 1 + } + }, + "body": [ + { + "type": "ClassMethod", + "start": 19, + "end": 31, + "loc": { + "start": { + "line": 3, + "column": 2 + }, + "end": { + "line": 3, + "column": 14 + } + }, + "decorators": [ + { + "type": "Decorator", + "start": 12, + "end": 16, + "loc": { + "start": { + "line": 2, + "column": 2 + }, + "end": { + "line": 2, + "column": 6 + } + }, + "expression": { + "type": "Identifier", + "start": 13, + "end": 16, + "loc": { + "start": { + "line": 2, + "column": 3 + }, + "end": { + "line": 2, + "column": 6 + }, + "identifierName": "dec" + }, + "name": "dec" + } + } + ], + "static": false, + "computed": true, + "key": { + "type": "StringLiteral", + "start": 20, + "end": 26, + "loc": { + "start": { + "line": 3, + "column": 3 + }, + "end": { + "line": 3, + "column": 9 + } + }, + "extra": { + "rawValue": "name", + "raw": "'name'" + }, + "value": "name" + }, + "kind": "method", + "id": null, + "generator": false, + "expression": false, + "async": false, + "params": [], + "body": { + "type": "BlockStatement", + "start": 29, + "end": 31, + "loc": { + "start": { + "line": 3, + "column": 12 + }, + "end": { + "line": 3, + "column": 14 + } + }, + "body": [], + "directives": [] + } + } + ] + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/test/fixtures/experimental/decorators-stage-2/on-computed-name-prop/actual.js b/test/fixtures/experimental/decorators-stage-2/on-computed-name-prop/actual.js new file mode 100644 index 0000000000..4712d930dd --- /dev/null +++ b/test/fixtures/experimental/decorators-stage-2/on-computed-name-prop/actual.js @@ -0,0 +1,3 @@ +class A { + @dec ['name'] = 0 +} diff --git a/test/fixtures/experimental/decorators-stage-2/on-computed-name-prop/expected.json b/test/fixtures/experimental/decorators-stage-2/on-computed-name-prop/expected.json new file mode 100644 index 0000000000..718d922864 --- /dev/null +++ b/test/fixtures/experimental/decorators-stage-2/on-computed-name-prop/expected.json @@ -0,0 +1,175 @@ +{ + "type": "File", + "start": 0, + "end": 31, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 3, + "column": 1 + } + }, + "program": { + "type": "Program", + "start": 0, + "end": 31, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 3, + "column": 1 + } + }, + "sourceType": "script", + "body": [ + { + "type": "ClassDeclaration", + "start": 0, + "end": 31, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 3, + "column": 1 + } + }, + "id": { + "type": "Identifier", + "start": 6, + "end": 7, + "loc": { + "start": { + "line": 1, + "column": 6 + }, + "end": { + "line": 1, + "column": 7 + }, + "identifierName": "A" + }, + "name": "A" + }, + "superClass": null, + "body": { + "type": "ClassBody", + "start": 8, + "end": 31, + "loc": { + "start": { + "line": 1, + "column": 8 + }, + "end": { + "line": 3, + "column": 1 + } + }, + "body": [ + { + "type": "ClassProperty", + "start": 17, + "end": 29, + "loc": { + "start": { + "line": 2, + "column": 7 + }, + "end": { + "line": 2, + "column": 19 + } + }, + "decorators": [ + { + "type": "Decorator", + "start": 12, + "end": 16, + "loc": { + "start": { + "line": 2, + "column": 2 + }, + "end": { + "line": 2, + "column": 6 + } + }, + "expression": { + "type": "Identifier", + "start": 13, + "end": 16, + "loc": { + "start": { + "line": 2, + "column": 3 + }, + "end": { + "line": 2, + "column": 6 + }, + "identifierName": "dec" + }, + "name": "dec" + } + } + ], + "static": false, + "computed": true, + "key": { + "type": "StringLiteral", + "start": 18, + "end": 24, + "loc": { + "start": { + "line": 2, + "column": 8 + }, + "end": { + "line": 2, + "column": 14 + } + }, + "extra": { + "rawValue": "name", + "raw": "'name'" + }, + "value": "name" + }, + "value": { + "type": "NumericLiteral", + "start": 28, + "end": 29, + "loc": { + "start": { + "line": 2, + "column": 18 + }, + "end": { + "line": 2, + "column": 19 + } + }, + "extra": { + "rawValue": 0, + "raw": "0" + }, + "value": 0 + } + } + ] + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/test/fixtures/experimental/decorators-stage-2/on-computed-name-prop/options.json b/test/fixtures/experimental/decorators-stage-2/on-computed-name-prop/options.json new file mode 100644 index 0000000000..2974185c0c --- /dev/null +++ b/test/fixtures/experimental/decorators-stage-2/on-computed-name-prop/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["classProperties", "decorators-stage-2"] +} diff --git a/test/fixtures/experimental/decorators-stage-2/options.json b/test/fixtures/experimental/decorators-stage-2/options.json new file mode 100644 index 0000000000..80608cfffd --- /dev/null +++ b/test/fixtures/experimental/decorators-stage-2/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["decorators-stage-2"] +} From 162bc905a656bcf98e7c6b1d11893bb85c4f4b86 Mon Sep 17 00:00:00 2001 From: Peeyush Kushwaha Date: Sat, 17 Jun 2017 13:38:04 +0530 Subject: [PATCH 04/13] Throw if both decorators decorators-stage-2 used --- src/index.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/index.js b/src/index.js index 09a5c40cbe..d8e41d389a 100755 --- a/src/index.js +++ b/src/index.js @@ -62,6 +62,10 @@ function getParserClass(pluginsFromOptions: $ReadOnlyArray): Class= 0 && pluginList.indexOf("decorators-stage-2") >= 0) { + throw new Error("Cannot use decorators and decorators-stage-2 plugin together"); + } + const key = pluginList.join("/"); let cls = parserClassCache[key]; if (!cls) { From 9c639743dd0ea8c4f33f77232bb3b95698cfcd92 Mon Sep 17 00:00:00 2001 From: Peeyush Kushwaha Date: Sat, 17 Jun 2017 17:49:33 +0530 Subject: [PATCH 05/13] Disallow in object literals, params, class props And add tests to reflect the same --- src/parser/expression.js | 12 +- src/parser/lval.js | 3 + src/parser/statement.js | 5 + .../class-decorator-call-expr/actual.js | 2 + .../class-decorator-call-expr/expected.json | 154 +++++++++++ .../class-decorator/actual.js | 4 + .../class-decorator/expected.json | 117 +++++++++ .../class-method-parameter/actual.js | 3 + .../class-method-parameter/options.json | 3 + .../computed-member-expr-on-prop/actual.js | 3 + .../computed-member-expr-on-prop/options.json | 4 + .../computed-member-expression/actual.js | 6 + .../computed-member-expression/options.json | 4 + .../export-decorators-on-class/actual.js | 2 + .../export-decorators-on-class/expected.json | 116 +++++++++ .../export-decorators-on-class/options.json | 3 + .../actual.js | 7 + .../expected.json | 240 ++++++++++++++++++ .../options.json | 3 + .../function-parameters/actual.js | 1 + .../function-parameters/options.json | 3 + .../no-constructor-decorators/actual.js | 4 + .../no-constructor-decorators/options.json | 3 + .../actual.js | 2 + .../options.json | 4 + .../no-export-decorators/actual.js | 2 + .../no-export-decorators/options.json | 4 + .../decorators-stage-2/no-semi/actual.js | 4 + .../decorators-stage-2/no-semi/options.json | 3 + .../object-method-parameter/actual.js | 3 + .../object-method-parameter/options.json | 3 + .../on-computed-name-prop/expected.json | 175 ------------- .../on-computed-name-prop/options.json | 3 +- 33 files changed, 727 insertions(+), 178 deletions(-) create mode 100644 test/fixtures/experimental/decorators-stage-2/class-decorator-call-expr/actual.js create mode 100644 test/fixtures/experimental/decorators-stage-2/class-decorator-call-expr/expected.json create mode 100644 test/fixtures/experimental/decorators-stage-2/class-decorator/actual.js create mode 100644 test/fixtures/experimental/decorators-stage-2/class-decorator/expected.json create mode 100644 test/fixtures/experimental/decorators-stage-2/class-method-parameter/actual.js create mode 100644 test/fixtures/experimental/decorators-stage-2/class-method-parameter/options.json create mode 100644 test/fixtures/experimental/decorators-stage-2/computed-member-expr-on-prop/actual.js create mode 100644 test/fixtures/experimental/decorators-stage-2/computed-member-expr-on-prop/options.json create mode 100644 test/fixtures/experimental/decorators-stage-2/computed-member-expression/actual.js create mode 100644 test/fixtures/experimental/decorators-stage-2/computed-member-expression/options.json create mode 100644 test/fixtures/experimental/decorators-stage-2/export-decorators-on-class/actual.js create mode 100644 test/fixtures/experimental/decorators-stage-2/export-decorators-on-class/expected.json create mode 100644 test/fixtures/experimental/decorators-stage-2/export-decorators-on-class/options.json create mode 100644 test/fixtures/experimental/decorators-stage-2/export-default-with-nested-class/actual.js create mode 100644 test/fixtures/experimental/decorators-stage-2/export-default-with-nested-class/expected.json create mode 100644 test/fixtures/experimental/decorators-stage-2/export-default-with-nested-class/options.json create mode 100644 test/fixtures/experimental/decorators-stage-2/function-parameters/actual.js create mode 100644 test/fixtures/experimental/decorators-stage-2/function-parameters/options.json create mode 100644 test/fixtures/experimental/decorators-stage-2/no-constructor-decorators/actual.js create mode 100644 test/fixtures/experimental/decorators-stage-2/no-constructor-decorators/options.json create mode 100644 test/fixtures/experimental/decorators-stage-2/no-export-decorators-without-class/actual.js create mode 100644 test/fixtures/experimental/decorators-stage-2/no-export-decorators-without-class/options.json create mode 100644 test/fixtures/experimental/decorators-stage-2/no-export-decorators/actual.js create mode 100644 test/fixtures/experimental/decorators-stage-2/no-export-decorators/options.json create mode 100644 test/fixtures/experimental/decorators-stage-2/no-semi/actual.js create mode 100644 test/fixtures/experimental/decorators-stage-2/no-semi/options.json create mode 100644 test/fixtures/experimental/decorators-stage-2/object-method-parameter/actual.js create mode 100644 test/fixtures/experimental/decorators-stage-2/object-method-parameter/options.json delete mode 100644 test/fixtures/experimental/decorators-stage-2/on-computed-name-prop/expected.json diff --git a/src/parser/expression.js b/src/parser/expression.js index 44a9051a7e..b186920805 100644 --- a/src/parser/expression.js +++ b/src/parser/expression.js @@ -847,8 +847,16 @@ export default class ExpressionParser extends LValParser { if (this.eat(tt.braceR)) break; } - while (this.match(tt.at)) { - decorators.push(this.parseDecorator()); + if (this.match(tt.at)) { + if (this.hasPlugin("decorators-stage-2")) { + this.raise(this.state.start, "decorators-stage-2 disallows object literal property decorators"); + } else { + // we needn't check if decorators (stage 0) plugin is enabled since it's checked by + // the call to this.parseDecorator + while (this.match(tt.at)) { + decorators.push(this.parseDecorator()); + } + } } let prop = this.startNode(), isGenerator = false, isAsync = false, startPos, startLoc; diff --git a/src/parser/lval.js b/src/parser/lval.js index d3fcd02900..8e0f153cf7 100644 --- a/src/parser/lval.js +++ b/src/parser/lval.js @@ -187,6 +187,9 @@ export default class LValParser extends NodeUtils { break; } else { const decorators = []; + if (this.match(tt.at) && this.hasPlugin("decorators-stage-2")) { + this.raise(this.state.start, "Stage 2 decorators cannot be used to decorate parameters"); + } while (this.match(tt.at)) { decorators.push(this.parseDecorator()); } diff --git a/src/parser/statement.js b/src/parser/statement.js index 7731c7a9f3..361b251a98 100644 --- a/src/parser/statement.js +++ b/src/parser/statement.js @@ -709,6 +709,10 @@ export default class StatementParser extends ExpressionParser { } this.parseClassMember(classBody, member, state); + + if (this.hasPlugin("decorators-stage-2") && member.kind != "method" && member.decorators && member.decorators.length > 0) { + this.raise(member.start, "Stage 2 decorators may only be used with a class or a class method"); + } } if (decorators.length) { @@ -776,6 +780,7 @@ export default class StatementParser extends ExpressionParser { if (!methodOrProp.computed && methodOrProp.static && (methodOrProp.key.name === "prototype" || methodOrProp.key.value === "prototype")) { this.raise(methodOrProp.key.start, "Classes may not have static property named prototype"); } + if (this.isClassMethod()) { // a normal method if (this.isNonstaticConstructor(method)) { diff --git a/test/fixtures/experimental/decorators-stage-2/class-decorator-call-expr/actual.js b/test/fixtures/experimental/decorators-stage-2/class-decorator-call-expr/actual.js new file mode 100644 index 0000000000..8f69136200 --- /dev/null +++ b/test/fixtures/experimental/decorators-stage-2/class-decorator-call-expr/actual.js @@ -0,0 +1,2 @@ +@foo('bar') +class Foo {} diff --git a/test/fixtures/experimental/decorators-stage-2/class-decorator-call-expr/expected.json b/test/fixtures/experimental/decorators-stage-2/class-decorator-call-expr/expected.json new file mode 100644 index 0000000000..291ef173cc --- /dev/null +++ b/test/fixtures/experimental/decorators-stage-2/class-decorator-call-expr/expected.json @@ -0,0 +1,154 @@ +{ + "type": "File", + "start": 0, + "end": 24, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 2, + "column": 12 + } + }, + "program": { + "type": "Program", + "start": 0, + "end": 24, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 2, + "column": 12 + } + }, + "sourceType": "script", + "body": [ + { + "type": "ClassDeclaration", + "start": 12, + "end": 24, + "loc": { + "start": { + "line": 2, + "column": 0 + }, + "end": { + "line": 2, + "column": 12 + } + }, + "decorators": [ + { + "type": "Decorator", + "start": 0, + "end": 11, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 11 + } + }, + "expression": { + "type": "CallExpression", + "start": 1, + "end": 11, + "loc": { + "start": { + "line": 1, + "column": 1 + }, + "end": { + "line": 1, + "column": 11 + } + }, + "callee": { + "type": "Identifier", + "start": 1, + "end": 4, + "loc": { + "start": { + "line": 1, + "column": 1 + }, + "end": { + "line": 1, + "column": 4 + }, + "identifierName": "foo" + }, + "name": "foo" + }, + "arguments": [ + { + "type": "StringLiteral", + "start": 5, + "end": 10, + "loc": { + "start": { + "line": 1, + "column": 5 + }, + "end": { + "line": 1, + "column": 10 + } + }, + "extra": { + "rawValue": "bar", + "raw": "'bar'" + }, + "value": "bar" + } + ] + } + } + ], + "id": { + "type": "Identifier", + "start": 18, + "end": 21, + "loc": { + "start": { + "line": 2, + "column": 6 + }, + "end": { + "line": 2, + "column": 9 + }, + "identifierName": "Foo" + }, + "name": "Foo" + }, + "superClass": null, + "body": { + "type": "ClassBody", + "start": 22, + "end": 24, + "loc": { + "start": { + "line": 2, + "column": 10 + }, + "end": { + "line": 2, + "column": 12 + } + }, + "body": [] + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/test/fixtures/experimental/decorators-stage-2/class-decorator/actual.js b/test/fixtures/experimental/decorators-stage-2/class-decorator/actual.js new file mode 100644 index 0000000000..b1d1c0dd75 --- /dev/null +++ b/test/fixtures/experimental/decorators-stage-2/class-decorator/actual.js @@ -0,0 +1,4 @@ +@abc +class Foo { + +} diff --git a/test/fixtures/experimental/decorators-stage-2/class-decorator/expected.json b/test/fixtures/experimental/decorators-stage-2/class-decorator/expected.json new file mode 100644 index 0000000000..8299bdd639 --- /dev/null +++ b/test/fixtures/experimental/decorators-stage-2/class-decorator/expected.json @@ -0,0 +1,117 @@ +{ + "type": "File", + "start": 0, + "end": 19, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 4, + "column": 1 + } + }, + "program": { + "type": "Program", + "start": 0, + "end": 19, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 4, + "column": 1 + } + }, + "sourceType": "script", + "body": [ + { + "type": "ClassDeclaration", + "start": 5, + "end": 19, + "loc": { + "start": { + "line": 2, + "column": 0 + }, + "end": { + "line": 4, + "column": 1 + } + }, + "decorators": [ + { + "type": "Decorator", + "start": 0, + "end": 4, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 4 + } + }, + "expression": { + "type": "Identifier", + "start": 1, + "end": 4, + "loc": { + "start": { + "line": 1, + "column": 1 + }, + "end": { + "line": 1, + "column": 4 + }, + "identifierName": "abc" + }, + "name": "abc" + } + } + ], + "id": { + "type": "Identifier", + "start": 11, + "end": 14, + "loc": { + "start": { + "line": 2, + "column": 6 + }, + "end": { + "line": 2, + "column": 9 + }, + "identifierName": "Foo" + }, + "name": "Foo" + }, + "superClass": null, + "body": { + "type": "ClassBody", + "start": 15, + "end": 19, + "loc": { + "start": { + "line": 2, + "column": 10 + }, + "end": { + "line": 4, + "column": 1 + } + }, + "body": [] + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/test/fixtures/experimental/decorators-stage-2/class-method-parameter/actual.js b/test/fixtures/experimental/decorators-stage-2/class-method-parameter/actual.js new file mode 100644 index 0000000000..6ebf34c91e --- /dev/null +++ b/test/fixtures/experimental/decorators-stage-2/class-method-parameter/actual.js @@ -0,0 +1,3 @@ +class Foo { + constructor(@foo x) {} +} diff --git a/test/fixtures/experimental/decorators-stage-2/class-method-parameter/options.json b/test/fixtures/experimental/decorators-stage-2/class-method-parameter/options.json new file mode 100644 index 0000000000..7b4e6dc626 --- /dev/null +++ b/test/fixtures/experimental/decorators-stage-2/class-method-parameter/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Stage 2 decorators cannot be used to decorate parameters (2:14)" +} diff --git a/test/fixtures/experimental/decorators-stage-2/computed-member-expr-on-prop/actual.js b/test/fixtures/experimental/decorators-stage-2/computed-member-expr-on-prop/actual.js new file mode 100644 index 0000000000..a7c918a617 --- /dev/null +++ b/test/fixtures/experimental/decorators-stage-2/computed-member-expr-on-prop/actual.js @@ -0,0 +1,3 @@ +class Foo { + @foo[bar] a = 1; +} diff --git a/test/fixtures/experimental/decorators-stage-2/computed-member-expr-on-prop/options.json b/test/fixtures/experimental/decorators-stage-2/computed-member-expr-on-prop/options.json new file mode 100644 index 0000000000..d1e493e091 --- /dev/null +++ b/test/fixtures/experimental/decorators-stage-2/computed-member-expr-on-prop/options.json @@ -0,0 +1,4 @@ +{ + "plugins": ["decorators-stage-2", "classProperties"], + "throws": "Unexpected token (2:12)" +} diff --git a/test/fixtures/experimental/decorators-stage-2/computed-member-expression/actual.js b/test/fixtures/experimental/decorators-stage-2/computed-member-expression/actual.js new file mode 100644 index 0000000000..f261291097 --- /dev/null +++ b/test/fixtures/experimental/decorators-stage-2/computed-member-expression/actual.js @@ -0,0 +1,6 @@ +class Foo { + @bar[bizz] + abc() { + + } +} diff --git a/test/fixtures/experimental/decorators-stage-2/computed-member-expression/options.json b/test/fixtures/experimental/decorators-stage-2/computed-member-expression/options.json new file mode 100644 index 0000000000..a4c63d917c --- /dev/null +++ b/test/fixtures/experimental/decorators-stage-2/computed-member-expression/options.json @@ -0,0 +1,4 @@ +{ + "plugins": ["decorators-stage-2", "classProperties"], + "throws": "Stage 2 decorators may only be used with a class or a class method (2:6)" +} diff --git a/test/fixtures/experimental/decorators-stage-2/export-decorators-on-class/actual.js b/test/fixtures/experimental/decorators-stage-2/export-decorators-on-class/actual.js new file mode 100644 index 0000000000..51804c6056 --- /dev/null +++ b/test/fixtures/experimental/decorators-stage-2/export-decorators-on-class/actual.js @@ -0,0 +1,2 @@ +@foo +export default class {} \ No newline at end of file diff --git a/test/fixtures/experimental/decorators-stage-2/export-decorators-on-class/expected.json b/test/fixtures/experimental/decorators-stage-2/export-decorators-on-class/expected.json new file mode 100644 index 0000000000..6933de60e7 --- /dev/null +++ b/test/fixtures/experimental/decorators-stage-2/export-decorators-on-class/expected.json @@ -0,0 +1,116 @@ +{ + "type": "File", + "start": 0, + "end": 28, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 2, + "column": 23 + } + }, + "program": { + "type": "Program", + "start": 0, + "end": 28, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 2, + "column": 23 + } + }, + "sourceType": "module", + "body": [ + { + "type": "ExportDefaultDeclaration", + "start": 5, + "end": 28, + "loc": { + "start": { + "line": 2, + "column": 0 + }, + "end": { + "line": 2, + "column": 23 + } + }, + "declaration": { + "type": "ClassDeclaration", + "start": 20, + "end": 28, + "loc": { + "start": { + "line": 2, + "column": 15 + }, + "end": { + "line": 2, + "column": 23 + } + }, + "decorators": [ + { + "type": "Decorator", + "start": 0, + "end": 4, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 4 + } + }, + "expression": { + "type": "Identifier", + "start": 1, + "end": 4, + "loc": { + "start": { + "line": 1, + "column": 1 + }, + "end": { + "line": 1, + "column": 4 + }, + "identifierName": "foo" + }, + "name": "foo" + } + } + ], + "id": null, + "superClass": null, + "body": { + "type": "ClassBody", + "start": 26, + "end": 28, + "loc": { + "start": { + "line": 2, + "column": 21 + }, + "end": { + "line": 2, + "column": 23 + } + }, + "body": [] + } + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/test/fixtures/experimental/decorators-stage-2/export-decorators-on-class/options.json b/test/fixtures/experimental/decorators-stage-2/export-decorators-on-class/options.json new file mode 100644 index 0000000000..2104ca4328 --- /dev/null +++ b/test/fixtures/experimental/decorators-stage-2/export-decorators-on-class/options.json @@ -0,0 +1,3 @@ +{ + "sourceType": "module" +} diff --git a/test/fixtures/experimental/decorators-stage-2/export-default-with-nested-class/actual.js b/test/fixtures/experimental/decorators-stage-2/export-default-with-nested-class/actual.js new file mode 100644 index 0000000000..d0d8d6c4ec --- /dev/null +++ b/test/fixtures/experimental/decorators-stage-2/export-default-with-nested-class/actual.js @@ -0,0 +1,7 @@ +@ParentDecorator +export default class ParentClass { + makeNestedClass() { + class NestedClass { + } + } +} diff --git a/test/fixtures/experimental/decorators-stage-2/export-default-with-nested-class/expected.json b/test/fixtures/experimental/decorators-stage-2/export-default-with-nested-class/expected.json new file mode 100644 index 0000000000..2c797decfc --- /dev/null +++ b/test/fixtures/experimental/decorators-stage-2/export-default-with-nested-class/expected.json @@ -0,0 +1,240 @@ +{ + "type": "File", + "start": 0, + "end": 109, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 7, + "column": 1 + } + }, + "program": { + "type": "Program", + "start": 0, + "end": 109, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 7, + "column": 1 + } + }, + "sourceType": "module", + "body": [ + { + "type": "ExportDefaultDeclaration", + "start": 17, + "end": 109, + "loc": { + "start": { + "line": 2, + "column": 0 + }, + "end": { + "line": 7, + "column": 1 + } + }, + "declaration": { + "type": "ClassDeclaration", + "start": 32, + "end": 109, + "loc": { + "start": { + "line": 2, + "column": 15 + }, + "end": { + "line": 7, + "column": 1 + } + }, + "decorators": [ + { + "type": "Decorator", + "start": 0, + "end": 16, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 1, + "column": 16 + } + }, + "expression": { + "type": "Identifier", + "start": 1, + "end": 16, + "loc": { + "start": { + "line": 1, + "column": 1 + }, + "end": { + "line": 1, + "column": 16 + }, + "identifierName": "ParentDecorator" + }, + "name": "ParentDecorator" + } + } + ], + "id": { + "type": "Identifier", + "start": 38, + "end": 49, + "loc": { + "start": { + "line": 2, + "column": 21 + }, + "end": { + "line": 2, + "column": 32 + }, + "identifierName": "ParentClass" + }, + "name": "ParentClass" + }, + "superClass": null, + "body": { + "type": "ClassBody", + "start": 50, + "end": 109, + "loc": { + "start": { + "line": 2, + "column": 33 + }, + "end": { + "line": 7, + "column": 1 + } + }, + "body": [ + { + "type": "ClassMethod", + "start": 54, + "end": 107, + "loc": { + "start": { + "line": 3, + "column": 2 + }, + "end": { + "line": 6, + "column": 3 + } + }, + "static": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 54, + "end": 69, + "loc": { + "start": { + "line": 3, + "column": 2 + }, + "end": { + "line": 3, + "column": 17 + }, + "identifierName": "makeNestedClass" + }, + "name": "makeNestedClass" + }, + "kind": "method", + "id": null, + "generator": false, + "expression": false, + "async": false, + "params": [], + "body": { + "type": "BlockStatement", + "start": 72, + "end": 107, + "loc": { + "start": { + "line": 3, + "column": 20 + }, + "end": { + "line": 6, + "column": 3 + } + }, + "body": [ + { + "type": "ClassDeclaration", + "start": 78, + "end": 103, + "loc": { + "start": { + "line": 4, + "column": 4 + }, + "end": { + "line": 5, + "column": 5 + } + }, + "id": { + "type": "Identifier", + "start": 84, + "end": 95, + "loc": { + "start": { + "line": 4, + "column": 10 + }, + "end": { + "line": 4, + "column": 21 + }, + "identifierName": "NestedClass" + }, + "name": "NestedClass" + }, + "superClass": null, + "body": { + "type": "ClassBody", + "start": 96, + "end": 103, + "loc": { + "start": { + "line": 4, + "column": 22 + }, + "end": { + "line": 5, + "column": 5 + } + }, + "body": [] + } + } + ], + "directives": [] + } + } + ] + } + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/test/fixtures/experimental/decorators-stage-2/export-default-with-nested-class/options.json b/test/fixtures/experimental/decorators-stage-2/export-default-with-nested-class/options.json new file mode 100644 index 0000000000..2104ca4328 --- /dev/null +++ b/test/fixtures/experimental/decorators-stage-2/export-default-with-nested-class/options.json @@ -0,0 +1,3 @@ +{ + "sourceType": "module" +} diff --git a/test/fixtures/experimental/decorators-stage-2/function-parameters/actual.js b/test/fixtures/experimental/decorators-stage-2/function-parameters/actual.js new file mode 100644 index 0000000000..857c046452 --- /dev/null +++ b/test/fixtures/experimental/decorators-stage-2/function-parameters/actual.js @@ -0,0 +1 @@ +function func(@foo x) {} diff --git a/test/fixtures/experimental/decorators-stage-2/function-parameters/options.json b/test/fixtures/experimental/decorators-stage-2/function-parameters/options.json new file mode 100644 index 0000000000..6637fc7f83 --- /dev/null +++ b/test/fixtures/experimental/decorators-stage-2/function-parameters/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Stage 2 decorators cannot be used to decorate parameters (1:14)" +} diff --git a/test/fixtures/experimental/decorators-stage-2/no-constructor-decorators/actual.js b/test/fixtures/experimental/decorators-stage-2/no-constructor-decorators/actual.js new file mode 100644 index 0000000000..4387084bbf --- /dev/null +++ b/test/fixtures/experimental/decorators-stage-2/no-constructor-decorators/actual.js @@ -0,0 +1,4 @@ +class Foo { + @abc + constructor(){} +} diff --git a/test/fixtures/experimental/decorators-stage-2/no-constructor-decorators/options.json b/test/fixtures/experimental/decorators-stage-2/no-constructor-decorators/options.json new file mode 100644 index 0000000000..c0baef5996 --- /dev/null +++ b/test/fixtures/experimental/decorators-stage-2/no-constructor-decorators/options.json @@ -0,0 +1,3 @@ +{ + "throws": "You can't attach decorators to a class constructor (3:2)" +} diff --git a/test/fixtures/experimental/decorators-stage-2/no-export-decorators-without-class/actual.js b/test/fixtures/experimental/decorators-stage-2/no-export-decorators-without-class/actual.js new file mode 100644 index 0000000000..c5a55d643f --- /dev/null +++ b/test/fixtures/experimental/decorators-stage-2/no-export-decorators-without-class/actual.js @@ -0,0 +1,2 @@ +@foo +export default function f(){}; \ No newline at end of file diff --git a/test/fixtures/experimental/decorators-stage-2/no-export-decorators-without-class/options.json b/test/fixtures/experimental/decorators-stage-2/no-export-decorators-without-class/options.json new file mode 100644 index 0000000000..61c2c23daa --- /dev/null +++ b/test/fixtures/experimental/decorators-stage-2/no-export-decorators-without-class/options.json @@ -0,0 +1,4 @@ +{ + "throws": "You can only use decorators on an export when exporting a class (2:0)", + "sourceType": "module" +} diff --git a/test/fixtures/experimental/decorators-stage-2/no-export-decorators/actual.js b/test/fixtures/experimental/decorators-stage-2/no-export-decorators/actual.js new file mode 100644 index 0000000000..4630d555a4 --- /dev/null +++ b/test/fixtures/experimental/decorators-stage-2/no-export-decorators/actual.js @@ -0,0 +1,2 @@ +@foo +export default 0; \ No newline at end of file diff --git a/test/fixtures/experimental/decorators-stage-2/no-export-decorators/options.json b/test/fixtures/experimental/decorators-stage-2/no-export-decorators/options.json new file mode 100644 index 0000000000..61c2c23daa --- /dev/null +++ b/test/fixtures/experimental/decorators-stage-2/no-export-decorators/options.json @@ -0,0 +1,4 @@ +{ + "throws": "You can only use decorators on an export when exporting a class (2:0)", + "sourceType": "module" +} diff --git a/test/fixtures/experimental/decorators-stage-2/no-semi/actual.js b/test/fixtures/experimental/decorators-stage-2/no-semi/actual.js new file mode 100644 index 0000000000..6138e9c6f9 --- /dev/null +++ b/test/fixtures/experimental/decorators-stage-2/no-semi/actual.js @@ -0,0 +1,4 @@ +class A { + @a; + m(){} +} diff --git a/test/fixtures/experimental/decorators-stage-2/no-semi/options.json b/test/fixtures/experimental/decorators-stage-2/no-semi/options.json new file mode 100644 index 0000000000..ffac21b695 --- /dev/null +++ b/test/fixtures/experimental/decorators-stage-2/no-semi/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Decorators must not be followed by a semicolon (2:5)" +} diff --git a/test/fixtures/experimental/decorators-stage-2/object-method-parameter/actual.js b/test/fixtures/experimental/decorators-stage-2/object-method-parameter/actual.js new file mode 100644 index 0000000000..a1aed846a9 --- /dev/null +++ b/test/fixtures/experimental/decorators-stage-2/object-method-parameter/actual.js @@ -0,0 +1,3 @@ +var obj = { + method(@foo x) {} +}; diff --git a/test/fixtures/experimental/decorators-stage-2/object-method-parameter/options.json b/test/fixtures/experimental/decorators-stage-2/object-method-parameter/options.json new file mode 100644 index 0000000000..b173069693 --- /dev/null +++ b/test/fixtures/experimental/decorators-stage-2/object-method-parameter/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Stage 2 decorators cannot be used to decorate parameters (2:9)" +} diff --git a/test/fixtures/experimental/decorators-stage-2/on-computed-name-prop/expected.json b/test/fixtures/experimental/decorators-stage-2/on-computed-name-prop/expected.json deleted file mode 100644 index 718d922864..0000000000 --- a/test/fixtures/experimental/decorators-stage-2/on-computed-name-prop/expected.json +++ /dev/null @@ -1,175 +0,0 @@ -{ - "type": "File", - "start": 0, - "end": 31, - "loc": { - "start": { - "line": 1, - "column": 0 - }, - "end": { - "line": 3, - "column": 1 - } - }, - "program": { - "type": "Program", - "start": 0, - "end": 31, - "loc": { - "start": { - "line": 1, - "column": 0 - }, - "end": { - "line": 3, - "column": 1 - } - }, - "sourceType": "script", - "body": [ - { - "type": "ClassDeclaration", - "start": 0, - "end": 31, - "loc": { - "start": { - "line": 1, - "column": 0 - }, - "end": { - "line": 3, - "column": 1 - } - }, - "id": { - "type": "Identifier", - "start": 6, - "end": 7, - "loc": { - "start": { - "line": 1, - "column": 6 - }, - "end": { - "line": 1, - "column": 7 - }, - "identifierName": "A" - }, - "name": "A" - }, - "superClass": null, - "body": { - "type": "ClassBody", - "start": 8, - "end": 31, - "loc": { - "start": { - "line": 1, - "column": 8 - }, - "end": { - "line": 3, - "column": 1 - } - }, - "body": [ - { - "type": "ClassProperty", - "start": 17, - "end": 29, - "loc": { - "start": { - "line": 2, - "column": 7 - }, - "end": { - "line": 2, - "column": 19 - } - }, - "decorators": [ - { - "type": "Decorator", - "start": 12, - "end": 16, - "loc": { - "start": { - "line": 2, - "column": 2 - }, - "end": { - "line": 2, - "column": 6 - } - }, - "expression": { - "type": "Identifier", - "start": 13, - "end": 16, - "loc": { - "start": { - "line": 2, - "column": 3 - }, - "end": { - "line": 2, - "column": 6 - }, - "identifierName": "dec" - }, - "name": "dec" - } - } - ], - "static": false, - "computed": true, - "key": { - "type": "StringLiteral", - "start": 18, - "end": 24, - "loc": { - "start": { - "line": 2, - "column": 8 - }, - "end": { - "line": 2, - "column": 14 - } - }, - "extra": { - "rawValue": "name", - "raw": "'name'" - }, - "value": "name" - }, - "value": { - "type": "NumericLiteral", - "start": 28, - "end": 29, - "loc": { - "start": { - "line": 2, - "column": 18 - }, - "end": { - "line": 2, - "column": 19 - } - }, - "extra": { - "rawValue": 0, - "raw": "0" - }, - "value": 0 - } - } - ] - } - } - ], - "directives": [] - } -} \ No newline at end of file diff --git a/test/fixtures/experimental/decorators-stage-2/on-computed-name-prop/options.json b/test/fixtures/experimental/decorators-stage-2/on-computed-name-prop/options.json index 2974185c0c..481f6730cc 100644 --- a/test/fixtures/experimental/decorators-stage-2/on-computed-name-prop/options.json +++ b/test/fixtures/experimental/decorators-stage-2/on-computed-name-prop/options.json @@ -1,3 +1,4 @@ { - "plugins": ["classProperties", "decorators-stage-2"] + "plugins": ["classProperties", "decorators-stage-2"], + "throws": "Stage 2 decorators may only be used with a class or a class method (2:7)" } From b5e23835ce6875605078adc4c8142a1214fc3007 Mon Sep 17 00:00:00 2001 From: Peeyush Kushwaha Date: Sat, 17 Jun 2017 18:12:14 +0530 Subject: [PATCH 06/13] Disallow exports between decorator & class body For stage 2 decorators --- src/parser/statement.js | 4 + .../export-decorators-on-class/expected.json | 116 --------- .../export-decorators-on-class/options.json | 3 +- .../actual.js | 7 - .../expected.json | 240 ------------------ .../options.json | 3 - .../actual.js | 2 - .../options.json | 4 - .../no-export-decorators/actual.js | 2 - .../no-export-decorators/options.json | 4 - 10 files changed, 6 insertions(+), 379 deletions(-) delete mode 100644 test/fixtures/experimental/decorators-stage-2/export-decorators-on-class/expected.json delete mode 100644 test/fixtures/experimental/decorators-stage-2/export-default-with-nested-class/actual.js delete mode 100644 test/fixtures/experimental/decorators-stage-2/export-default-with-nested-class/expected.json delete mode 100644 test/fixtures/experimental/decorators-stage-2/export-default-with-nested-class/options.json delete mode 100644 test/fixtures/experimental/decorators-stage-2/no-export-decorators-without-class/actual.js delete mode 100644 test/fixtures/experimental/decorators-stage-2/no-export-decorators-without-class/options.json delete mode 100644 test/fixtures/experimental/decorators-stage-2/no-export-decorators/actual.js delete mode 100644 test/fixtures/experimental/decorators-stage-2/no-export-decorators/options.json diff --git a/src/parser/statement.js b/src/parser/statement.js index 361b251a98..726ed65922 100644 --- a/src/parser/statement.js +++ b/src/parser/statement.js @@ -157,6 +157,10 @@ export default class StatementParser extends ExpressionParser { } parseDecorators(allowExport?: boolean): void { + if (this.hasPlugin("decorators-stage-2")) { + allowExport = false; + } + while (this.match(tt.at)) { const decorator = this.parseDecorator(); this.state.decorators.push(decorator); diff --git a/test/fixtures/experimental/decorators-stage-2/export-decorators-on-class/expected.json b/test/fixtures/experimental/decorators-stage-2/export-decorators-on-class/expected.json deleted file mode 100644 index 6933de60e7..0000000000 --- a/test/fixtures/experimental/decorators-stage-2/export-decorators-on-class/expected.json +++ /dev/null @@ -1,116 +0,0 @@ -{ - "type": "File", - "start": 0, - "end": 28, - "loc": { - "start": { - "line": 1, - "column": 0 - }, - "end": { - "line": 2, - "column": 23 - } - }, - "program": { - "type": "Program", - "start": 0, - "end": 28, - "loc": { - "start": { - "line": 1, - "column": 0 - }, - "end": { - "line": 2, - "column": 23 - } - }, - "sourceType": "module", - "body": [ - { - "type": "ExportDefaultDeclaration", - "start": 5, - "end": 28, - "loc": { - "start": { - "line": 2, - "column": 0 - }, - "end": { - "line": 2, - "column": 23 - } - }, - "declaration": { - "type": "ClassDeclaration", - "start": 20, - "end": 28, - "loc": { - "start": { - "line": 2, - "column": 15 - }, - "end": { - "line": 2, - "column": 23 - } - }, - "decorators": [ - { - "type": "Decorator", - "start": 0, - "end": 4, - "loc": { - "start": { - "line": 1, - "column": 0 - }, - "end": { - "line": 1, - "column": 4 - } - }, - "expression": { - "type": "Identifier", - "start": 1, - "end": 4, - "loc": { - "start": { - "line": 1, - "column": 1 - }, - "end": { - "line": 1, - "column": 4 - }, - "identifierName": "foo" - }, - "name": "foo" - } - } - ], - "id": null, - "superClass": null, - "body": { - "type": "ClassBody", - "start": 26, - "end": 28, - "loc": { - "start": { - "line": 2, - "column": 21 - }, - "end": { - "line": 2, - "column": 23 - } - }, - "body": [] - } - } - } - ], - "directives": [] - } -} \ No newline at end of file diff --git a/test/fixtures/experimental/decorators-stage-2/export-decorators-on-class/options.json b/test/fixtures/experimental/decorators-stage-2/export-decorators-on-class/options.json index 2104ca4328..43922816e1 100644 --- a/test/fixtures/experimental/decorators-stage-2/export-decorators-on-class/options.json +++ b/test/fixtures/experimental/decorators-stage-2/export-decorators-on-class/options.json @@ -1,3 +1,4 @@ { - "sourceType": "module" + "sourceType": "module", + "throws": "Leading decorators must be attached to a class declaration (2:0)" } diff --git a/test/fixtures/experimental/decorators-stage-2/export-default-with-nested-class/actual.js b/test/fixtures/experimental/decorators-stage-2/export-default-with-nested-class/actual.js deleted file mode 100644 index d0d8d6c4ec..0000000000 --- a/test/fixtures/experimental/decorators-stage-2/export-default-with-nested-class/actual.js +++ /dev/null @@ -1,7 +0,0 @@ -@ParentDecorator -export default class ParentClass { - makeNestedClass() { - class NestedClass { - } - } -} diff --git a/test/fixtures/experimental/decorators-stage-2/export-default-with-nested-class/expected.json b/test/fixtures/experimental/decorators-stage-2/export-default-with-nested-class/expected.json deleted file mode 100644 index 2c797decfc..0000000000 --- a/test/fixtures/experimental/decorators-stage-2/export-default-with-nested-class/expected.json +++ /dev/null @@ -1,240 +0,0 @@ -{ - "type": "File", - "start": 0, - "end": 109, - "loc": { - "start": { - "line": 1, - "column": 0 - }, - "end": { - "line": 7, - "column": 1 - } - }, - "program": { - "type": "Program", - "start": 0, - "end": 109, - "loc": { - "start": { - "line": 1, - "column": 0 - }, - "end": { - "line": 7, - "column": 1 - } - }, - "sourceType": "module", - "body": [ - { - "type": "ExportDefaultDeclaration", - "start": 17, - "end": 109, - "loc": { - "start": { - "line": 2, - "column": 0 - }, - "end": { - "line": 7, - "column": 1 - } - }, - "declaration": { - "type": "ClassDeclaration", - "start": 32, - "end": 109, - "loc": { - "start": { - "line": 2, - "column": 15 - }, - "end": { - "line": 7, - "column": 1 - } - }, - "decorators": [ - { - "type": "Decorator", - "start": 0, - "end": 16, - "loc": { - "start": { - "line": 1, - "column": 0 - }, - "end": { - "line": 1, - "column": 16 - } - }, - "expression": { - "type": "Identifier", - "start": 1, - "end": 16, - "loc": { - "start": { - "line": 1, - "column": 1 - }, - "end": { - "line": 1, - "column": 16 - }, - "identifierName": "ParentDecorator" - }, - "name": "ParentDecorator" - } - } - ], - "id": { - "type": "Identifier", - "start": 38, - "end": 49, - "loc": { - "start": { - "line": 2, - "column": 21 - }, - "end": { - "line": 2, - "column": 32 - }, - "identifierName": "ParentClass" - }, - "name": "ParentClass" - }, - "superClass": null, - "body": { - "type": "ClassBody", - "start": 50, - "end": 109, - "loc": { - "start": { - "line": 2, - "column": 33 - }, - "end": { - "line": 7, - "column": 1 - } - }, - "body": [ - { - "type": "ClassMethod", - "start": 54, - "end": 107, - "loc": { - "start": { - "line": 3, - "column": 2 - }, - "end": { - "line": 6, - "column": 3 - } - }, - "static": false, - "computed": false, - "key": { - "type": "Identifier", - "start": 54, - "end": 69, - "loc": { - "start": { - "line": 3, - "column": 2 - }, - "end": { - "line": 3, - "column": 17 - }, - "identifierName": "makeNestedClass" - }, - "name": "makeNestedClass" - }, - "kind": "method", - "id": null, - "generator": false, - "expression": false, - "async": false, - "params": [], - "body": { - "type": "BlockStatement", - "start": 72, - "end": 107, - "loc": { - "start": { - "line": 3, - "column": 20 - }, - "end": { - "line": 6, - "column": 3 - } - }, - "body": [ - { - "type": "ClassDeclaration", - "start": 78, - "end": 103, - "loc": { - "start": { - "line": 4, - "column": 4 - }, - "end": { - "line": 5, - "column": 5 - } - }, - "id": { - "type": "Identifier", - "start": 84, - "end": 95, - "loc": { - "start": { - "line": 4, - "column": 10 - }, - "end": { - "line": 4, - "column": 21 - }, - "identifierName": "NestedClass" - }, - "name": "NestedClass" - }, - "superClass": null, - "body": { - "type": "ClassBody", - "start": 96, - "end": 103, - "loc": { - "start": { - "line": 4, - "column": 22 - }, - "end": { - "line": 5, - "column": 5 - } - }, - "body": [] - } - } - ], - "directives": [] - } - } - ] - } - } - } - ], - "directives": [] - } -} \ No newline at end of file diff --git a/test/fixtures/experimental/decorators-stage-2/export-default-with-nested-class/options.json b/test/fixtures/experimental/decorators-stage-2/export-default-with-nested-class/options.json deleted file mode 100644 index 2104ca4328..0000000000 --- a/test/fixtures/experimental/decorators-stage-2/export-default-with-nested-class/options.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "sourceType": "module" -} diff --git a/test/fixtures/experimental/decorators-stage-2/no-export-decorators-without-class/actual.js b/test/fixtures/experimental/decorators-stage-2/no-export-decorators-without-class/actual.js deleted file mode 100644 index c5a55d643f..0000000000 --- a/test/fixtures/experimental/decorators-stage-2/no-export-decorators-without-class/actual.js +++ /dev/null @@ -1,2 +0,0 @@ -@foo -export default function f(){}; \ No newline at end of file diff --git a/test/fixtures/experimental/decorators-stage-2/no-export-decorators-without-class/options.json b/test/fixtures/experimental/decorators-stage-2/no-export-decorators-without-class/options.json deleted file mode 100644 index 61c2c23daa..0000000000 --- a/test/fixtures/experimental/decorators-stage-2/no-export-decorators-without-class/options.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "throws": "You can only use decorators on an export when exporting a class (2:0)", - "sourceType": "module" -} diff --git a/test/fixtures/experimental/decorators-stage-2/no-export-decorators/actual.js b/test/fixtures/experimental/decorators-stage-2/no-export-decorators/actual.js deleted file mode 100644 index 4630d555a4..0000000000 --- a/test/fixtures/experimental/decorators-stage-2/no-export-decorators/actual.js +++ /dev/null @@ -1,2 +0,0 @@ -@foo -export default 0; \ No newline at end of file diff --git a/test/fixtures/experimental/decorators-stage-2/no-export-decorators/options.json b/test/fixtures/experimental/decorators-stage-2/no-export-decorators/options.json deleted file mode 100644 index 61c2c23daa..0000000000 --- a/test/fixtures/experimental/decorators-stage-2/no-export-decorators/options.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "throws": "You can only use decorators on an export when exporting a class (2:0)", - "sourceType": "module" -} From 38c417e9710c0672eaea2e1ea66540095630fef0 Mon Sep 17 00:00:00 2001 From: Peeyush Kushwaha Date: Sun, 18 Jun 2017 01:25:54 +0530 Subject: [PATCH 07/13] Reorganize tests; camelCase plugin name --- src/index.js | 4 ++-- src/parser/expression.js | 4 ++-- src/parser/lval.js | 2 +- src/parser/statement.js | 8 ++++---- .../computed-member-expr-on-prop/options.json | 2 +- .../computed-member-expression/options.json | 2 +- .../actual.js | 0 .../options.json | 0 .../actual.js | 0 .../options.json | 2 +- .../actual.js | 0 .../options.json | 0 .../actual.js | 0 .../options.json | 0 .../actual.js | 0 .../options.json | 0 .../fixtures/experimental/decorators-stage-2/options.json | 2 +- 17 files changed, 13 insertions(+), 13 deletions(-) rename test/fixtures/experimental/decorators-stage-2/{class-method-parameter => no-class-method-parameter}/actual.js (100%) rename test/fixtures/experimental/decorators-stage-2/{class-method-parameter => no-class-method-parameter}/options.json (100%) rename test/fixtures/experimental/decorators-stage-2/{on-computed-name-prop => no-computed-name-prop}/actual.js (100%) rename test/fixtures/experimental/decorators-stage-2/{on-computed-name-prop => no-computed-name-prop}/options.json (61%) rename test/fixtures/experimental/decorators-stage-2/{export-decorators-on-class => no-export-decorators-on-class}/actual.js (100%) rename test/fixtures/experimental/decorators-stage-2/{export-decorators-on-class => no-export-decorators-on-class}/options.json (100%) rename test/fixtures/experimental/decorators-stage-2/{function-parameters => no-function-parameters}/actual.js (100%) rename test/fixtures/experimental/decorators-stage-2/{function-parameters => no-function-parameters}/options.json (100%) rename test/fixtures/experimental/decorators-stage-2/{object-method-parameter => no-object-method-parameters}/actual.js (100%) rename test/fixtures/experimental/decorators-stage-2/{object-method-parameter => no-object-method-parameters}/options.json (100%) diff --git a/src/index.js b/src/index.js index d8e41d389a..8ebcb0c7be 100755 --- a/src/index.js +++ b/src/index.js @@ -62,8 +62,8 @@ function getParserClass(pluginsFromOptions: $ReadOnlyArray): Class= 0 && pluginList.indexOf("decorators-stage-2") >= 0) { - throw new Error("Cannot use decorators and decorators-stage-2 plugin together"); + if (pluginList.indexOf("decorators") >= 0 && pluginList.indexOf("decoratorsStage2") >= 0) { + throw new Error("Cannot use decorators and decoratorsStage2 plugin together"); } const key = pluginList.join("/"); diff --git a/src/parser/expression.js b/src/parser/expression.js index b186920805..6b0f3464b3 100644 --- a/src/parser/expression.js +++ b/src/parser/expression.js @@ -848,8 +848,8 @@ export default class ExpressionParser extends LValParser { } if (this.match(tt.at)) { - if (this.hasPlugin("decorators-stage-2")) { - this.raise(this.state.start, "decorators-stage-2 disallows object literal property decorators"); + if (this.hasPlugin("decoratorsStage2")) { + this.raise(this.state.start, "Stage 2 decorators disallow object literal property decorators"); } else { // we needn't check if decorators (stage 0) plugin is enabled since it's checked by // the call to this.parseDecorator diff --git a/src/parser/lval.js b/src/parser/lval.js index 8e0f153cf7..f642b467c5 100644 --- a/src/parser/lval.js +++ b/src/parser/lval.js @@ -187,7 +187,7 @@ export default class LValParser extends NodeUtils { break; } else { const decorators = []; - if (this.match(tt.at) && this.hasPlugin("decorators-stage-2")) { + if (this.match(tt.at) && this.hasPlugin("decoratorsStage2")) { this.raise(this.state.start, "Stage 2 decorators cannot be used to decorate parameters"); } while (this.match(tt.at)) { diff --git a/src/parser/statement.js b/src/parser/statement.js index 726ed65922..2e887a7e85 100644 --- a/src/parser/statement.js +++ b/src/parser/statement.js @@ -157,7 +157,7 @@ export default class StatementParser extends ExpressionParser { } parseDecorators(allowExport?: boolean): void { - if (this.hasPlugin("decorators-stage-2")) { + if (this.hasPlugin("decoratorsStage2")) { allowExport = false; } @@ -176,14 +176,14 @@ export default class StatementParser extends ExpressionParser { } parseDecorator(): N.Decorator { - if (!(this.hasPlugin("decorators") || this.hasPlugin("decorators-stage-2"))) { + if (!(this.hasPlugin("decorators") || this.hasPlugin("decoratorsStage2"))) { this.unexpected(); } const node = this.startNode(); this.next(); - if (this.hasPlugin("decorators-stage-2")) { + if (this.hasPlugin("decoratorsStage2")) { const startPos = this.state.start; const startLoc = this.state.startLoc; let expr = this.parseIdentifier(false); @@ -714,7 +714,7 @@ export default class StatementParser extends ExpressionParser { this.parseClassMember(classBody, member, state); - if (this.hasPlugin("decorators-stage-2") && member.kind != "method" && member.decorators && member.decorators.length > 0) { + if (this.hasPlugin("decoratorsStage2") && member.kind != "method" && member.decorators && member.decorators.length > 0) { this.raise(member.start, "Stage 2 decorators may only be used with a class or a class method"); } } diff --git a/test/fixtures/experimental/decorators-stage-2/computed-member-expr-on-prop/options.json b/test/fixtures/experimental/decorators-stage-2/computed-member-expr-on-prop/options.json index d1e493e091..68c749fda9 100644 --- a/test/fixtures/experimental/decorators-stage-2/computed-member-expr-on-prop/options.json +++ b/test/fixtures/experimental/decorators-stage-2/computed-member-expr-on-prop/options.json @@ -1,4 +1,4 @@ { - "plugins": ["decorators-stage-2", "classProperties"], + "plugins": ["decoratorsStage2", "classProperties"], "throws": "Unexpected token (2:12)" } diff --git a/test/fixtures/experimental/decorators-stage-2/computed-member-expression/options.json b/test/fixtures/experimental/decorators-stage-2/computed-member-expression/options.json index a4c63d917c..acf8362a77 100644 --- a/test/fixtures/experimental/decorators-stage-2/computed-member-expression/options.json +++ b/test/fixtures/experimental/decorators-stage-2/computed-member-expression/options.json @@ -1,4 +1,4 @@ { - "plugins": ["decorators-stage-2", "classProperties"], + "plugins": ["decoratorsStage2", "classProperties"], "throws": "Stage 2 decorators may only be used with a class or a class method (2:6)" } diff --git a/test/fixtures/experimental/decorators-stage-2/class-method-parameter/actual.js b/test/fixtures/experimental/decorators-stage-2/no-class-method-parameter/actual.js similarity index 100% rename from test/fixtures/experimental/decorators-stage-2/class-method-parameter/actual.js rename to test/fixtures/experimental/decorators-stage-2/no-class-method-parameter/actual.js diff --git a/test/fixtures/experimental/decorators-stage-2/class-method-parameter/options.json b/test/fixtures/experimental/decorators-stage-2/no-class-method-parameter/options.json similarity index 100% rename from test/fixtures/experimental/decorators-stage-2/class-method-parameter/options.json rename to test/fixtures/experimental/decorators-stage-2/no-class-method-parameter/options.json diff --git a/test/fixtures/experimental/decorators-stage-2/on-computed-name-prop/actual.js b/test/fixtures/experimental/decorators-stage-2/no-computed-name-prop/actual.js similarity index 100% rename from test/fixtures/experimental/decorators-stage-2/on-computed-name-prop/actual.js rename to test/fixtures/experimental/decorators-stage-2/no-computed-name-prop/actual.js diff --git a/test/fixtures/experimental/decorators-stage-2/on-computed-name-prop/options.json b/test/fixtures/experimental/decorators-stage-2/no-computed-name-prop/options.json similarity index 61% rename from test/fixtures/experimental/decorators-stage-2/on-computed-name-prop/options.json rename to test/fixtures/experimental/decorators-stage-2/no-computed-name-prop/options.json index 481f6730cc..a22e3dad04 100644 --- a/test/fixtures/experimental/decorators-stage-2/on-computed-name-prop/options.json +++ b/test/fixtures/experimental/decorators-stage-2/no-computed-name-prop/options.json @@ -1,4 +1,4 @@ { - "plugins": ["classProperties", "decorators-stage-2"], + "plugins": ["classProperties", "decoratorsStage2"], "throws": "Stage 2 decorators may only be used with a class or a class method (2:7)" } diff --git a/test/fixtures/experimental/decorators-stage-2/export-decorators-on-class/actual.js b/test/fixtures/experimental/decorators-stage-2/no-export-decorators-on-class/actual.js similarity index 100% rename from test/fixtures/experimental/decorators-stage-2/export-decorators-on-class/actual.js rename to test/fixtures/experimental/decorators-stage-2/no-export-decorators-on-class/actual.js diff --git a/test/fixtures/experimental/decorators-stage-2/export-decorators-on-class/options.json b/test/fixtures/experimental/decorators-stage-2/no-export-decorators-on-class/options.json similarity index 100% rename from test/fixtures/experimental/decorators-stage-2/export-decorators-on-class/options.json rename to test/fixtures/experimental/decorators-stage-2/no-export-decorators-on-class/options.json diff --git a/test/fixtures/experimental/decorators-stage-2/function-parameters/actual.js b/test/fixtures/experimental/decorators-stage-2/no-function-parameters/actual.js similarity index 100% rename from test/fixtures/experimental/decorators-stage-2/function-parameters/actual.js rename to test/fixtures/experimental/decorators-stage-2/no-function-parameters/actual.js diff --git a/test/fixtures/experimental/decorators-stage-2/function-parameters/options.json b/test/fixtures/experimental/decorators-stage-2/no-function-parameters/options.json similarity index 100% rename from test/fixtures/experimental/decorators-stage-2/function-parameters/options.json rename to test/fixtures/experimental/decorators-stage-2/no-function-parameters/options.json diff --git a/test/fixtures/experimental/decorators-stage-2/object-method-parameter/actual.js b/test/fixtures/experimental/decorators-stage-2/no-object-method-parameters/actual.js similarity index 100% rename from test/fixtures/experimental/decorators-stage-2/object-method-parameter/actual.js rename to test/fixtures/experimental/decorators-stage-2/no-object-method-parameters/actual.js diff --git a/test/fixtures/experimental/decorators-stage-2/object-method-parameter/options.json b/test/fixtures/experimental/decorators-stage-2/no-object-method-parameters/options.json similarity index 100% rename from test/fixtures/experimental/decorators-stage-2/object-method-parameter/options.json rename to test/fixtures/experimental/decorators-stage-2/no-object-method-parameters/options.json diff --git a/test/fixtures/experimental/decorators-stage-2/options.json b/test/fixtures/experimental/decorators-stage-2/options.json index 80608cfffd..e46a0b346f 100644 --- a/test/fixtures/experimental/decorators-stage-2/options.json +++ b/test/fixtures/experimental/decorators-stage-2/options.json @@ -1,3 +1,3 @@ { - "plugins": ["decorators-stage-2"] + "plugins": ["decoratorsStage2"] } From b7c1c559c704413104f7314c6ae8ef18949d9388 Mon Sep 17 00:00:00 2001 From: Peeyush Kushwaha Date: Sun, 18 Jun 2017 01:30:46 +0530 Subject: [PATCH 08/13] Add test case for object properties --- .../decorators-stage-2/no-object-methods/actual.js | 5 +++++ .../decorators-stage-2/no-object-methods/options.json | 3 +++ 2 files changed, 8 insertions(+) create mode 100644 test/fixtures/experimental/decorators-stage-2/no-object-methods/actual.js create mode 100644 test/fixtures/experimental/decorators-stage-2/no-object-methods/options.json diff --git a/test/fixtures/experimental/decorators-stage-2/no-object-methods/actual.js b/test/fixtures/experimental/decorators-stage-2/no-object-methods/actual.js new file mode 100644 index 0000000000..51a3b5373e --- /dev/null +++ b/test/fixtures/experimental/decorators-stage-2/no-object-methods/actual.js @@ -0,0 +1,5 @@ +var o = { + @baz + foo() { + } +} diff --git a/test/fixtures/experimental/decorators-stage-2/no-object-methods/options.json b/test/fixtures/experimental/decorators-stage-2/no-object-methods/options.json new file mode 100644 index 0000000000..7dd4ed9e28 --- /dev/null +++ b/test/fixtures/experimental/decorators-stage-2/no-object-methods/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Stage 2 decorators disallow object literal property decorators (2:2)" +} From b60ac52ae6aff84b56645f15137d85616fba9cc2 Mon Sep 17 00:00:00 2001 From: Peeyush Kushwaha Date: Sun, 18 Jun 2017 02:00:13 +0530 Subject: [PATCH 09/13] Reorganize tests and add tests Add tests for static properties and private properties --- .../decorators-stage-2/computed-member-expr-on-prop/actual.js | 3 --- .../computed-member-expr-on-prop/options.json | 4 ---- .../decorators-stage-2/no-class-property/actual.js | 3 +++ .../{no-computed-name-prop => no-class-property}/options.json | 0 .../actual.js | 0 .../options.json | 0 .../decorators-stage-2/no-computed-name-prop/actual.js | 3 --- .../decorators-stage-2/no-private-property/actual.js | 3 +++ .../decorators-stage-2/no-private-property/options.json | 4 ++++ .../decorators-stage-2/no-static-property/actual.js | 3 +++ .../decorators-stage-2/no-static-property/options.json | 4 ++++ 11 files changed, 17 insertions(+), 10 deletions(-) delete mode 100644 test/fixtures/experimental/decorators-stage-2/computed-member-expr-on-prop/actual.js delete mode 100644 test/fixtures/experimental/decorators-stage-2/computed-member-expr-on-prop/options.json create mode 100644 test/fixtures/experimental/decorators-stage-2/no-class-property/actual.js rename test/fixtures/experimental/decorators-stage-2/{no-computed-name-prop => no-class-property}/options.json (100%) rename test/fixtures/experimental/decorators-stage-2/{computed-member-expression => no-computed-decorator-member}/actual.js (100%) rename test/fixtures/experimental/decorators-stage-2/{computed-member-expression => no-computed-decorator-member}/options.json (100%) delete mode 100644 test/fixtures/experimental/decorators-stage-2/no-computed-name-prop/actual.js create mode 100644 test/fixtures/experimental/decorators-stage-2/no-private-property/actual.js create mode 100644 test/fixtures/experimental/decorators-stage-2/no-private-property/options.json create mode 100644 test/fixtures/experimental/decorators-stage-2/no-static-property/actual.js create mode 100644 test/fixtures/experimental/decorators-stage-2/no-static-property/options.json diff --git a/test/fixtures/experimental/decorators-stage-2/computed-member-expr-on-prop/actual.js b/test/fixtures/experimental/decorators-stage-2/computed-member-expr-on-prop/actual.js deleted file mode 100644 index a7c918a617..0000000000 --- a/test/fixtures/experimental/decorators-stage-2/computed-member-expr-on-prop/actual.js +++ /dev/null @@ -1,3 +0,0 @@ -class Foo { - @foo[bar] a = 1; -} diff --git a/test/fixtures/experimental/decorators-stage-2/computed-member-expr-on-prop/options.json b/test/fixtures/experimental/decorators-stage-2/computed-member-expr-on-prop/options.json deleted file mode 100644 index 68c749fda9..0000000000 --- a/test/fixtures/experimental/decorators-stage-2/computed-member-expr-on-prop/options.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "plugins": ["decoratorsStage2", "classProperties"], - "throws": "Unexpected token (2:12)" -} diff --git a/test/fixtures/experimental/decorators-stage-2/no-class-property/actual.js b/test/fixtures/experimental/decorators-stage-2/no-class-property/actual.js new file mode 100644 index 0000000000..9225da7c2c --- /dev/null +++ b/test/fixtures/experimental/decorators-stage-2/no-class-property/actual.js @@ -0,0 +1,3 @@ +class A { + @dec name = 0 +} diff --git a/test/fixtures/experimental/decorators-stage-2/no-computed-name-prop/options.json b/test/fixtures/experimental/decorators-stage-2/no-class-property/options.json similarity index 100% rename from test/fixtures/experimental/decorators-stage-2/no-computed-name-prop/options.json rename to test/fixtures/experimental/decorators-stage-2/no-class-property/options.json diff --git a/test/fixtures/experimental/decorators-stage-2/computed-member-expression/actual.js b/test/fixtures/experimental/decorators-stage-2/no-computed-decorator-member/actual.js similarity index 100% rename from test/fixtures/experimental/decorators-stage-2/computed-member-expression/actual.js rename to test/fixtures/experimental/decorators-stage-2/no-computed-decorator-member/actual.js diff --git a/test/fixtures/experimental/decorators-stage-2/computed-member-expression/options.json b/test/fixtures/experimental/decorators-stage-2/no-computed-decorator-member/options.json similarity index 100% rename from test/fixtures/experimental/decorators-stage-2/computed-member-expression/options.json rename to test/fixtures/experimental/decorators-stage-2/no-computed-decorator-member/options.json diff --git a/test/fixtures/experimental/decorators-stage-2/no-computed-name-prop/actual.js b/test/fixtures/experimental/decorators-stage-2/no-computed-name-prop/actual.js deleted file mode 100644 index 4712d930dd..0000000000 --- a/test/fixtures/experimental/decorators-stage-2/no-computed-name-prop/actual.js +++ /dev/null @@ -1,3 +0,0 @@ -class A { - @dec ['name'] = 0 -} diff --git a/test/fixtures/experimental/decorators-stage-2/no-private-property/actual.js b/test/fixtures/experimental/decorators-stage-2/no-private-property/actual.js new file mode 100644 index 0000000000..2c1a455e62 --- /dev/null +++ b/test/fixtures/experimental/decorators-stage-2/no-private-property/actual.js @@ -0,0 +1,3 @@ +class A { + @dec #name = 0 +} diff --git a/test/fixtures/experimental/decorators-stage-2/no-private-property/options.json b/test/fixtures/experimental/decorators-stage-2/no-private-property/options.json new file mode 100644 index 0000000000..4f6c7c9e0e --- /dev/null +++ b/test/fixtures/experimental/decorators-stage-2/no-private-property/options.json @@ -0,0 +1,4 @@ +{ + "plugins": ["classProperties", "classPrivateProperties", "decoratorsStage2"], + "throws": "Stage 2 decorators may only be used with a class or a class method (2:7)" +} diff --git a/test/fixtures/experimental/decorators-stage-2/no-static-property/actual.js b/test/fixtures/experimental/decorators-stage-2/no-static-property/actual.js new file mode 100644 index 0000000000..2fcc5057bd --- /dev/null +++ b/test/fixtures/experimental/decorators-stage-2/no-static-property/actual.js @@ -0,0 +1,3 @@ +class A { + @dec static name = 0 +} diff --git a/test/fixtures/experimental/decorators-stage-2/no-static-property/options.json b/test/fixtures/experimental/decorators-stage-2/no-static-property/options.json new file mode 100644 index 0000000000..a22e3dad04 --- /dev/null +++ b/test/fixtures/experimental/decorators-stage-2/no-static-property/options.json @@ -0,0 +1,4 @@ +{ + "plugins": ["classProperties", "decoratorsStage2"], + "throws": "Stage 2 decorators may only be used with a class or a class method (2:7)" +} From 04b40868f9b84969c49369d1b93666f820a6ddd4 Mon Sep 17 00:00:00 2001 From: Peeyush Kushwaha Date: Mon, 19 Jun 2017 23:45:57 +0530 Subject: [PATCH 10/13] Add more tests; fix plugin conflict code --- src/index.js | 9 +- .../class-expression/actual.js | 6 + .../class-expression/expected.json | 308 ++++++++++++++++++ .../export-decorated-class/actual.js | 2 + .../export-decorated-class/expected.json | 132 ++++++++ .../export-decorated-class/options.json | 3 + .../plugin-conflict/actual.js | 2 + .../plugin-conflict/options.json | 4 + .../decorators-stage-2/restricted-1/actual.js | 2 + .../restricted-1/options.json | 3 + .../decorators-stage-2/restricted-2/actual.js | 2 + .../restricted-2/options.json | 3 + 12 files changed, 472 insertions(+), 4 deletions(-) create mode 100644 test/fixtures/experimental/decorators-stage-2/class-expression/actual.js create mode 100644 test/fixtures/experimental/decorators-stage-2/class-expression/expected.json create mode 100644 test/fixtures/experimental/decorators-stage-2/export-decorated-class/actual.js create mode 100644 test/fixtures/experimental/decorators-stage-2/export-decorated-class/expected.json create mode 100644 test/fixtures/experimental/decorators-stage-2/export-decorated-class/options.json create mode 100644 test/fixtures/experimental/decorators-stage-2/plugin-conflict/actual.js create mode 100644 test/fixtures/experimental/decorators-stage-2/plugin-conflict/options.json create mode 100644 test/fixtures/experimental/decorators-stage-2/restricted-1/actual.js create mode 100644 test/fixtures/experimental/decorators-stage-2/restricted-1/options.json create mode 100644 test/fixtures/experimental/decorators-stage-2/restricted-2/actual.js create mode 100644 test/fixtures/experimental/decorators-stage-2/restricted-2/options.json diff --git a/src/index.js b/src/index.js index 8ebcb0c7be..0ebe931266 100755 --- a/src/index.js +++ b/src/index.js @@ -47,6 +47,11 @@ const parserClassCache: { [key: string]: Class } = {}; /** Get a Parser class with plugins applied. */ function getParserClass(pluginsFromOptions: $ReadOnlyArray): Class { + + if (pluginsFromOptions.indexOf("decorators") >= 0 && pluginsFromOptions.indexOf("decoratorsStage2") >= 0) { + throw new Error("Cannot use decorators and decoratorsStage2 plugin together"); + } + // Filter out just the plugins that have an actual mixin associated with them. let pluginList = pluginsFromOptions.filter((p) => p === "estree" || p === "flow" || p === "jsx"); @@ -62,10 +67,6 @@ function getParserClass(pluginsFromOptions: $ReadOnlyArray): Class= 0 && pluginList.indexOf("decoratorsStage2") >= 0) { - throw new Error("Cannot use decorators and decoratorsStage2 plugin together"); - } - const key = pluginList.join("/"); let cls = parserClassCache[key]; if (!cls) { diff --git a/test/fixtures/experimental/decorators-stage-2/class-expression/actual.js b/test/fixtures/experimental/decorators-stage-2/class-expression/actual.js new file mode 100644 index 0000000000..b8695c19cd --- /dev/null +++ b/test/fixtures/experimental/decorators-stage-2/class-expression/actual.js @@ -0,0 +1,6 @@ +var foo = @dec class Bar { + @baz + bam() { + f(); + } +} diff --git a/test/fixtures/experimental/decorators-stage-2/class-expression/expected.json b/test/fixtures/experimental/decorators-stage-2/class-expression/expected.json new file mode 100644 index 0000000000..338ad4e54c --- /dev/null +++ b/test/fixtures/experimental/decorators-stage-2/class-expression/expected.json @@ -0,0 +1,308 @@ +{ + "type": "File", + "start": 0, + "end": 58, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 6, + "column": 1 + } + }, + "program": { + "type": "Program", + "start": 0, + "end": 58, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 6, + "column": 1 + } + }, + "sourceType": "script", + "body": [ + { + "type": "VariableDeclaration", + "start": 0, + "end": 58, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 6, + "column": 1 + } + }, + "declarations": [ + { + "type": "VariableDeclarator", + "start": 4, + "end": 58, + "loc": { + "start": { + "line": 1, + "column": 4 + }, + "end": { + "line": 6, + "column": 1 + } + }, + "id": { + "type": "Identifier", + "start": 4, + "end": 7, + "loc": { + "start": { + "line": 1, + "column": 4 + }, + "end": { + "line": 1, + "column": 7 + }, + "identifierName": "foo" + }, + "name": "foo" + }, + "init": { + "type": "ClassExpression", + "start": 15, + "end": 58, + "loc": { + "start": { + "line": 1, + "column": 15 + }, + "end": { + "line": 6, + "column": 1 + } + }, + "decorators": [ + { + "type": "Decorator", + "start": 10, + "end": 14, + "loc": { + "start": { + "line": 1, + "column": 10 + }, + "end": { + "line": 1, + "column": 14 + } + }, + "expression": { + "type": "Identifier", + "start": 11, + "end": 14, + "loc": { + "start": { + "line": 1, + "column": 11 + }, + "end": { + "line": 1, + "column": 14 + }, + "identifierName": "dec" + }, + "name": "dec" + } + } + ], + "id": { + "type": "Identifier", + "start": 21, + "end": 24, + "loc": { + "start": { + "line": 1, + "column": 21 + }, + "end": { + "line": 1, + "column": 24 + }, + "identifierName": "Bar" + }, + "name": "Bar" + }, + "superClass": null, + "body": { + "type": "ClassBody", + "start": 25, + "end": 58, + "loc": { + "start": { + "line": 1, + "column": 25 + }, + "end": { + "line": 6, + "column": 1 + } + }, + "body": [ + { + "type": "ClassMethod", + "start": 36, + "end": 56, + "loc": { + "start": { + "line": 3, + "column": 2 + }, + "end": { + "line": 5, + "column": 3 + } + }, + "decorators": [ + { + "type": "Decorator", + "start": 29, + "end": 33, + "loc": { + "start": { + "line": 2, + "column": 2 + }, + "end": { + "line": 2, + "column": 6 + } + }, + "expression": { + "type": "Identifier", + "start": 30, + "end": 33, + "loc": { + "start": { + "line": 2, + "column": 3 + }, + "end": { + "line": 2, + "column": 6 + }, + "identifierName": "baz" + }, + "name": "baz" + } + } + ], + "static": false, + "computed": false, + "key": { + "type": "Identifier", + "start": 36, + "end": 39, + "loc": { + "start": { + "line": 3, + "column": 2 + }, + "end": { + "line": 3, + "column": 5 + }, + "identifierName": "bam" + }, + "name": "bam" + }, + "kind": "method", + "id": null, + "generator": false, + "expression": false, + "async": false, + "params": [], + "body": { + "type": "BlockStatement", + "start": 42, + "end": 56, + "loc": { + "start": { + "line": 3, + "column": 8 + }, + "end": { + "line": 5, + "column": 3 + } + }, + "body": [ + { + "type": "ExpressionStatement", + "start": 48, + "end": 52, + "loc": { + "start": { + "line": 4, + "column": 4 + }, + "end": { + "line": 4, + "column": 8 + } + }, + "expression": { + "type": "CallExpression", + "start": 48, + "end": 51, + "loc": { + "start": { + "line": 4, + "column": 4 + }, + "end": { + "line": 4, + "column": 7 + } + }, + "callee": { + "type": "Identifier", + "start": 48, + "end": 49, + "loc": { + "start": { + "line": 4, + "column": 4 + }, + "end": { + "line": 4, + "column": 5 + }, + "identifierName": "f" + }, + "name": "f" + }, + "arguments": [] + } + } + ], + "directives": [] + } + } + ] + } + } + } + ], + "kind": "var" + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/test/fixtures/experimental/decorators-stage-2/export-decorated-class/actual.js b/test/fixtures/experimental/decorators-stage-2/export-decorated-class/actual.js new file mode 100644 index 0000000000..80ba64f71a --- /dev/null +++ b/test/fixtures/experimental/decorators-stage-2/export-decorated-class/actual.js @@ -0,0 +1,2 @@ +export default +@bar class Foo { } diff --git a/test/fixtures/experimental/decorators-stage-2/export-decorated-class/expected.json b/test/fixtures/experimental/decorators-stage-2/export-decorated-class/expected.json new file mode 100644 index 0000000000..a480a4682d --- /dev/null +++ b/test/fixtures/experimental/decorators-stage-2/export-decorated-class/expected.json @@ -0,0 +1,132 @@ +{ + "type": "File", + "start": 0, + "end": 34, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 2, + "column": 18 + } + }, + "program": { + "type": "Program", + "start": 0, + "end": 34, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 2, + "column": 18 + } + }, + "sourceType": "module", + "body": [ + { + "type": "ExportDefaultDeclaration", + "start": 0, + "end": 34, + "loc": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 2, + "column": 18 + } + }, + "declaration": { + "type": "ClassExpression", + "start": 21, + "end": 34, + "loc": { + "start": { + "line": 2, + "column": 5 + }, + "end": { + "line": 2, + "column": 18 + } + }, + "decorators": [ + { + "type": "Decorator", + "start": 16, + "end": 20, + "loc": { + "start": { + "line": 2, + "column": 0 + }, + "end": { + "line": 2, + "column": 4 + } + }, + "expression": { + "type": "Identifier", + "start": 17, + "end": 20, + "loc": { + "start": { + "line": 2, + "column": 1 + }, + "end": { + "line": 2, + "column": 4 + }, + "identifierName": "bar" + }, + "name": "bar" + } + } + ], + "id": { + "type": "Identifier", + "start": 27, + "end": 30, + "loc": { + "start": { + "line": 2, + "column": 11 + }, + "end": { + "line": 2, + "column": 14 + }, + "identifierName": "Foo" + }, + "name": "Foo" + }, + "superClass": null, + "body": { + "type": "ClassBody", + "start": 31, + "end": 34, + "loc": { + "start": { + "line": 2, + "column": 15 + }, + "end": { + "line": 2, + "column": 18 + } + }, + "body": [] + } + } + } + ], + "directives": [] + } +} \ No newline at end of file diff --git a/test/fixtures/experimental/decorators-stage-2/export-decorated-class/options.json b/test/fixtures/experimental/decorators-stage-2/export-decorated-class/options.json new file mode 100644 index 0000000000..2104ca4328 --- /dev/null +++ b/test/fixtures/experimental/decorators-stage-2/export-decorated-class/options.json @@ -0,0 +1,3 @@ +{ + "sourceType": "module" +} diff --git a/test/fixtures/experimental/decorators-stage-2/plugin-conflict/actual.js b/test/fixtures/experimental/decorators-stage-2/plugin-conflict/actual.js new file mode 100644 index 0000000000..68f513e2af --- /dev/null +++ b/test/fixtures/experimental/decorators-stage-2/plugin-conflict/actual.js @@ -0,0 +1,2 @@ +// we don't need any source code for this error to trigger, +// it should trigger just because both old and new decorator plugins exist together diff --git a/test/fixtures/experimental/decorators-stage-2/plugin-conflict/options.json b/test/fixtures/experimental/decorators-stage-2/plugin-conflict/options.json new file mode 100644 index 0000000000..b0e2270b4a --- /dev/null +++ b/test/fixtures/experimental/decorators-stage-2/plugin-conflict/options.json @@ -0,0 +1,4 @@ +{ + "plugins": ["decorators", "decoratorsStage2"], + "throws": "Cannot use decorators and decoratorsStage2 plugin together" +} diff --git a/test/fixtures/experimental/decorators-stage-2/restricted-1/actual.js b/test/fixtures/experimental/decorators-stage-2/restricted-1/actual.js new file mode 100644 index 0000000000..cf35085f86 --- /dev/null +++ b/test/fixtures/experimental/decorators-stage-2/restricted-1/actual.js @@ -0,0 +1,2 @@ +@(bar.baz) +class Foo {} diff --git a/test/fixtures/experimental/decorators-stage-2/restricted-1/options.json b/test/fixtures/experimental/decorators-stage-2/restricted-1/options.json new file mode 100644 index 0000000000..b5b75f4187 --- /dev/null +++ b/test/fixtures/experimental/decorators-stage-2/restricted-1/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Unexpected token (1:1)" +} diff --git a/test/fixtures/experimental/decorators-stage-2/restricted-2/actual.js b/test/fixtures/experimental/decorators-stage-2/restricted-2/actual.js new file mode 100644 index 0000000000..8402c20e30 --- /dev/null +++ b/test/fixtures/experimental/decorators-stage-2/restricted-2/actual.js @@ -0,0 +1,2 @@ +@foo().bar +class Baz {} diff --git a/test/fixtures/experimental/decorators-stage-2/restricted-2/options.json b/test/fixtures/experimental/decorators-stage-2/restricted-2/options.json new file mode 100644 index 0000000000..9fc4104fb3 --- /dev/null +++ b/test/fixtures/experimental/decorators-stage-2/restricted-2/options.json @@ -0,0 +1,3 @@ +{ + "throws": "Leading decorators must be attached to a class declaration (1:6)" +} From e1972baff51e838f226b6063026ed83e992b411a Mon Sep 17 00:00:00 2001 From: Peeyush Kushwaha Date: Thu, 22 Jun 2017 01:45:27 +0530 Subject: [PATCH 11/13] Decorated classes/methods start where the decorator starts --- src/parser/statement.js | 6 ++++++ .../class-decorator-call-expr/expected.json | 4 ++-- .../decorators-stage-2/class-decorator/expected.json | 4 ++-- .../decorators-stage-2/class-expression/expected.json | 8 ++++---- .../decorators-stage-2/class-generator/expected.json | 4 ++-- .../decorators-stage-2/complex-expr/expected.json | 4 ++-- .../export-decorated-class/expected.json | 4 ++-- .../decorators-stage-2/no-class-property/options.json | 2 +- .../no-computed-decorator-member/options.json | 2 +- .../no-constructor-decorators/options.json | 2 +- .../decorators-stage-2/no-private-property/options.json | 2 +- .../decorators-stage-2/no-static-property/options.json | 2 +- .../on-computed-name-method/expected.json | 4 ++-- 13 files changed, 27 insertions(+), 21 deletions(-) diff --git a/src/parser/statement.js b/src/parser/statement.js index 2e887a7e85..74be753de9 100644 --- a/src/parser/statement.js +++ b/src/parser/statement.js @@ -152,6 +152,9 @@ export default class StatementParser extends ExpressionParser { takeDecorators(node: N.HasDecorators): void { if (this.state.decorators.length) { node.decorators = this.state.decorators; + if (this.hasPlugin("decoratorsStage2")) { + this.resetStartLocationFromNode(node, this.state.decorators[0]); + } this.state.decorators = []; } } @@ -709,6 +712,9 @@ export default class StatementParser extends ExpressionParser { // steal the decorators if there are any if (decorators.length) { member.decorators = decorators; + if (this.hasPlugin("decoratorsStage2")) { + this.resetStartLocationFromNode(member, decorators[0]); + } decorators = []; } diff --git a/test/fixtures/experimental/decorators-stage-2/class-decorator-call-expr/expected.json b/test/fixtures/experimental/decorators-stage-2/class-decorator-call-expr/expected.json index 291ef173cc..26d8fca5be 100644 --- a/test/fixtures/experimental/decorators-stage-2/class-decorator-call-expr/expected.json +++ b/test/fixtures/experimental/decorators-stage-2/class-decorator-call-expr/expected.json @@ -30,11 +30,11 @@ "body": [ { "type": "ClassDeclaration", - "start": 12, + "start": 0, "end": 24, "loc": { "start": { - "line": 2, + "line": 1, "column": 0 }, "end": { diff --git a/test/fixtures/experimental/decorators-stage-2/class-decorator/expected.json b/test/fixtures/experimental/decorators-stage-2/class-decorator/expected.json index 8299bdd639..b0570136eb 100644 --- a/test/fixtures/experimental/decorators-stage-2/class-decorator/expected.json +++ b/test/fixtures/experimental/decorators-stage-2/class-decorator/expected.json @@ -30,11 +30,11 @@ "body": [ { "type": "ClassDeclaration", - "start": 5, + "start": 0, "end": 19, "loc": { "start": { - "line": 2, + "line": 1, "column": 0 }, "end": { diff --git a/test/fixtures/experimental/decorators-stage-2/class-expression/expected.json b/test/fixtures/experimental/decorators-stage-2/class-expression/expected.json index 338ad4e54c..af3ed887d2 100644 --- a/test/fixtures/experimental/decorators-stage-2/class-expression/expected.json +++ b/test/fixtures/experimental/decorators-stage-2/class-expression/expected.json @@ -76,12 +76,12 @@ }, "init": { "type": "ClassExpression", - "start": 15, + "start": 10, "end": 58, "loc": { "start": { "line": 1, - "column": 15 + "column": 10 }, "end": { "line": 6, @@ -157,11 +157,11 @@ "body": [ { "type": "ClassMethod", - "start": 36, + "start": 29, "end": 56, "loc": { "start": { - "line": 3, + "line": 2, "column": 2 }, "end": { diff --git a/test/fixtures/experimental/decorators-stage-2/class-generator/expected.json b/test/fixtures/experimental/decorators-stage-2/class-generator/expected.json index a248b8b5ec..87b73b717a 100644 --- a/test/fixtures/experimental/decorators-stage-2/class-generator/expected.json +++ b/test/fixtures/experimental/decorators-stage-2/class-generator/expected.json @@ -77,12 +77,12 @@ "body": [ { "type": "ClassMethod", - "start": 17, + "start": 12, "end": 23, "loc": { "start": { "line": 2, - "column": 7 + "column": 2 }, "end": { "line": 2, diff --git a/test/fixtures/experimental/decorators-stage-2/complex-expr/expected.json b/test/fixtures/experimental/decorators-stage-2/complex-expr/expected.json index bc2d356463..b048d367ee 100644 --- a/test/fixtures/experimental/decorators-stage-2/complex-expr/expected.json +++ b/test/fixtures/experimental/decorators-stage-2/complex-expr/expected.json @@ -77,11 +77,11 @@ "body": [ { "type": "ClassMethod", - "start": 29, + "start": 12, "end": 34, "loc": { "start": { - "line": 3, + "line": 2, "column": 2 }, "end": { diff --git a/test/fixtures/experimental/decorators-stage-2/export-decorated-class/expected.json b/test/fixtures/experimental/decorators-stage-2/export-decorated-class/expected.json index a480a4682d..bbfcc7fcca 100644 --- a/test/fixtures/experimental/decorators-stage-2/export-decorated-class/expected.json +++ b/test/fixtures/experimental/decorators-stage-2/export-decorated-class/expected.json @@ -44,12 +44,12 @@ }, "declaration": { "type": "ClassExpression", - "start": 21, + "start": 16, "end": 34, "loc": { "start": { "line": 2, - "column": 5 + "column": 0 }, "end": { "line": 2, diff --git a/test/fixtures/experimental/decorators-stage-2/no-class-property/options.json b/test/fixtures/experimental/decorators-stage-2/no-class-property/options.json index a22e3dad04..000a057244 100644 --- a/test/fixtures/experimental/decorators-stage-2/no-class-property/options.json +++ b/test/fixtures/experimental/decorators-stage-2/no-class-property/options.json @@ -1,4 +1,4 @@ { "plugins": ["classProperties", "decoratorsStage2"], - "throws": "Stage 2 decorators may only be used with a class or a class method (2:7)" + "throws": "Stage 2 decorators may only be used with a class or a class method (2:2)" } diff --git a/test/fixtures/experimental/decorators-stage-2/no-computed-decorator-member/options.json b/test/fixtures/experimental/decorators-stage-2/no-computed-decorator-member/options.json index acf8362a77..1a919e297a 100644 --- a/test/fixtures/experimental/decorators-stage-2/no-computed-decorator-member/options.json +++ b/test/fixtures/experimental/decorators-stage-2/no-computed-decorator-member/options.json @@ -1,4 +1,4 @@ { "plugins": ["decoratorsStage2", "classProperties"], - "throws": "Stage 2 decorators may only be used with a class or a class method (2:6)" + "throws": "Stage 2 decorators may only be used with a class or a class method (2:2)" } diff --git a/test/fixtures/experimental/decorators-stage-2/no-constructor-decorators/options.json b/test/fixtures/experimental/decorators-stage-2/no-constructor-decorators/options.json index c0baef5996..a26ed7cacb 100644 --- a/test/fixtures/experimental/decorators-stage-2/no-constructor-decorators/options.json +++ b/test/fixtures/experimental/decorators-stage-2/no-constructor-decorators/options.json @@ -1,3 +1,3 @@ { - "throws": "You can't attach decorators to a class constructor (3:2)" + "throws": "You can't attach decorators to a class constructor (2:2)" } diff --git a/test/fixtures/experimental/decorators-stage-2/no-private-property/options.json b/test/fixtures/experimental/decorators-stage-2/no-private-property/options.json index 4f6c7c9e0e..4346ad3723 100644 --- a/test/fixtures/experimental/decorators-stage-2/no-private-property/options.json +++ b/test/fixtures/experimental/decorators-stage-2/no-private-property/options.json @@ -1,4 +1,4 @@ { "plugins": ["classProperties", "classPrivateProperties", "decoratorsStage2"], - "throws": "Stage 2 decorators may only be used with a class or a class method (2:7)" + "throws": "Stage 2 decorators may only be used with a class or a class method (2:2)" } diff --git a/test/fixtures/experimental/decorators-stage-2/no-static-property/options.json b/test/fixtures/experimental/decorators-stage-2/no-static-property/options.json index a22e3dad04..000a057244 100644 --- a/test/fixtures/experimental/decorators-stage-2/no-static-property/options.json +++ b/test/fixtures/experimental/decorators-stage-2/no-static-property/options.json @@ -1,4 +1,4 @@ { "plugins": ["classProperties", "decoratorsStage2"], - "throws": "Stage 2 decorators may only be used with a class or a class method (2:7)" + "throws": "Stage 2 decorators may only be used with a class or a class method (2:2)" } diff --git a/test/fixtures/experimental/decorators-stage-2/on-computed-name-method/expected.json b/test/fixtures/experimental/decorators-stage-2/on-computed-name-method/expected.json index a9f30a4ca9..7e9968743f 100644 --- a/test/fixtures/experimental/decorators-stage-2/on-computed-name-method/expected.json +++ b/test/fixtures/experimental/decorators-stage-2/on-computed-name-method/expected.json @@ -77,11 +77,11 @@ "body": [ { "type": "ClassMethod", - "start": 19, + "start": 12, "end": 31, "loc": { "start": { - "line": 3, + "line": 2, "column": 2 }, "end": { From e5fdb3448dcdf2b6ceb33ad9dd1a078e38a4d27d Mon Sep 17 00:00:00 2001 From: Peeyush Kushwaha Date: Thu, 22 Jun 2017 02:00:36 +0530 Subject: [PATCH 12/13] rename decoratorsStage2 -> decorators2 --- src/index.js | 4 ++-- src/parser/expression.js | 2 +- src/parser/lval.js | 2 +- src/parser/statement.js | 12 ++++++------ .../no-class-property/options.json | 2 +- .../no-computed-decorator-member/options.json | 2 +- .../no-private-property/options.json | 2 +- .../no-static-property/options.json | 2 +- .../experimental/decorators-stage-2/options.json | 2 +- .../decorators-stage-2/plugin-conflict/options.json | 4 ++-- 10 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/index.js b/src/index.js index 0ebe931266..84770971a9 100755 --- a/src/index.js +++ b/src/index.js @@ -48,8 +48,8 @@ const parserClassCache: { [key: string]: Class } = {}; /** Get a Parser class with plugins applied. */ function getParserClass(pluginsFromOptions: $ReadOnlyArray): Class { - if (pluginsFromOptions.indexOf("decorators") >= 0 && pluginsFromOptions.indexOf("decoratorsStage2") >= 0) { - throw new Error("Cannot use decorators and decoratorsStage2 plugin together"); + if (pluginsFromOptions.indexOf("decorators") >= 0 && pluginsFromOptions.indexOf("decorators2") >= 0) { + throw new Error("Cannot use decorators and decorators2 plugin together"); } // Filter out just the plugins that have an actual mixin associated with them. diff --git a/src/parser/expression.js b/src/parser/expression.js index ffd448f574..3aaa2faf08 100644 --- a/src/parser/expression.js +++ b/src/parser/expression.js @@ -858,7 +858,7 @@ export default class ExpressionParser extends LValParser { } if (this.match(tt.at)) { - if (this.hasPlugin("decoratorsStage2")) { + if (this.hasPlugin("decorators2")) { this.raise(this.state.start, "Stage 2 decorators disallow object literal property decorators"); } else { // we needn't check if decorators (stage 0) plugin is enabled since it's checked by diff --git a/src/parser/lval.js b/src/parser/lval.js index f642b467c5..3c88a5b1c0 100644 --- a/src/parser/lval.js +++ b/src/parser/lval.js @@ -187,7 +187,7 @@ export default class LValParser extends NodeUtils { break; } else { const decorators = []; - if (this.match(tt.at) && this.hasPlugin("decoratorsStage2")) { + if (this.match(tt.at) && this.hasPlugin("decorators2")) { this.raise(this.state.start, "Stage 2 decorators cannot be used to decorate parameters"); } while (this.match(tt.at)) { diff --git a/src/parser/statement.js b/src/parser/statement.js index 74be753de9..2cbfa3b52c 100644 --- a/src/parser/statement.js +++ b/src/parser/statement.js @@ -152,7 +152,7 @@ export default class StatementParser extends ExpressionParser { takeDecorators(node: N.HasDecorators): void { if (this.state.decorators.length) { node.decorators = this.state.decorators; - if (this.hasPlugin("decoratorsStage2")) { + if (this.hasPlugin("decorators2")) { this.resetStartLocationFromNode(node, this.state.decorators[0]); } this.state.decorators = []; @@ -160,7 +160,7 @@ export default class StatementParser extends ExpressionParser { } parseDecorators(allowExport?: boolean): void { - if (this.hasPlugin("decoratorsStage2")) { + if (this.hasPlugin("decorators2")) { allowExport = false; } @@ -179,14 +179,14 @@ export default class StatementParser extends ExpressionParser { } parseDecorator(): N.Decorator { - if (!(this.hasPlugin("decorators") || this.hasPlugin("decoratorsStage2"))) { + if (!(this.hasPlugin("decorators") || this.hasPlugin("decorators2"))) { this.unexpected(); } const node = this.startNode(); this.next(); - if (this.hasPlugin("decoratorsStage2")) { + if (this.hasPlugin("decorators2")) { const startPos = this.state.start; const startLoc = this.state.startLoc; let expr = this.parseIdentifier(false); @@ -712,7 +712,7 @@ export default class StatementParser extends ExpressionParser { // steal the decorators if there are any if (decorators.length) { member.decorators = decorators; - if (this.hasPlugin("decoratorsStage2")) { + if (this.hasPlugin("decorators2")) { this.resetStartLocationFromNode(member, decorators[0]); } decorators = []; @@ -720,7 +720,7 @@ export default class StatementParser extends ExpressionParser { this.parseClassMember(classBody, member, state); - if (this.hasPlugin("decoratorsStage2") && member.kind != "method" && member.decorators && member.decorators.length > 0) { + if (this.hasPlugin("decorators2") && member.kind != "method" && member.decorators && member.decorators.length > 0) { this.raise(member.start, "Stage 2 decorators may only be used with a class or a class method"); } } diff --git a/test/fixtures/experimental/decorators-stage-2/no-class-property/options.json b/test/fixtures/experimental/decorators-stage-2/no-class-property/options.json index 000a057244..024e2be712 100644 --- a/test/fixtures/experimental/decorators-stage-2/no-class-property/options.json +++ b/test/fixtures/experimental/decorators-stage-2/no-class-property/options.json @@ -1,4 +1,4 @@ { - "plugins": ["classProperties", "decoratorsStage2"], + "plugins": ["classProperties", "decorators2"], "throws": "Stage 2 decorators may only be used with a class or a class method (2:2)" } diff --git a/test/fixtures/experimental/decorators-stage-2/no-computed-decorator-member/options.json b/test/fixtures/experimental/decorators-stage-2/no-computed-decorator-member/options.json index 1a919e297a..999cde36f6 100644 --- a/test/fixtures/experimental/decorators-stage-2/no-computed-decorator-member/options.json +++ b/test/fixtures/experimental/decorators-stage-2/no-computed-decorator-member/options.json @@ -1,4 +1,4 @@ { - "plugins": ["decoratorsStage2", "classProperties"], + "plugins": ["decorators2", "classProperties"], "throws": "Stage 2 decorators may only be used with a class or a class method (2:2)" } diff --git a/test/fixtures/experimental/decorators-stage-2/no-private-property/options.json b/test/fixtures/experimental/decorators-stage-2/no-private-property/options.json index 4346ad3723..14c752698a 100644 --- a/test/fixtures/experimental/decorators-stage-2/no-private-property/options.json +++ b/test/fixtures/experimental/decorators-stage-2/no-private-property/options.json @@ -1,4 +1,4 @@ { - "plugins": ["classProperties", "classPrivateProperties", "decoratorsStage2"], + "plugins": ["classProperties", "classPrivateProperties", "decorators2"], "throws": "Stage 2 decorators may only be used with a class or a class method (2:2)" } diff --git a/test/fixtures/experimental/decorators-stage-2/no-static-property/options.json b/test/fixtures/experimental/decorators-stage-2/no-static-property/options.json index 000a057244..024e2be712 100644 --- a/test/fixtures/experimental/decorators-stage-2/no-static-property/options.json +++ b/test/fixtures/experimental/decorators-stage-2/no-static-property/options.json @@ -1,4 +1,4 @@ { - "plugins": ["classProperties", "decoratorsStage2"], + "plugins": ["classProperties", "decorators2"], "throws": "Stage 2 decorators may only be used with a class or a class method (2:2)" } diff --git a/test/fixtures/experimental/decorators-stage-2/options.json b/test/fixtures/experimental/decorators-stage-2/options.json index e46a0b346f..607159a010 100644 --- a/test/fixtures/experimental/decorators-stage-2/options.json +++ b/test/fixtures/experimental/decorators-stage-2/options.json @@ -1,3 +1,3 @@ { - "plugins": ["decoratorsStage2"] + "plugins": ["decorators2"] } diff --git a/test/fixtures/experimental/decorators-stage-2/plugin-conflict/options.json b/test/fixtures/experimental/decorators-stage-2/plugin-conflict/options.json index b0e2270b4a..3e9d38f259 100644 --- a/test/fixtures/experimental/decorators-stage-2/plugin-conflict/options.json +++ b/test/fixtures/experimental/decorators-stage-2/plugin-conflict/options.json @@ -1,4 +1,4 @@ { - "plugins": ["decorators", "decoratorsStage2"], - "throws": "Cannot use decorators and decoratorsStage2 plugin together" + "plugins": ["decorators", "decorators2"], + "throws": "Cannot use decorators and decorators2 plugin together" } From d99618cdfe00cb954b0ebc4a8f2858b8d68527de Mon Sep 17 00:00:00 2001 From: Peeyush Kushwaha Date: Thu, 22 Jun 2017 02:01:28 +0530 Subject: [PATCH 13/13] renames files --- .../class-decorator-call-expr/actual.js | 0 .../class-decorator-call-expr/expected.json | 0 .../class-decorator/actual.js | 0 .../class-decorator/expected.json | 0 .../class-expression/actual.js | 0 .../class-expression/expected.json | 0 .../class-generator/actual.js | 0 .../class-generator/expected.json | 0 .../{decorators-stage-2 => decorators-2}/complex-expr/actual.js | 0 .../complex-expr/expected.json | 0 .../export-decorated-class/actual.js | 0 .../export-decorated-class/expected.json | 0 .../export-decorated-class/options.json | 0 .../no-class-method-parameter/actual.js | 0 .../no-class-method-parameter/options.json | 0 .../no-class-property/actual.js | 0 .../no-class-property/options.json | 0 .../no-computed-decorator-member/actual.js | 0 .../no-computed-decorator-member/options.json | 0 .../no-constructor-decorators/actual.js | 0 .../no-constructor-decorators/options.json | 0 .../no-export-decorators-on-class/actual.js | 0 .../no-export-decorators-on-class/options.json | 0 .../no-function-parameters/actual.js | 0 .../no-function-parameters/options.json | 0 .../no-object-method-parameters/actual.js | 0 .../no-object-method-parameters/options.json | 0 .../no-object-methods/actual.js | 0 .../no-object-methods/options.json | 0 .../no-private-property/actual.js | 0 .../no-private-property/options.json | 0 .../{decorators-stage-2 => decorators-2}/no-semi/actual.js | 0 .../{decorators-stage-2 => decorators-2}/no-semi/options.json | 0 .../no-static-property/actual.js | 0 .../no-static-property/options.json | 0 .../on-computed-name-method/actual.js | 0 .../on-computed-name-method/expected.json | 0 .../{decorators-stage-2 => decorators-2}/options.json | 0 .../plugin-conflict/actual.js | 0 .../plugin-conflict/options.json | 0 .../{decorators-stage-2 => decorators-2}/restricted-1/actual.js | 0 .../restricted-1/options.json | 0 .../{decorators-stage-2 => decorators-2}/restricted-2/actual.js | 0 .../restricted-2/options.json | 0 44 files changed, 0 insertions(+), 0 deletions(-) rename test/fixtures/experimental/{decorators-stage-2 => decorators-2}/class-decorator-call-expr/actual.js (100%) rename test/fixtures/experimental/{decorators-stage-2 => decorators-2}/class-decorator-call-expr/expected.json (100%) rename test/fixtures/experimental/{decorators-stage-2 => decorators-2}/class-decorator/actual.js (100%) rename test/fixtures/experimental/{decorators-stage-2 => decorators-2}/class-decorator/expected.json (100%) rename test/fixtures/experimental/{decorators-stage-2 => decorators-2}/class-expression/actual.js (100%) rename test/fixtures/experimental/{decorators-stage-2 => decorators-2}/class-expression/expected.json (100%) rename test/fixtures/experimental/{decorators-stage-2 => decorators-2}/class-generator/actual.js (100%) rename test/fixtures/experimental/{decorators-stage-2 => decorators-2}/class-generator/expected.json (100%) rename test/fixtures/experimental/{decorators-stage-2 => decorators-2}/complex-expr/actual.js (100%) rename test/fixtures/experimental/{decorators-stage-2 => decorators-2}/complex-expr/expected.json (100%) rename test/fixtures/experimental/{decorators-stage-2 => decorators-2}/export-decorated-class/actual.js (100%) rename test/fixtures/experimental/{decorators-stage-2 => decorators-2}/export-decorated-class/expected.json (100%) rename test/fixtures/experimental/{decorators-stage-2 => decorators-2}/export-decorated-class/options.json (100%) rename test/fixtures/experimental/{decorators-stage-2 => decorators-2}/no-class-method-parameter/actual.js (100%) rename test/fixtures/experimental/{decorators-stage-2 => decorators-2}/no-class-method-parameter/options.json (100%) rename test/fixtures/experimental/{decorators-stage-2 => decorators-2}/no-class-property/actual.js (100%) rename test/fixtures/experimental/{decorators-stage-2 => decorators-2}/no-class-property/options.json (100%) rename test/fixtures/experimental/{decorators-stage-2 => decorators-2}/no-computed-decorator-member/actual.js (100%) rename test/fixtures/experimental/{decorators-stage-2 => decorators-2}/no-computed-decorator-member/options.json (100%) rename test/fixtures/experimental/{decorators-stage-2 => decorators-2}/no-constructor-decorators/actual.js (100%) rename test/fixtures/experimental/{decorators-stage-2 => decorators-2}/no-constructor-decorators/options.json (100%) rename test/fixtures/experimental/{decorators-stage-2 => decorators-2}/no-export-decorators-on-class/actual.js (100%) rename test/fixtures/experimental/{decorators-stage-2 => decorators-2}/no-export-decorators-on-class/options.json (100%) rename test/fixtures/experimental/{decorators-stage-2 => decorators-2}/no-function-parameters/actual.js (100%) rename test/fixtures/experimental/{decorators-stage-2 => decorators-2}/no-function-parameters/options.json (100%) rename test/fixtures/experimental/{decorators-stage-2 => decorators-2}/no-object-method-parameters/actual.js (100%) rename test/fixtures/experimental/{decorators-stage-2 => decorators-2}/no-object-method-parameters/options.json (100%) rename test/fixtures/experimental/{decorators-stage-2 => decorators-2}/no-object-methods/actual.js (100%) rename test/fixtures/experimental/{decorators-stage-2 => decorators-2}/no-object-methods/options.json (100%) rename test/fixtures/experimental/{decorators-stage-2 => decorators-2}/no-private-property/actual.js (100%) rename test/fixtures/experimental/{decorators-stage-2 => decorators-2}/no-private-property/options.json (100%) rename test/fixtures/experimental/{decorators-stage-2 => decorators-2}/no-semi/actual.js (100%) rename test/fixtures/experimental/{decorators-stage-2 => decorators-2}/no-semi/options.json (100%) rename test/fixtures/experimental/{decorators-stage-2 => decorators-2}/no-static-property/actual.js (100%) rename test/fixtures/experimental/{decorators-stage-2 => decorators-2}/no-static-property/options.json (100%) rename test/fixtures/experimental/{decorators-stage-2 => decorators-2}/on-computed-name-method/actual.js (100%) rename test/fixtures/experimental/{decorators-stage-2 => decorators-2}/on-computed-name-method/expected.json (100%) rename test/fixtures/experimental/{decorators-stage-2 => decorators-2}/options.json (100%) rename test/fixtures/experimental/{decorators-stage-2 => decorators-2}/plugin-conflict/actual.js (100%) rename test/fixtures/experimental/{decorators-stage-2 => decorators-2}/plugin-conflict/options.json (100%) rename test/fixtures/experimental/{decorators-stage-2 => decorators-2}/restricted-1/actual.js (100%) rename test/fixtures/experimental/{decorators-stage-2 => decorators-2}/restricted-1/options.json (100%) rename test/fixtures/experimental/{decorators-stage-2 => decorators-2}/restricted-2/actual.js (100%) rename test/fixtures/experimental/{decorators-stage-2 => decorators-2}/restricted-2/options.json (100%) diff --git a/test/fixtures/experimental/decorators-stage-2/class-decorator-call-expr/actual.js b/test/fixtures/experimental/decorators-2/class-decorator-call-expr/actual.js similarity index 100% rename from test/fixtures/experimental/decorators-stage-2/class-decorator-call-expr/actual.js rename to test/fixtures/experimental/decorators-2/class-decorator-call-expr/actual.js diff --git a/test/fixtures/experimental/decorators-stage-2/class-decorator-call-expr/expected.json b/test/fixtures/experimental/decorators-2/class-decorator-call-expr/expected.json similarity index 100% rename from test/fixtures/experimental/decorators-stage-2/class-decorator-call-expr/expected.json rename to test/fixtures/experimental/decorators-2/class-decorator-call-expr/expected.json diff --git a/test/fixtures/experimental/decorators-stage-2/class-decorator/actual.js b/test/fixtures/experimental/decorators-2/class-decorator/actual.js similarity index 100% rename from test/fixtures/experimental/decorators-stage-2/class-decorator/actual.js rename to test/fixtures/experimental/decorators-2/class-decorator/actual.js diff --git a/test/fixtures/experimental/decorators-stage-2/class-decorator/expected.json b/test/fixtures/experimental/decorators-2/class-decorator/expected.json similarity index 100% rename from test/fixtures/experimental/decorators-stage-2/class-decorator/expected.json rename to test/fixtures/experimental/decorators-2/class-decorator/expected.json diff --git a/test/fixtures/experimental/decorators-stage-2/class-expression/actual.js b/test/fixtures/experimental/decorators-2/class-expression/actual.js similarity index 100% rename from test/fixtures/experimental/decorators-stage-2/class-expression/actual.js rename to test/fixtures/experimental/decorators-2/class-expression/actual.js diff --git a/test/fixtures/experimental/decorators-stage-2/class-expression/expected.json b/test/fixtures/experimental/decorators-2/class-expression/expected.json similarity index 100% rename from test/fixtures/experimental/decorators-stage-2/class-expression/expected.json rename to test/fixtures/experimental/decorators-2/class-expression/expected.json diff --git a/test/fixtures/experimental/decorators-stage-2/class-generator/actual.js b/test/fixtures/experimental/decorators-2/class-generator/actual.js similarity index 100% rename from test/fixtures/experimental/decorators-stage-2/class-generator/actual.js rename to test/fixtures/experimental/decorators-2/class-generator/actual.js diff --git a/test/fixtures/experimental/decorators-stage-2/class-generator/expected.json b/test/fixtures/experimental/decorators-2/class-generator/expected.json similarity index 100% rename from test/fixtures/experimental/decorators-stage-2/class-generator/expected.json rename to test/fixtures/experimental/decorators-2/class-generator/expected.json diff --git a/test/fixtures/experimental/decorators-stage-2/complex-expr/actual.js b/test/fixtures/experimental/decorators-2/complex-expr/actual.js similarity index 100% rename from test/fixtures/experimental/decorators-stage-2/complex-expr/actual.js rename to test/fixtures/experimental/decorators-2/complex-expr/actual.js diff --git a/test/fixtures/experimental/decorators-stage-2/complex-expr/expected.json b/test/fixtures/experimental/decorators-2/complex-expr/expected.json similarity index 100% rename from test/fixtures/experimental/decorators-stage-2/complex-expr/expected.json rename to test/fixtures/experimental/decorators-2/complex-expr/expected.json diff --git a/test/fixtures/experimental/decorators-stage-2/export-decorated-class/actual.js b/test/fixtures/experimental/decorators-2/export-decorated-class/actual.js similarity index 100% rename from test/fixtures/experimental/decorators-stage-2/export-decorated-class/actual.js rename to test/fixtures/experimental/decorators-2/export-decorated-class/actual.js diff --git a/test/fixtures/experimental/decorators-stage-2/export-decorated-class/expected.json b/test/fixtures/experimental/decorators-2/export-decorated-class/expected.json similarity index 100% rename from test/fixtures/experimental/decorators-stage-2/export-decorated-class/expected.json rename to test/fixtures/experimental/decorators-2/export-decorated-class/expected.json diff --git a/test/fixtures/experimental/decorators-stage-2/export-decorated-class/options.json b/test/fixtures/experimental/decorators-2/export-decorated-class/options.json similarity index 100% rename from test/fixtures/experimental/decorators-stage-2/export-decorated-class/options.json rename to test/fixtures/experimental/decorators-2/export-decorated-class/options.json diff --git a/test/fixtures/experimental/decorators-stage-2/no-class-method-parameter/actual.js b/test/fixtures/experimental/decorators-2/no-class-method-parameter/actual.js similarity index 100% rename from test/fixtures/experimental/decorators-stage-2/no-class-method-parameter/actual.js rename to test/fixtures/experimental/decorators-2/no-class-method-parameter/actual.js diff --git a/test/fixtures/experimental/decorators-stage-2/no-class-method-parameter/options.json b/test/fixtures/experimental/decorators-2/no-class-method-parameter/options.json similarity index 100% rename from test/fixtures/experimental/decorators-stage-2/no-class-method-parameter/options.json rename to test/fixtures/experimental/decorators-2/no-class-method-parameter/options.json diff --git a/test/fixtures/experimental/decorators-stage-2/no-class-property/actual.js b/test/fixtures/experimental/decorators-2/no-class-property/actual.js similarity index 100% rename from test/fixtures/experimental/decorators-stage-2/no-class-property/actual.js rename to test/fixtures/experimental/decorators-2/no-class-property/actual.js diff --git a/test/fixtures/experimental/decorators-stage-2/no-class-property/options.json b/test/fixtures/experimental/decorators-2/no-class-property/options.json similarity index 100% rename from test/fixtures/experimental/decorators-stage-2/no-class-property/options.json rename to test/fixtures/experimental/decorators-2/no-class-property/options.json diff --git a/test/fixtures/experimental/decorators-stage-2/no-computed-decorator-member/actual.js b/test/fixtures/experimental/decorators-2/no-computed-decorator-member/actual.js similarity index 100% rename from test/fixtures/experimental/decorators-stage-2/no-computed-decorator-member/actual.js rename to test/fixtures/experimental/decorators-2/no-computed-decorator-member/actual.js diff --git a/test/fixtures/experimental/decorators-stage-2/no-computed-decorator-member/options.json b/test/fixtures/experimental/decorators-2/no-computed-decorator-member/options.json similarity index 100% rename from test/fixtures/experimental/decorators-stage-2/no-computed-decorator-member/options.json rename to test/fixtures/experimental/decorators-2/no-computed-decorator-member/options.json diff --git a/test/fixtures/experimental/decorators-stage-2/no-constructor-decorators/actual.js b/test/fixtures/experimental/decorators-2/no-constructor-decorators/actual.js similarity index 100% rename from test/fixtures/experimental/decorators-stage-2/no-constructor-decorators/actual.js rename to test/fixtures/experimental/decorators-2/no-constructor-decorators/actual.js diff --git a/test/fixtures/experimental/decorators-stage-2/no-constructor-decorators/options.json b/test/fixtures/experimental/decorators-2/no-constructor-decorators/options.json similarity index 100% rename from test/fixtures/experimental/decorators-stage-2/no-constructor-decorators/options.json rename to test/fixtures/experimental/decorators-2/no-constructor-decorators/options.json diff --git a/test/fixtures/experimental/decorators-stage-2/no-export-decorators-on-class/actual.js b/test/fixtures/experimental/decorators-2/no-export-decorators-on-class/actual.js similarity index 100% rename from test/fixtures/experimental/decorators-stage-2/no-export-decorators-on-class/actual.js rename to test/fixtures/experimental/decorators-2/no-export-decorators-on-class/actual.js diff --git a/test/fixtures/experimental/decorators-stage-2/no-export-decorators-on-class/options.json b/test/fixtures/experimental/decorators-2/no-export-decorators-on-class/options.json similarity index 100% rename from test/fixtures/experimental/decorators-stage-2/no-export-decorators-on-class/options.json rename to test/fixtures/experimental/decorators-2/no-export-decorators-on-class/options.json diff --git a/test/fixtures/experimental/decorators-stage-2/no-function-parameters/actual.js b/test/fixtures/experimental/decorators-2/no-function-parameters/actual.js similarity index 100% rename from test/fixtures/experimental/decorators-stage-2/no-function-parameters/actual.js rename to test/fixtures/experimental/decorators-2/no-function-parameters/actual.js diff --git a/test/fixtures/experimental/decorators-stage-2/no-function-parameters/options.json b/test/fixtures/experimental/decorators-2/no-function-parameters/options.json similarity index 100% rename from test/fixtures/experimental/decorators-stage-2/no-function-parameters/options.json rename to test/fixtures/experimental/decorators-2/no-function-parameters/options.json diff --git a/test/fixtures/experimental/decorators-stage-2/no-object-method-parameters/actual.js b/test/fixtures/experimental/decorators-2/no-object-method-parameters/actual.js similarity index 100% rename from test/fixtures/experimental/decorators-stage-2/no-object-method-parameters/actual.js rename to test/fixtures/experimental/decorators-2/no-object-method-parameters/actual.js diff --git a/test/fixtures/experimental/decorators-stage-2/no-object-method-parameters/options.json b/test/fixtures/experimental/decorators-2/no-object-method-parameters/options.json similarity index 100% rename from test/fixtures/experimental/decorators-stage-2/no-object-method-parameters/options.json rename to test/fixtures/experimental/decorators-2/no-object-method-parameters/options.json diff --git a/test/fixtures/experimental/decorators-stage-2/no-object-methods/actual.js b/test/fixtures/experimental/decorators-2/no-object-methods/actual.js similarity index 100% rename from test/fixtures/experimental/decorators-stage-2/no-object-methods/actual.js rename to test/fixtures/experimental/decorators-2/no-object-methods/actual.js diff --git a/test/fixtures/experimental/decorators-stage-2/no-object-methods/options.json b/test/fixtures/experimental/decorators-2/no-object-methods/options.json similarity index 100% rename from test/fixtures/experimental/decorators-stage-2/no-object-methods/options.json rename to test/fixtures/experimental/decorators-2/no-object-methods/options.json diff --git a/test/fixtures/experimental/decorators-stage-2/no-private-property/actual.js b/test/fixtures/experimental/decorators-2/no-private-property/actual.js similarity index 100% rename from test/fixtures/experimental/decorators-stage-2/no-private-property/actual.js rename to test/fixtures/experimental/decorators-2/no-private-property/actual.js diff --git a/test/fixtures/experimental/decorators-stage-2/no-private-property/options.json b/test/fixtures/experimental/decorators-2/no-private-property/options.json similarity index 100% rename from test/fixtures/experimental/decorators-stage-2/no-private-property/options.json rename to test/fixtures/experimental/decorators-2/no-private-property/options.json diff --git a/test/fixtures/experimental/decorators-stage-2/no-semi/actual.js b/test/fixtures/experimental/decorators-2/no-semi/actual.js similarity index 100% rename from test/fixtures/experimental/decorators-stage-2/no-semi/actual.js rename to test/fixtures/experimental/decorators-2/no-semi/actual.js diff --git a/test/fixtures/experimental/decorators-stage-2/no-semi/options.json b/test/fixtures/experimental/decorators-2/no-semi/options.json similarity index 100% rename from test/fixtures/experimental/decorators-stage-2/no-semi/options.json rename to test/fixtures/experimental/decorators-2/no-semi/options.json diff --git a/test/fixtures/experimental/decorators-stage-2/no-static-property/actual.js b/test/fixtures/experimental/decorators-2/no-static-property/actual.js similarity index 100% rename from test/fixtures/experimental/decorators-stage-2/no-static-property/actual.js rename to test/fixtures/experimental/decorators-2/no-static-property/actual.js diff --git a/test/fixtures/experimental/decorators-stage-2/no-static-property/options.json b/test/fixtures/experimental/decorators-2/no-static-property/options.json similarity index 100% rename from test/fixtures/experimental/decorators-stage-2/no-static-property/options.json rename to test/fixtures/experimental/decorators-2/no-static-property/options.json diff --git a/test/fixtures/experimental/decorators-stage-2/on-computed-name-method/actual.js b/test/fixtures/experimental/decorators-2/on-computed-name-method/actual.js similarity index 100% rename from test/fixtures/experimental/decorators-stage-2/on-computed-name-method/actual.js rename to test/fixtures/experimental/decorators-2/on-computed-name-method/actual.js diff --git a/test/fixtures/experimental/decorators-stage-2/on-computed-name-method/expected.json b/test/fixtures/experimental/decorators-2/on-computed-name-method/expected.json similarity index 100% rename from test/fixtures/experimental/decorators-stage-2/on-computed-name-method/expected.json rename to test/fixtures/experimental/decorators-2/on-computed-name-method/expected.json diff --git a/test/fixtures/experimental/decorators-stage-2/options.json b/test/fixtures/experimental/decorators-2/options.json similarity index 100% rename from test/fixtures/experimental/decorators-stage-2/options.json rename to test/fixtures/experimental/decorators-2/options.json diff --git a/test/fixtures/experimental/decorators-stage-2/plugin-conflict/actual.js b/test/fixtures/experimental/decorators-2/plugin-conflict/actual.js similarity index 100% rename from test/fixtures/experimental/decorators-stage-2/plugin-conflict/actual.js rename to test/fixtures/experimental/decorators-2/plugin-conflict/actual.js diff --git a/test/fixtures/experimental/decorators-stage-2/plugin-conflict/options.json b/test/fixtures/experimental/decorators-2/plugin-conflict/options.json similarity index 100% rename from test/fixtures/experimental/decorators-stage-2/plugin-conflict/options.json rename to test/fixtures/experimental/decorators-2/plugin-conflict/options.json diff --git a/test/fixtures/experimental/decorators-stage-2/restricted-1/actual.js b/test/fixtures/experimental/decorators-2/restricted-1/actual.js similarity index 100% rename from test/fixtures/experimental/decorators-stage-2/restricted-1/actual.js rename to test/fixtures/experimental/decorators-2/restricted-1/actual.js diff --git a/test/fixtures/experimental/decorators-stage-2/restricted-1/options.json b/test/fixtures/experimental/decorators-2/restricted-1/options.json similarity index 100% rename from test/fixtures/experimental/decorators-stage-2/restricted-1/options.json rename to test/fixtures/experimental/decorators-2/restricted-1/options.json diff --git a/test/fixtures/experimental/decorators-stage-2/restricted-2/actual.js b/test/fixtures/experimental/decorators-2/restricted-2/actual.js similarity index 100% rename from test/fixtures/experimental/decorators-stage-2/restricted-2/actual.js rename to test/fixtures/experimental/decorators-2/restricted-2/actual.js diff --git a/test/fixtures/experimental/decorators-stage-2/restricted-2/options.json b/test/fixtures/experimental/decorators-2/restricted-2/options.json similarity index 100% rename from test/fixtures/experimental/decorators-stage-2/restricted-2/options.json rename to test/fixtures/experimental/decorators-2/restricted-2/options.json