From 850bc1d3dd868705331f963569583ce325921d5b Mon Sep 17 00:00:00 2001 From: Bruno Macabeus Date: Tue, 2 Oct 2018 23:31:06 -0300 Subject: [PATCH] class private methods and properties: should not allow spaces between # and identifier (#8756) --- packages/babel-parser/src/parser/expression.js | 12 ++++++++++++ .../class-private-methods/failure-spaces/input.js | 5 +++++ .../failure-spaces/options.json | 4 ++++ .../class-private-properties/failure-spaces/input.js | 3 +++ .../failure-spaces/options.json | 4 ++++ 5 files changed, 28 insertions(+) create mode 100644 packages/babel-parser/test/fixtures/experimental/class-private-methods/failure-spaces/input.js create mode 100644 packages/babel-parser/test/fixtures/experimental/class-private-methods/failure-spaces/options.json create mode 100644 packages/babel-parser/test/fixtures/experimental/class-private-properties/failure-spaces/input.js create mode 100644 packages/babel-parser/test/fixtures/experimental/class-private-properties/failure-spaces/options.json diff --git a/packages/babel-parser/src/parser/expression.js b/packages/babel-parser/src/parser/expression.js index 48dd82d673..e1ea1aa55d 100644 --- a/packages/babel-parser/src/parser/expression.js +++ b/packages/babel-parser/src/parser/expression.js @@ -923,7 +923,19 @@ export default class ExpressionParser extends LValParser { if (isPrivate) { this.expectOnePlugin(["classPrivateProperties", "classPrivateMethods"]); const node = this.startNode(); + const columnHashEnd = this.state.end; this.next(); + const columnIdentifierStart = this.state.start; + + const spacesBetweenHashAndIdentifier = + columnIdentifierStart - columnHashEnd; + if (spacesBetweenHashAndIdentifier != 0) { + this.raise( + columnIdentifierStart, + "Unexpected space between # and identifier", + ); + } + node.id = this.parseIdentifier(true); return this.finishNode(node, "PrivateName"); } else { diff --git a/packages/babel-parser/test/fixtures/experimental/class-private-methods/failure-spaces/input.js b/packages/babel-parser/test/fixtures/experimental/class-private-methods/failure-spaces/input.js new file mode 100644 index 0000000000..b49e1327f4 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/class-private-methods/failure-spaces/input.js @@ -0,0 +1,5 @@ +class Spaces { + # wrongSpaces() { + return fail(); + } +} diff --git a/packages/babel-parser/test/fixtures/experimental/class-private-methods/failure-spaces/options.json b/packages/babel-parser/test/fixtures/experimental/class-private-methods/failure-spaces/options.json new file mode 100644 index 0000000000..f8dba0c322 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/class-private-methods/failure-spaces/options.json @@ -0,0 +1,4 @@ +{ + "throws": "Unexpected space between # and identifier (2:5)", + "plugins": ["classPrivateMethods"] +} diff --git a/packages/babel-parser/test/fixtures/experimental/class-private-properties/failure-spaces/input.js b/packages/babel-parser/test/fixtures/experimental/class-private-properties/failure-spaces/input.js new file mode 100644 index 0000000000..023684c53e --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/class-private-properties/failure-spaces/input.js @@ -0,0 +1,3 @@ +class Spaces { + # wrongSpaces; +} diff --git a/packages/babel-parser/test/fixtures/experimental/class-private-properties/failure-spaces/options.json b/packages/babel-parser/test/fixtures/experimental/class-private-properties/failure-spaces/options.json new file mode 100644 index 0000000000..f8dba0c322 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/class-private-properties/failure-spaces/options.json @@ -0,0 +1,4 @@ +{ + "throws": "Unexpected space between # and identifier (2:5)", + "plugins": ["classPrivateMethods"] +}