fix(babel-parser): delete static property from class static block for TS (#13680)

* Delete static modifier from static blocks node

* Update tests

* Address review

* Address review

* Add tests from review

* Add tests
This commit is contained in:
Sosuke Suzuki 2021-08-26 03:19:04 +09:00 committed by GitHub
parent 1d4bd31950
commit b141c85b17
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
36 changed files with 183 additions and 30 deletions

View File

@ -230,18 +230,23 @@ export default (superClass: Class<Parser>): Class<Parser> =>
} }
/** Parses a modifier matching one the given modifier names. */ /** Parses a modifier matching one the given modifier names. */
tsParseModifier<T: TsModifier>(allowedModifiers: T[]): ?T { tsParseModifier<T: TsModifier>(
allowedModifiers: T[],
stopOnStartOfClassStaticBlock?: boolean,
): ?T {
if (!this.match(tt.name)) { if (!this.match(tt.name)) {
return undefined; return undefined;
} }
const modifier = this.state.value; const modifier = this.state.value;
if ( if (allowedModifiers.indexOf(modifier) !== -1) {
allowedModifiers.indexOf(modifier) !== -1 && if (stopOnStartOfClassStaticBlock && this.tsIsStartOfStaticBlocks()) {
this.tsTryParse(this.tsNextTokenCanFollowModifier.bind(this)) return undefined;
) { }
if (this.tsTryParse(this.tsNextTokenCanFollowModifier.bind(this))) {
return modifier; return modifier;
} }
}
return undefined; return undefined;
} }
@ -258,6 +263,7 @@ export default (superClass: Class<Parser>): Class<Parser> =>
allowedModifiers: TsModifier[], allowedModifiers: TsModifier[],
disallowedModifiers?: TsModifier[], disallowedModifiers?: TsModifier[],
errorTemplate?: ErrorTemplate, errorTemplate?: ErrorTemplate,
stopOnStartOfClassStaticBlock?: boolean,
): void { ): void {
const enforceOrder = (pos, modifier, before, after) => { const enforceOrder = (pos, modifier, before, after) => {
if (modifier === before && modified[after]) { if (modifier === before && modified[after]) {
@ -277,6 +283,7 @@ export default (superClass: Class<Parser>): Class<Parser> =>
const startPos = this.state.start; const startPos = this.state.start;
const modifier: ?TsModifier = this.tsParseModifier( const modifier: ?TsModifier = this.tsParseModifier(
allowedModifiers.concat(disallowedModifiers ?? []), allowedModifiers.concat(disallowedModifiers ?? []),
stopOnStartOfClassStaticBlock,
); );
if (!modifier) break; if (!modifier) break;
@ -2374,12 +2381,19 @@ export default (superClass: Class<Parser>): Class<Parser> =>
}); });
} }
tsIsStartOfStaticBlocks() {
return (
this.isContextual("static") &&
this.lookaheadCharCode() === charCodes.leftCurlyBrace
);
}
parseClassMember( parseClassMember(
classBody: N.ClassBody, classBody: N.ClassBody,
member: any, member: any,
state: N.ParseClassMemberState, state: N.ParseClassMemberState,
): void { ): void {
const invalidModifersForStaticBlocks = [ const modifiers = [
"declare", "declare",
"private", "private",
"public", "public",
@ -2387,21 +2401,31 @@ export default (superClass: Class<Parser>): Class<Parser> =>
"override", "override",
"abstract", "abstract",
"readonly", "readonly",
"static",
]; ];
this.tsParseModifiers( this.tsParseModifiers(
member, member,
invalidModifersForStaticBlocks.concat(["static"]), modifiers,
/* disallowedModifiers */ undefined,
/* errorTemplate */ undefined,
/* stopOnStartOfClassStaticBlock */ true,
); );
const callParseClassMemberWithIsStatic = () => { const callParseClassMemberWithIsStatic = () => {
const isStatic = !!member.static; if (this.tsIsStartOfStaticBlocks()) {
if (isStatic && this.eat(tt.braceL)) { this.next(); // eat "static"
if (this.tsHasSomeModifiers(member, invalidModifersForStaticBlocks)) { this.next(); // eat "{"
if (this.tsHasSomeModifiers(member, modifiers)) {
this.raise(this.state.pos, TSErrors.StaticBlockCannotHaveModifier); this.raise(this.state.pos, TSErrors.StaticBlockCannotHaveModifier);
} }
this.parseClassStaticBlock(classBody, ((member: any): N.StaticBlock)); this.parseClassStaticBlock(classBody, ((member: any): N.StaticBlock));
} else { } else {
this.parseClassMemberWithIsStatic(classBody, member, state, isStatic); this.parseClassMemberWithIsStatic(
classBody,
member,
state,
!!member.static,
);
} }
}; };
if (member.declare) { if (member.declare) {

View File

@ -0,0 +1,3 @@
class Foo {
private static {}
}

View File

@ -2,7 +2,6 @@
"type": "File", "type": "File",
"start":0,"end":33,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}}, "start":0,"end":33,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}},
"errors": [ "errors": [
"SyntaxError: 'private' modifier must precede 'static' modifier. (2:9)",
"SyntaxError: Static class blocks cannot have any modifier. (2:19)" "SyntaxError: Static class blocks cannot have any modifier. (2:19)"
], ],
"program": { "program": {
@ -27,7 +26,6 @@
{ {
"type": "StaticBlock", "type": "StaticBlock",
"start":14,"end":31,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":19}}, "start":14,"end":31,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":19}},
"static": true,
"accessibility": "private", "accessibility": "private",
"body": [] "body": []
} }

View File

@ -0,0 +1,12 @@
{
"plugins": [
[
"classStaticBlock"
],
[
"typescript"
]
],
"sourceType": "module",
"throws": "Unexpected token (2:17)"
}

View File

@ -0,0 +1,3 @@
class Foo {
protected static {}
}

View File

@ -2,7 +2,6 @@
"type": "File", "type": "File",
"start":0,"end":35,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}}, "start":0,"end":35,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}},
"errors": [ "errors": [
"SyntaxError: 'protected' modifier must precede 'static' modifier. (2:9)",
"SyntaxError: Static class blocks cannot have any modifier. (2:21)" "SyntaxError: Static class blocks cannot have any modifier. (2:21)"
], ],
"program": { "program": {
@ -27,7 +26,6 @@
{ {
"type": "StaticBlock", "type": "StaticBlock",
"start":14,"end":33,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":21}}, "start":14,"end":33,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":21}},
"static": true,
"accessibility": "protected", "accessibility": "protected",
"body": [] "body": []
} }

View File

@ -0,0 +1,12 @@
{
"plugins": [
[
"classStaticBlock"
],
[
"typescript"
]
],
"sourceType": "module",
"throws": "Unexpected token (2:19)"
}

View File

@ -0,0 +1,3 @@
class Foo {
public static {}
}

View File

@ -2,7 +2,6 @@
"type": "File", "type": "File",
"start":0,"end":32,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}}, "start":0,"end":32,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}},
"errors": [ "errors": [
"SyntaxError: 'public' modifier must precede 'static' modifier. (2:9)",
"SyntaxError: Static class blocks cannot have any modifier. (2:18)" "SyntaxError: Static class blocks cannot have any modifier. (2:18)"
], ],
"program": { "program": {
@ -27,7 +26,6 @@
{ {
"type": "StaticBlock", "type": "StaticBlock",
"start":14,"end":30,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":18}}, "start":14,"end":30,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":18}},
"static": true,
"accessibility": "public", "accessibility": "public",
"body": [] "body": []
} }

View File

@ -0,0 +1,12 @@
{
"plugins": [
[
"classStaticBlock"
],
[
"typescript"
]
],
"sourceType": "module",
"throws": "Unexpected token (2:16)"
}

View File

@ -2,7 +2,6 @@
"type": "File", "type": "File",
"start":0,"end":34,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}}, "start":0,"end":34,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}},
"errors": [ "errors": [
"SyntaxError: 'static' modifier cannot be used with 'abstract' modifier. (2:11)",
"SyntaxError: Static class blocks cannot have any modifier. (2:20)" "SyntaxError: Static class blocks cannot have any modifier. (2:20)"
], ],
"program": { "program": {
@ -28,7 +27,6 @@
"type": "StaticBlock", "type": "StaticBlock",
"start":14,"end":32,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":20}}, "start":14,"end":32,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":20}},
"abstract": true, "abstract": true,
"static": true,
"body": [] "body": []
} }
] ]

View File

@ -0,0 +1,3 @@
class Foo {
static abstract {}
}

View File

@ -0,0 +1,12 @@
{
"plugins": [
[
"classStaticBlock"
],
[
"typescript"
]
],
"sourceType": "module",
"throws": "Unexpected token (2:18)"
}

View File

@ -0,0 +1,38 @@
{
"type": "File",
"start":0,"end":34,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}},
"errors": [
"SyntaxError: Static class blocks cannot have any modifier. (2:20)"
],
"program": {
"type": "Program",
"start":0,"end":34,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}},
"sourceType": "module",
"interpreter": null,
"body": [
{
"type": "ClassDeclaration",
"start":0,"end":34,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}},
"id": {
"type": "Identifier",
"start":6,"end":9,"loc":{"start":{"line":1,"column":6},"end":{"line":1,"column":9},"identifierName":"Foo"},
"name": "Foo"
},
"superClass": null,
"body": {
"type": "ClassBody",
"start":10,"end":34,"loc":{"start":{"line":1,"column":10},"end":{"line":3,"column":1}},
"body": [
{
"type": "StaticBlock",
"start":14,"end":32,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":20}},
"abstract": true,
"body": []
}
]
}
}
],
"directives": []
}
}

View File

@ -2,7 +2,6 @@
"type": "File", "type": "File",
"start":0,"end":34,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}}, "start":0,"end":34,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}},
"errors": [ "errors": [
"SyntaxError: 'static' modifier must precede 'override' modifier. (2:11)",
"SyntaxError: Static class blocks cannot have any modifier. (2:20)" "SyntaxError: Static class blocks cannot have any modifier. (2:20)"
], ],
"program": { "program": {
@ -28,7 +27,6 @@
"type": "StaticBlock", "type": "StaticBlock",
"start":14,"end":32,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":20}}, "start":14,"end":32,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":20}},
"override": true, "override": true,
"static": true,
"body": [] "body": []
} }
] ]

View File

@ -0,0 +1,3 @@
class Foo {
static override {}
}

View File

@ -0,0 +1,12 @@
{
"plugins": [
[
"classStaticBlock"
],
[
"typescript"
]
],
"sourceType": "module",
"throws": "Unexpected token (2:18)"
}

View File

@ -2,7 +2,7 @@
"type": "File", "type": "File",
"start":0,"end":32,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}}, "start":0,"end":32,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}},
"errors": [ "errors": [
"SyntaxError: Duplicate modifier: 'static'. (2:9)" "SyntaxError: Static class blocks cannot have any modifier. (2:18)"
], ],
"program": { "program": {
"type": "Program", "type": "Program",

View File

@ -27,7 +27,6 @@
"type": "StaticBlock", "type": "StaticBlock",
"start":14,"end":31,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":19}}, "start":14,"end":31,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":19}},
"declare": true, "declare": true,
"static": true,
"body": [] "body": []
} }
] ]

View File

@ -0,0 +1,3 @@
class Foo {
static declare {}
}

View File

@ -0,0 +1,12 @@
{
"plugins": [
[
"classStaticBlock"
],
[
"typescript"
]
],
"sourceType": "module",
"throws": "Unexpected token (2:17)"
}

View File

@ -2,7 +2,6 @@
"type": "File", "type": "File",
"start":0,"end":34,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}}, "start":0,"end":34,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}},
"errors": [ "errors": [
"SyntaxError: 'static' modifier must precede 'readonly' modifier. (2:11)",
"SyntaxError: Static class blocks cannot have any modifier. (2:20)" "SyntaxError: Static class blocks cannot have any modifier. (2:20)"
], ],
"program": { "program": {
@ -28,7 +27,6 @@
"type": "StaticBlock", "type": "StaticBlock",
"start":14,"end":32,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":20}}, "start":14,"end":32,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":20}},
"readonly": true, "readonly": true,
"static": true,
"body": [] "body": []
} }
] ]

View File

@ -0,0 +1,3 @@
class Foo {
static readonly {}
}

View File

@ -0,0 +1,12 @@
{
"plugins": [
[
"classStaticBlock"
],
[
"typescript"
]
],
"sourceType": "module",
"throws": "Unexpected token (2:18)"
}

View File

@ -35,7 +35,6 @@
{ {
"type": "StaticBlock", "type": "StaticBlock",
"start":24,"end":33,"loc":{"start":{"line":3,"column":2},"end":{"line":3,"column":11}}, "start":24,"end":33,"loc":{"start":{"line":3,"column":2},"end":{"line":3,"column":11}},
"static": true,
"body": [] "body": []
} }
] ]

View File

@ -35,7 +35,6 @@
{ {
"type": "StaticBlock", "type": "StaticBlock",
"start":31,"end":40,"loc":{"start":{"line":3,"column":2},"end":{"line":3,"column":11}}, "start":31,"end":40,"loc":{"start":{"line":3,"column":2},"end":{"line":3,"column":11}},
"static": true,
"body": [] "body": []
} }
] ]

View File

@ -35,7 +35,6 @@
{ {
"type": "StaticBlock", "type": "StaticBlock",
"start":28,"end":37,"loc":{"start":{"line":3,"column":2},"end":{"line":3,"column":11}}, "start":28,"end":37,"loc":{"start":{"line":3,"column":2},"end":{"line":3,"column":11}},
"static": true,
"body": [] "body": []
} }
] ]

View File

@ -23,7 +23,6 @@
{ {
"type": "StaticBlock", "type": "StaticBlock",
"start":14,"end":23,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":11}}, "start":14,"end":23,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":11}},
"static": true,
"body": [] "body": []
} }
] ]