Skip to content

Commit

Permalink
Address review
Browse files Browse the repository at this point in the history
  • Loading branch information
sosukesuzuki committed Aug 18, 2021
1 parent 019561b commit d743bc8
Show file tree
Hide file tree
Showing 11 changed files with 36 additions and 22 deletions.
42 changes: 32 additions & 10 deletions packages/babel-parser/src/plugins/typescript/index.js
Expand Up @@ -230,17 +230,22 @@ export default (superClass: Class<Parser>): Class<Parser> =>
}

/** 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)) {
return undefined;
}

const modifier = this.state.value;
if (
allowedModifiers.indexOf(modifier) !== -1 &&
this.tsTryParse(this.tsNextTokenCanFollowModifier.bind(this))
) {
return modifier;
if (allowedModifiers.indexOf(modifier) !== -1) {
if (stopOnStartOfClassStaticBlock && this.tsIsStartOfStaticBlocks()) {
return undefined;
}
if (this.tsTryParse(this.tsNextTokenCanFollowModifier.bind(this))) {
return modifier;
}
}
return undefined;
}
Expand All @@ -258,6 +263,7 @@ export default (superClass: Class<Parser>): Class<Parser> =>
allowedModifiers: TsModifier[],
disallowedModifiers?: TsModifier[],
errorTemplate?: ErrorTemplate,
stopOnStartOfClassStaticBlock?: boolean,
): void {
const enforceOrder = (pos, modifier, before, after) => {
if (modifier === before && modified[after]) {
Expand All @@ -277,6 +283,7 @@ export default (superClass: Class<Parser>): Class<Parser> =>
const startPos = this.state.start;
const modifier: ?TsModifier = this.tsParseModifier(
allowedModifiers.concat(disallowedModifiers ?? []),
stopOnStartOfClassStaticBlock,
);

if (!modifier) break;
Expand Down Expand Up @@ -2374,6 +2381,13 @@ export default (superClass: Class<Parser>): Class<Parser> =>
});
}

tsIsStartOfStaticBlocks() {
return (
this.isContextual("static") &&
this.lookaheadCharCode() === charCodes.leftCurlyBrace
);
}

parseClassMember(
classBody: N.ClassBody,
member: any,
Expand All @@ -2391,18 +2405,26 @@ export default (superClass: Class<Parser>): Class<Parser> =>
this.tsParseModifiers(
member,
invalidModifersForStaticBlocks.concat(["static"]),
/* disallowedModifiers */ undefined,
/* errorTemplate */ undefined,
/* stopOnStartOfClassStaticBlock */ true,
);

const callParseClassMemberWithIsStatic = () => {
const isStatic = !!member.static;
if (isStatic && this.eat(tt.braceL)) {
delete member.static;
if (this.tsIsStartOfStaticBlocks()) {
this.next(); // eat "static"
this.next(); // eat "{"
if (this.tsHasSomeModifiers(member, invalidModifersForStaticBlocks)) {
this.raise(this.state.pos, TSErrors.StaticBlockCannotHaveModifier);
}
this.parseClassStaticBlock(classBody, ((member: any): N.StaticBlock));
} else {
this.parseClassMemberWithIsStatic(classBody, member, state, isStatic);
this.parseClassMemberWithIsStatic(
classBody,
member,
state,
!!member.static,
);
}
};
if (member.declare) {
Expand Down
@@ -1,3 +1,3 @@
class Foo {
static private {}
private static {}
}
Expand Up @@ -2,7 +2,6 @@
"type": "File",
"start":0,"end":33,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}},
"errors": [
"SyntaxError: 'private' modifier must precede 'static' modifier. (2:9)",
"SyntaxError: Static class blocks cannot have any modifier. (2:19)"
],
"program": {
Expand Down
@@ -1,3 +1,3 @@
class Foo {
static protected {}
protected static {}
}
Expand Up @@ -2,7 +2,6 @@
"type": "File",
"start":0,"end":35,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}},
"errors": [
"SyntaxError: 'protected' modifier must precede 'static' modifier. (2:9)",
"SyntaxError: Static class blocks cannot have any modifier. (2:21)"
],
"program": {
Expand Down
@@ -1,3 +1,3 @@
class Foo {
static public {}
public static {}
}
Expand Up @@ -2,7 +2,6 @@
"type": "File",
"start":0,"end":32,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}},
"errors": [
"SyntaxError: 'public' modifier must precede 'static' modifier. (2:9)",
"SyntaxError: Static class blocks cannot have any modifier. (2:18)"
],
"program": {
Expand Down
Expand Up @@ -2,7 +2,6 @@
"type": "File",
"start":0,"end":34,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}},
"errors": [
"SyntaxError: 'static' modifier cannot be used with 'abstract' modifier. (2:11)",
"SyntaxError: Static class blocks cannot have any modifier. (2:20)"
],
"program": {
Expand Down
Expand Up @@ -2,7 +2,6 @@
"type": "File",
"start":0,"end":34,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}},
"errors": [
"SyntaxError: 'static' modifier must precede 'override' modifier. (2:11)",
"SyntaxError: Static class blocks cannot have any modifier. (2:20)"
],
"program": {
Expand Down
@@ -1,9 +1,6 @@
{
"type": "File",
"start":0,"end":32,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}},
"errors": [
"SyntaxError: Duplicate modifier: 'static'. (2:9)"
],
"program": {
"type": "Program",
"start":0,"end":32,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}},
Expand All @@ -26,6 +23,7 @@
{
"type": "StaticBlock",
"start":14,"end":30,"loc":{"start":{"line":2,"column":2},"end":{"line":2,"column":18}},
"static": true,
"body": []
}
]
Expand Down
Expand Up @@ -2,7 +2,6 @@
"type": "File",
"start":0,"end":34,"loc":{"start":{"line":1,"column":0},"end":{"line":3,"column":1}},
"errors": [
"SyntaxError: 'static' modifier must precede 'readonly' modifier. (2:11)",
"SyntaxError: Static class blocks cannot have any modifier. (2:20)"
],
"program": {
Expand Down

0 comments on commit d743bc8

Please sign in to comment.