From 51bd87baa81e1ef1a43fe91e97ef8bea60cef56c Mon Sep 17 00:00:00 2001 From: Sven SAULEAU Date: Tue, 30 May 2017 18:35:29 +0200 Subject: [PATCH] feat: use syntax plugin --- README.md | 1 + src/parser/expression.js | 8 ++++++-- .../optional-chaining/class-contructor-call/options.json | 3 +++ .../optional-chaining/function-call/options.json | 3 +++ .../optional-chaining/member-access-bracket/options.json | 3 +++ .../optional-chaining/member-access/options.json | 3 +++ .../optional-chaining/missing-plugin/actual.js | 1 + .../optional-chaining/missing-plugin/options.json | 3 +++ 8 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 test/fixtures/experimental/optional-chaining/class-contructor-call/options.json create mode 100644 test/fixtures/experimental/optional-chaining/function-call/options.json create mode 100644 test/fixtures/experimental/optional-chaining/member-access-bracket/options.json create mode 100644 test/fixtures/experimental/optional-chaining/member-access/options.json create mode 100644 test/fixtures/experimental/optional-chaining/missing-plugin/actual.js create mode 100644 test/fixtures/experimental/optional-chaining/missing-plugin/options.json diff --git a/README.md b/README.md index be6f771feb..c2b511d2e8 100644 --- a/README.md +++ b/README.md @@ -139,6 +139,7 @@ require("babylon").parse("code", { - `functionSent` - `dynamicImport` ([proposal](https://github.com/tc39/proposal-dynamic-import)) - `numericSeparator` ([proposal](https://github.com/samuelgoto/proposal-numeric-separator)) + - `optionalChaining` ([proposal](https://github.com/tc39/proposal-optional-chaining)) ### FAQ diff --git a/src/parser/expression.js b/src/parser/expression.js index a29b84a4d2..0ab2c501cd 100644 --- a/src/parser/expression.js +++ b/src/parser/expression.js @@ -303,8 +303,13 @@ export default class ExpressionParser extends LValParser { return this.parseSubscripts(this.finishNode(node, "BindExpression"), startPos, startLoc, noCalls); } else if (this.eat(tt.questionDot)) { + const node = this.startNodeAt(startPos, startLoc); + + if (!this.hasPlugin("optionalChaining")) { + this.raise(node.start, "You can only use optional-chaining when the 'optionalChaining' plugin is enabled."); + } + if (this.eat(tt.bracketL)) { - const node = this.startNodeAt(startPos, startLoc); node.object = base; node.optional = true; node.property = this.parseExpression(); @@ -312,7 +317,6 @@ export default class ExpressionParser extends LValParser { this.expect(tt.bracketR); base = this.finishNode(node, "MemberExpression"); } else { - const node = this.startNodeAt(startPos, startLoc); node.object = base; node.property = this.parseIdentifier(true); node.optional = true; diff --git a/test/fixtures/experimental/optional-chaining/class-contructor-call/options.json b/test/fixtures/experimental/optional-chaining/class-contructor-call/options.json new file mode 100644 index 0000000000..fd201c1bdb --- /dev/null +++ b/test/fixtures/experimental/optional-chaining/class-contructor-call/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["optionalChaining"] +} diff --git a/test/fixtures/experimental/optional-chaining/function-call/options.json b/test/fixtures/experimental/optional-chaining/function-call/options.json new file mode 100644 index 0000000000..fd201c1bdb --- /dev/null +++ b/test/fixtures/experimental/optional-chaining/function-call/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["optionalChaining"] +} diff --git a/test/fixtures/experimental/optional-chaining/member-access-bracket/options.json b/test/fixtures/experimental/optional-chaining/member-access-bracket/options.json new file mode 100644 index 0000000000..fd201c1bdb --- /dev/null +++ b/test/fixtures/experimental/optional-chaining/member-access-bracket/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["optionalChaining"] +} diff --git a/test/fixtures/experimental/optional-chaining/member-access/options.json b/test/fixtures/experimental/optional-chaining/member-access/options.json new file mode 100644 index 0000000000..fd201c1bdb --- /dev/null +++ b/test/fixtures/experimental/optional-chaining/member-access/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["optionalChaining"] +} diff --git a/test/fixtures/experimental/optional-chaining/missing-plugin/actual.js b/test/fixtures/experimental/optional-chaining/missing-plugin/actual.js new file mode 100644 index 0000000000..2807546113 --- /dev/null +++ b/test/fixtures/experimental/optional-chaining/missing-plugin/actual.js @@ -0,0 +1 @@ +a?.b diff --git a/test/fixtures/experimental/optional-chaining/missing-plugin/options.json b/test/fixtures/experimental/optional-chaining/missing-plugin/options.json new file mode 100644 index 0000000000..9aa9db14c9 --- /dev/null +++ b/test/fixtures/experimental/optional-chaining/missing-plugin/options.json @@ -0,0 +1,3 @@ +{ + "throws": "You can only use optional-chaining when the 'optionalChaining' plugin is enabled. (1:0)" +}