Add some parser missing plugins errors (#11478)

* fix: do not throw invalid hash in tokenizer

* refactor: bigint has been enabled by default

* polish: add numeric separator missing plugin error

* fix: forward expectPlugin declaration
This commit is contained in:
Huáng Jùnliàng 2020-04-25 04:26:39 -04:00 committed by GitHub
parent d05334bde2
commit 2e4f18ac92
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 31 additions and 27 deletions

View File

@ -113,6 +113,7 @@ export default class Tokenizer extends LocationParser {
// parser/util.js // parser/util.js
/*:: /*::
+unexpected: (pos?: ?number, messageOrType?: string | TokenType) => empty; +unexpected: (pos?: ?number, messageOrType?: string | TokenType) => empty;
+expectPlugin: (name: string, pos?: ?number) => true;
*/ */
isLookahead: boolean; isLookahead: boolean;
@ -405,10 +406,14 @@ export default class Tokenizer extends LocationParser {
} }
if ( if (
this.hasPlugin("recordAndTuple") && next === charCodes.leftCurlyBrace ||
(next === charCodes.leftCurlyBrace || (next === charCodes.leftSquareBracket && this.hasPlugin("recordAndTuple"))
next === charCodes.leftSquareBracket)
) { ) {
// 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") { if (this.getPluginOption("recordAndTuple", "syntaxType") !== "hash") {
throw this.raise( throw this.raise(
this.state.pos, this.state.pos,
@ -426,14 +431,8 @@ export default class Tokenizer extends LocationParser {
this.finishToken(tt.bracketHashL); this.finishToken(tt.bracketHashL);
} }
this.state.pos += 2; this.state.pos += 2;
} else if (
this.hasPlugin("classPrivateProperties") ||
this.hasPlugin("classPrivateMethods") ||
this.getPluginOption("pipelineOperator", "proposal") === "smart"
) {
this.finishOp(tt.hash, 1);
} else { } else {
throw this.raise(this.state.pos, Errors.InvalidOrUnexpectedToken, "#"); this.finishOp(tt.hash, 1);
} }
} }
@ -1080,8 +1079,13 @@ export default class Tokenizer extends LocationParser {
if (val == null) { if (val == null) {
this.raise(this.state.start + 2, Errors.InvalidDigit, radix); 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; ++this.state.pos;
isBigInt = true; isBigInt = true;
} }
@ -1154,6 +1158,10 @@ export default class Tokenizer extends LocationParser {
} }
} }
if (next === charCodes.underscore) {
this.expectPlugin("numericSeparator", this.state.pos);
}
if (next === charCodes.lowercaseN) { if (next === charCodes.lowercaseN) {
// disallow floats, legacy octal syntax and non octal decimals // disallow floats, legacy octal syntax and non octal decimals
// new style octal ("0o") is handled in this.readRadixNumber // new style octal ("0o") is handled in this.readRadixNumber

View File

@ -1,3 +1,3 @@
{ {
"throws": "Unexpected character '#' (1:2)" "throws": "Unexpected token, expected \";\" (1:2)"
} }

View File

@ -1,4 +0,0 @@
{
"throws": "This experimental syntax requires enabling the parser plugin: 'classPrivateProperties' (2:3)",
"plugins": []
}

View File

@ -0,0 +1,3 @@
{
"throws": "This experimental syntax requires enabling one of the following parser plugin(s): 'classPrivateProperties, classPrivateMethods' (2:2)"
}

View File

@ -1,4 +1,3 @@
{ {
"throws": "This experimental syntax requires enabling the parser plugin: 'bigInt' (1:1)", "throws": "This experimental syntax requires enabling the parser plugin: 'numericSeparator' (1:3)"
"plugins": []
} }

View File

@ -1,4 +1,3 @@
{ {
"throws": "This experimental syntax requires enabling the parser plugin: 'numericSeparator' (1:17)", "throws": "This experimental syntax requires enabling the parser plugin: 'numericSeparator' (1:1)"
"plugins": []
} }

View File

@ -1,4 +1,3 @@
{ {
"plugins": [], "throws": "This experimental syntax requires enabling the parser plugin: 'recordAndTuple' (1:0)"
"throws": "Unexpected character '#' (1:0)"
} }