Skip to content

Commit c81a941

Browse files
committed
Refactor parsePostfixTypeOrHigher
Inline the switch, but extract the function that creates jsdoc nodes.
1 parent 68ea884 commit c81a941

File tree

1 file changed

+38
-37
lines changed

1 file changed

+38
-37
lines changed

src/compiler/parser.ts

Lines changed: 38 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -2740,49 +2740,50 @@ namespace ts {
27402740
}
27412741

27422742
function parsePostfixTypeOrHigher(): TypeNode {
2743-
let kind: SyntaxKind | undefined;
27442743
let type = parseNonArrayType();
2745-
while (!scanner.hasPrecedingLineBreak() && (kind = getPostfixSyntaxKind(token()))) {
2746-
if (kind === SyntaxKind.OpenBracketToken) {
2747-
parseExpected(SyntaxKind.OpenBracketToken);
2748-
if (isStartOfType()) {
2749-
const node = createNode(SyntaxKind.IndexedAccessType, type.pos) as IndexedAccessTypeNode;
2750-
node.objectType = type;
2751-
node.indexType = parseType();
2752-
parseExpected(SyntaxKind.CloseBracketToken);
2753-
type = finishNode(node);
2754-
}
2755-
else {
2756-
const node = createNode(SyntaxKind.ArrayType, type.pos) as ArrayTypeNode;
2757-
node.elementType = type;
2758-
parseExpected(SyntaxKind.CloseBracketToken);
2759-
type = finishNode(node);
2760-
}
2761-
}
2762-
else {
2763-
nextToken();
2764-
const postfix = createNode(kind, type.pos) as JSDocOptionalType | JSDocNonNullableType | JSDocNullableType;
2765-
postfix.type = type;
2766-
type = finishNode(postfix);
2744+
while (!scanner.hasPrecedingLineBreak()) {
2745+
switch (token()) {
2746+
case SyntaxKind.EqualsToken:
2747+
// only parse postfix = inside jsdoc, because it's ambiguous elsewhere
2748+
if (!(contextFlags & NodeFlags.JSDoc)) {
2749+
return type;
2750+
}
2751+
type = createJSDocPostfixType(SyntaxKind.JSDocOptionalType, type);
2752+
break;
2753+
case SyntaxKind.ExclamationToken:
2754+
type = createJSDocPostfixType(SyntaxKind.JSDocNonNullableType, type);
2755+
break;
2756+
case SyntaxKind.QuestionToken:
2757+
type = createJSDocPostfixType(SyntaxKind.JSDocNullableType, type);
2758+
break;
2759+
case SyntaxKind.OpenBracketToken:
2760+
parseExpected(SyntaxKind.OpenBracketToken);
2761+
if (isStartOfType()) {
2762+
const node = createNode(SyntaxKind.IndexedAccessType, type.pos) as IndexedAccessTypeNode;
2763+
node.objectType = type;
2764+
node.indexType = parseType();
2765+
parseExpected(SyntaxKind.CloseBracketToken);
2766+
type = finishNode(node);
2767+
}
2768+
else {
2769+
const node = createNode(SyntaxKind.ArrayType, type.pos) as ArrayTypeNode;
2770+
node.elementType = type;
2771+
parseExpected(SyntaxKind.CloseBracketToken);
2772+
type = finishNode(node);
2773+
}
2774+
break;
2775+
default:
2776+
return type;
27672777
}
27682778
}
27692779
return type;
27702780
}
27712781

2772-
function getPostfixSyntaxKind(tokenKind: SyntaxKind): SyntaxKind {
2773-
switch (tokenKind) {
2774-
case SyntaxKind.EqualsToken:
2775-
// only parse postfix = inside jsdoc, because it's ambiguous elsewhere
2776-
return contextFlags & NodeFlags.JSDoc ? SyntaxKind.JSDocOptionalType : 0;
2777-
case SyntaxKind.ExclamationToken:
2778-
return SyntaxKind.JSDocNonNullableType;
2779-
case SyntaxKind.QuestionToken:
2780-
return SyntaxKind.JSDocNullableType;
2781-
case SyntaxKind.OpenBracketToken:
2782-
return SyntaxKind.OpenBracketToken;
2783-
default:
2784-
return 0;
2785-
}
2782+
function createJSDocPostfixType(kind: SyntaxKind, type: TypeNode) {
2783+
nextToken();
2784+
const postfix = createNode(kind, type.pos) as JSDocOptionalType | JSDocNonNullableType | JSDocNullableType;
2785+
postfix.type = type;
2786+
return finishNode(postfix);
27862787
}
27872788

27882789
function parseTypeOperator(operator: SyntaxKind.KeyOfKeyword) {

0 commit comments

Comments
 (0)