Skip to content

Commit ffe4942

Browse files
committed
Parse postfix [] ! ? at the same precedence level
This combines parseArrayType and parseJSDocPostfixType into parsePostfixType.
1 parent 3e3846d commit ffe4942

File tree

1 file changed

+36
-36
lines changed

1 file changed

+36
-36
lines changed

src/compiler/parser.ts

Lines changed: 36 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -2739,50 +2739,50 @@ namespace ts {
27392739
return token() === SyntaxKind.CloseParenToken || isStartOfParameter() || isStartOfType();
27402740
}
27412741

2742-
function parseJSDocPostfixTypeOrHigher(): TypeNode {
2742+
function parsePostfixTypeOrHigher(): TypeNode {
27432743
let kind: SyntaxKind | undefined;
27442744
let type = parseNonArrayType();
2745-
while (kind = getKind(token())) {
2746-
nextToken();
2747-
const postfix = createNode(kind, type.pos) as JSDocOptionalType | JSDocNonNullableType | JSDocNullableType;
2748-
postfix.type = type;
2749-
type = finishNode(postfix);
2750-
}
2751-
return type;
2752-
2753-
function getKind(tokenKind: SyntaxKind): SyntaxKind | undefined {
2754-
switch (tokenKind) {
2755-
case SyntaxKind.EqualsToken:
2756-
// only parse postfix = inside jsdoc, because it's ambiguous elsewhere
2757-
return contextFlags & NodeFlags.JSDoc ? SyntaxKind.JSDocOptionalType : undefined;
2758-
case SyntaxKind.ExclamationToken:
2759-
return SyntaxKind.JSDocNonNullableType;
2760-
case SyntaxKind.QuestionToken:
2761-
return SyntaxKind.JSDocNullableType;
2762-
}
2763-
}
2764-
}
2765-
2766-
function parseArrayTypeOrHigher(): TypeNode {
2767-
let type = parseJSDocPostfixTypeOrHigher();
2768-
while (!scanner.hasPrecedingLineBreak() && parseOptional(SyntaxKind.OpenBracketToken)) {
2769-
if (isStartOfType()) {
2770-
const node = <IndexedAccessTypeNode>createNode(SyntaxKind.IndexedAccessType, type.pos);
2771-
node.objectType = type;
2772-
node.indexType = parseType();
2773-
parseExpected(SyntaxKind.CloseBracketToken);
2774-
type = finishNode(node);
2745+
while (!scanner.hasPrecedingLineBreak() && (kind = getPostfixTypeKind(token()))) {
2746+
if (kind === SyntaxKind.ArrayType) {
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+
}
27752761
}
27762762
else {
2777-
const node = <ArrayTypeNode>createNode(SyntaxKind.ArrayType, type.pos);
2778-
node.elementType = type;
2779-
parseExpected(SyntaxKind.CloseBracketToken);
2780-
type = finishNode(node);
2763+
nextToken();
2764+
const postfix = createNode(kind, type.pos) as JSDocOptionalType | JSDocNonNullableType | JSDocNullableType;
2765+
postfix.type = type;
2766+
type = finishNode(postfix);
27812767
}
27822768
}
27832769
return type;
27842770
}
27852771

2772+
function getPostfixTypeKind(tokenKind: SyntaxKind): SyntaxKind | undefined {
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 : undefined;
2777+
case SyntaxKind.ExclamationToken:
2778+
return SyntaxKind.JSDocNonNullableType;
2779+
case SyntaxKind.QuestionToken:
2780+
return SyntaxKind.JSDocNullableType;
2781+
case SyntaxKind.OpenBracketToken:
2782+
return SyntaxKind.ArrayType;
2783+
}
2784+
}
2785+
27862786
function parseTypeOperator(operator: SyntaxKind.KeyOfKeyword) {
27872787
const node = <TypeOperatorNode>createNode(SyntaxKind.TypeOperator);
27882788
parseExpected(operator);
@@ -2796,7 +2796,7 @@ namespace ts {
27962796
case SyntaxKind.KeyOfKeyword:
27972797
return parseTypeOperator(SyntaxKind.KeyOfKeyword);
27982798
}
2799-
return parseArrayTypeOrHigher();
2799+
return parsePostfixTypeOrHigher();
28002800
}
28012801

28022802
function parseUnionOrIntersectionType(kind: SyntaxKind.UnionType | SyntaxKind.IntersectionType, parseConstituentType: () => TypeNode, operator: SyntaxKind.BarToken | SyntaxKind.AmpersandToken): TypeNode {

0 commit comments

Comments
 (0)