From cddc993b7dfa97cf9f369b3a0073c4a085452c24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hu=C3=A1ng=20J=C3=B9nli=C3=A0ng?= Date: Fri, 24 Apr 2020 16:26:07 -0400 Subject: [PATCH 1/4] fix: do not throw invalid hash in tokenizer --- packages/babel-parser/src/tokenizer/index.js | 18 ++++++++---------- .../invalid-syntax/migrated_0065/options.json | 4 ++-- .../.class-private-properties/options.json | 4 ---- .../input.js | 0 .../class-private-properties/options.json | 3 +++ .../not-enabled-hash/options.json | 5 ++--- 6 files changed, 15 insertions(+), 19 deletions(-) delete mode 100644 packages/babel-parser/test/fixtures/experimental/_no-plugin/.class-private-properties/options.json rename packages/babel-parser/test/fixtures/experimental/_no-plugin/{.class-private-properties => class-private-properties}/input.js (100%) create mode 100644 packages/babel-parser/test/fixtures/experimental/_no-plugin/class-private-properties/options.json diff --git a/packages/babel-parser/src/tokenizer/index.js b/packages/babel-parser/src/tokenizer/index.js index 1eefa40ade01..16d0ccb17023 100644 --- a/packages/babel-parser/src/tokenizer/index.js +++ b/packages/babel-parser/src/tokenizer/index.js @@ -405,10 +405,14 @@ export default class Tokenizer extends LocationParser { } if ( - this.hasPlugin("recordAndTuple") && - (next === charCodes.leftCurlyBrace || - next === charCodes.leftSquareBracket) + next === charCodes.leftCurlyBrace || + (next === charCodes.leftSquareBracket && this.hasPlugin("recordAndTuple")) ) { + // When we see `#{`, it is likely to be a hash record. + // However we don't yell at `#[` since users may intend to use "computed private fields", + // which is not allowed in the spec. Throwing expecting recordAndTuple is + // misleading + this.expectPlugin("recordAndTuple"); if (this.getPluginOption("recordAndTuple", "syntaxType") !== "hash") { throw this.raise( this.state.pos, @@ -426,14 +430,8 @@ export default class Tokenizer extends LocationParser { this.finishToken(tt.bracketHashL); } this.state.pos += 2; - } else if ( - this.hasPlugin("classPrivateProperties") || - this.hasPlugin("classPrivateMethods") || - this.getPluginOption("pipelineOperator", "proposal") === "smart" - ) { - this.finishOp(tt.hash, 1); } else { - throw this.raise(this.state.pos, Errors.InvalidOrUnexpectedToken, "#"); + this.finishOp(tt.hash, 1); } } diff --git a/packages/babel-parser/test/fixtures/esprima/invalid-syntax/migrated_0065/options.json b/packages/babel-parser/test/fixtures/esprima/invalid-syntax/migrated_0065/options.json index 895412e4e5f7..ff1ac8247e68 100644 --- a/packages/babel-parser/test/fixtures/esprima/invalid-syntax/migrated_0065/options.json +++ b/packages/babel-parser/test/fixtures/esprima/invalid-syntax/migrated_0065/options.json @@ -1,3 +1,3 @@ { - "throws": "Unexpected character '#' (1:2)" -} + "throws": "Unexpected token, expected \";\" (1:2)" +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/experimental/_no-plugin/.class-private-properties/options.json b/packages/babel-parser/test/fixtures/experimental/_no-plugin/.class-private-properties/options.json deleted file mode 100644 index 85d7fee65f66..000000000000 --- a/packages/babel-parser/test/fixtures/experimental/_no-plugin/.class-private-properties/options.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "throws": "This experimental syntax requires enabling the parser plugin: 'classPrivateProperties' (2:3)", - "plugins": [] -} diff --git a/packages/babel-parser/test/fixtures/experimental/_no-plugin/.class-private-properties/input.js b/packages/babel-parser/test/fixtures/experimental/_no-plugin/class-private-properties/input.js similarity index 100% rename from packages/babel-parser/test/fixtures/experimental/_no-plugin/.class-private-properties/input.js rename to packages/babel-parser/test/fixtures/experimental/_no-plugin/class-private-properties/input.js diff --git a/packages/babel-parser/test/fixtures/experimental/_no-plugin/class-private-properties/options.json b/packages/babel-parser/test/fixtures/experimental/_no-plugin/class-private-properties/options.json new file mode 100644 index 000000000000..6904d075e9f1 --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/_no-plugin/class-private-properties/options.json @@ -0,0 +1,3 @@ +{ + "throws": "This experimental syntax requires enabling one of the following parser plugin(s): 'classPrivateProperties, classPrivateMethods' (2:2)" +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/experimental/record-and-tuple/not-enabled-hash/options.json b/packages/babel-parser/test/fixtures/experimental/record-and-tuple/not-enabled-hash/options.json index 52f524480cd0..9565d05f7929 100644 --- a/packages/babel-parser/test/fixtures/experimental/record-and-tuple/not-enabled-hash/options.json +++ b/packages/babel-parser/test/fixtures/experimental/record-and-tuple/not-enabled-hash/options.json @@ -1,4 +1,3 @@ { - "plugins": [], - "throws": "Unexpected character '#' (1:0)" -} + "throws": "This experimental syntax requires enabling the parser plugin: 'recordAndTuple' (1:0)" +} \ No newline at end of file From c6ee0a5e9063f40f34f2e4bb51ed0d3c083b6151 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hu=C3=A1ng=20J=C3=B9nli=C3=A0ng?= Date: Fri, 24 Apr 2020 16:31:01 -0400 Subject: [PATCH 2/4] refactor: bigint has been enabled by default --- .../test/fixtures/experimental/_no-plugin/.bigint/input.js | 1 - .../fixtures/experimental/_no-plugin/.bigint/options.json | 4 ---- 2 files changed, 5 deletions(-) delete mode 100644 packages/babel-parser/test/fixtures/experimental/_no-plugin/.bigint/input.js delete mode 100644 packages/babel-parser/test/fixtures/experimental/_no-plugin/.bigint/options.json diff --git a/packages/babel-parser/test/fixtures/experimental/_no-plugin/.bigint/input.js b/packages/babel-parser/test/fixtures/experimental/_no-plugin/.bigint/input.js deleted file mode 100644 index 7a5a058e169c..000000000000 --- a/packages/babel-parser/test/fixtures/experimental/_no-plugin/.bigint/input.js +++ /dev/null @@ -1 +0,0 @@ -1n diff --git a/packages/babel-parser/test/fixtures/experimental/_no-plugin/.bigint/options.json b/packages/babel-parser/test/fixtures/experimental/_no-plugin/.bigint/options.json deleted file mode 100644 index 8e44fabed2f5..000000000000 --- a/packages/babel-parser/test/fixtures/experimental/_no-plugin/.bigint/options.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "throws": "This experimental syntax requires enabling the parser plugin: 'bigInt' (1:1)", - "plugins": [] -} From 11ae6809fa0a04e563ac22452359b40f1582d24e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hu=C3=A1ng=20J=C3=B9nli=C3=A0ng?= Date: Fri, 24 Apr 2020 17:06:34 -0400 Subject: [PATCH 3/4] polish: add numeric separator missing plugin error --- packages/babel-parser/src/tokenizer/index.js | 11 ++++++++++- .../_no-plugin/numeric-separator-radix/input.js | 1 + .../options.json | 5 ++--- .../input.js | 0 .../_no-plugin/numeric-separator/options.json | 3 +++ 5 files changed, 16 insertions(+), 4 deletions(-) create mode 100644 packages/babel-parser/test/fixtures/experimental/_no-plugin/numeric-separator-radix/input.js rename packages/babel-parser/test/fixtures/experimental/_no-plugin/{.numeric-separator => numeric-separator-radix}/options.json (53%) rename packages/babel-parser/test/fixtures/experimental/_no-plugin/{.numeric-separator => numeric-separator}/input.js (100%) create mode 100644 packages/babel-parser/test/fixtures/experimental/_no-plugin/numeric-separator/options.json diff --git a/packages/babel-parser/src/tokenizer/index.js b/packages/babel-parser/src/tokenizer/index.js index 16d0ccb17023..47a52f439126 100644 --- a/packages/babel-parser/src/tokenizer/index.js +++ b/packages/babel-parser/src/tokenizer/index.js @@ -1078,8 +1078,13 @@ export default class Tokenizer extends LocationParser { if (val == null) { this.raise(this.state.start + 2, Errors.InvalidDigit, radix); } + const next = this.input.charCodeAt(this.state.pos); - if (this.input.charCodeAt(this.state.pos) === charCodes.lowercaseN) { + if (next === charCodes.underscore) { + this.expectPlugin("numericSeparator", this.state.pos); + } + + if (next === charCodes.lowercaseN) { ++this.state.pos; isBigInt = true; } @@ -1152,6 +1157,10 @@ export default class Tokenizer extends LocationParser { } } + if (next === charCodes.underscore) { + this.expectPlugin("numericSeparator", this.state.pos); + } + if (next === charCodes.lowercaseN) { // disallow floats, legacy octal syntax and non octal decimals // new style octal ("0o") is handled in this.readRadixNumber diff --git a/packages/babel-parser/test/fixtures/experimental/_no-plugin/numeric-separator-radix/input.js b/packages/babel-parser/test/fixtures/experimental/_no-plugin/numeric-separator-radix/input.js new file mode 100644 index 000000000000..0fa2562844bb --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/_no-plugin/numeric-separator-radix/input.js @@ -0,0 +1 @@ +0b1_0 diff --git a/packages/babel-parser/test/fixtures/experimental/_no-plugin/.numeric-separator/options.json b/packages/babel-parser/test/fixtures/experimental/_no-plugin/numeric-separator-radix/options.json similarity index 53% rename from packages/babel-parser/test/fixtures/experimental/_no-plugin/.numeric-separator/options.json rename to packages/babel-parser/test/fixtures/experimental/_no-plugin/numeric-separator-radix/options.json index 6996ba6f1573..180f7a692d48 100644 --- a/packages/babel-parser/test/fixtures/experimental/_no-plugin/.numeric-separator/options.json +++ b/packages/babel-parser/test/fixtures/experimental/_no-plugin/numeric-separator-radix/options.json @@ -1,4 +1,3 @@ { - "throws": "This experimental syntax requires enabling the parser plugin: 'numericSeparator' (1:17)", - "plugins": [] -} + "throws": "This experimental syntax requires enabling the parser plugin: 'numericSeparator' (1:3)" +} \ No newline at end of file diff --git a/packages/babel-parser/test/fixtures/experimental/_no-plugin/.numeric-separator/input.js b/packages/babel-parser/test/fixtures/experimental/_no-plugin/numeric-separator/input.js similarity index 100% rename from packages/babel-parser/test/fixtures/experimental/_no-plugin/.numeric-separator/input.js rename to packages/babel-parser/test/fixtures/experimental/_no-plugin/numeric-separator/input.js diff --git a/packages/babel-parser/test/fixtures/experimental/_no-plugin/numeric-separator/options.json b/packages/babel-parser/test/fixtures/experimental/_no-plugin/numeric-separator/options.json new file mode 100644 index 000000000000..ed83acd92c8c --- /dev/null +++ b/packages/babel-parser/test/fixtures/experimental/_no-plugin/numeric-separator/options.json @@ -0,0 +1,3 @@ +{ + "throws": "This experimental syntax requires enabling the parser plugin: 'numericSeparator' (1:1)" +} \ No newline at end of file From b173d8e0e659bcd81f60c5c885ecc09e23aa3042 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hu=C3=A1ng=20J=C3=B9nli=C3=A0ng?= Date: Fri, 24 Apr 2020 18:02:14 -0400 Subject: [PATCH 4/4] fix: forward expectPlugin declaration --- packages/babel-parser/src/tokenizer/index.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/babel-parser/src/tokenizer/index.js b/packages/babel-parser/src/tokenizer/index.js index 47a52f439126..96ff0c21297a 100644 --- a/packages/babel-parser/src/tokenizer/index.js +++ b/packages/babel-parser/src/tokenizer/index.js @@ -113,6 +113,7 @@ export default class Tokenizer extends LocationParser { // parser/util.js /*:: +unexpected: (pos?: ?number, messageOrType?: string | TokenType) => empty; + +expectPlugin: (name: string, pos?: ?number) => true; */ isLookahead: boolean;