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:
parent
1d4bd31950
commit
b141c85b17
@ -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) {
|
||||||
|
|||||||
@ -0,0 +1,3 @@
|
|||||||
|
class Foo {
|
||||||
|
private static {}
|
||||||
|
}
|
||||||
@ -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": []
|
||||||
}
|
}
|
||||||
@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"plugins": [
|
||||||
|
[
|
||||||
|
"classStaticBlock"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"typescript"
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"sourceType": "module",
|
||||||
|
"throws": "Unexpected token (2:17)"
|
||||||
|
}
|
||||||
@ -0,0 +1,3 @@
|
|||||||
|
class Foo {
|
||||||
|
protected static {}
|
||||||
|
}
|
||||||
@ -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": []
|
||||||
}
|
}
|
||||||
@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"plugins": [
|
||||||
|
[
|
||||||
|
"classStaticBlock"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"typescript"
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"sourceType": "module",
|
||||||
|
"throws": "Unexpected token (2:19)"
|
||||||
|
}
|
||||||
@ -0,0 +1,3 @@
|
|||||||
|
class Foo {
|
||||||
|
public static {}
|
||||||
|
}
|
||||||
@ -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": []
|
||||||
}
|
}
|
||||||
@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"plugins": [
|
||||||
|
[
|
||||||
|
"classStaticBlock"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"typescript"
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"sourceType": "module",
|
||||||
|
"throws": "Unexpected token (2:16)"
|
||||||
|
}
|
||||||
@ -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": []
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@ -0,0 +1,3 @@
|
|||||||
|
class Foo {
|
||||||
|
static abstract {}
|
||||||
|
}
|
||||||
@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"plugins": [
|
||||||
|
[
|
||||||
|
"classStaticBlock"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"typescript"
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"sourceType": "module",
|
||||||
|
"throws": "Unexpected token (2:18)"
|
||||||
|
}
|
||||||
@ -0,0 +1,3 @@
|
|||||||
|
class Foo {
|
||||||
|
abstract static {}
|
||||||
|
}
|
||||||
@ -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": []
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -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": []
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@ -0,0 +1,3 @@
|
|||||||
|
class Foo {
|
||||||
|
static override {}
|
||||||
|
}
|
||||||
@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"plugins": [
|
||||||
|
[
|
||||||
|
"classStaticBlock"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"typescript"
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"sourceType": "module",
|
||||||
|
"throws": "Unexpected token (2:18)"
|
||||||
|
}
|
||||||
@ -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",
|
||||||
|
|||||||
@ -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": []
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@ -0,0 +1,3 @@
|
|||||||
|
class Foo {
|
||||||
|
static declare {}
|
||||||
|
}
|
||||||
@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"plugins": [
|
||||||
|
[
|
||||||
|
"classStaticBlock"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"typescript"
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"sourceType": "module",
|
||||||
|
"throws": "Unexpected token (2:17)"
|
||||||
|
}
|
||||||
@ -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": []
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@ -0,0 +1,3 @@
|
|||||||
|
class Foo {
|
||||||
|
static readonly {}
|
||||||
|
}
|
||||||
@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"plugins": [
|
||||||
|
[
|
||||||
|
"classStaticBlock"
|
||||||
|
],
|
||||||
|
[
|
||||||
|
"typescript"
|
||||||
|
]
|
||||||
|
],
|
||||||
|
"sourceType": "module",
|
||||||
|
"throws": "Unexpected token (2:18)"
|
||||||
|
}
|
||||||
@ -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": []
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@ -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": []
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@ -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": []
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@ -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": []
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user