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
/*::
+unexpected: (pos?: ?number, messageOrType?: string | TokenType) => empty;
+expectPlugin: (name: string, pos?: ?number) => true;
*/
isLookahead: boolean;
@ -405,10 +406,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 +431,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);
}
}
@ -1080,8 +1079,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;
}
@ -1154,6 +1158,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

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)",
"plugins": []
}
"throws": "This experimental syntax requires enabling the parser plugin: 'numericSeparator' (1:3)"
}

View File

@ -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:1)"
}

View File

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