Skip to content

Commit bdc3f1f

Browse files
committed
Address more PR comments
1 parent b2e892f commit bdc3f1f

6 files changed

Lines changed: 117 additions & 44 deletions

File tree

src/compiler/parser.ts

Lines changed: 25 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1922,7 +1922,6 @@ namespace ts {
19221922
return createMissingList<T>();
19231923
}
19241924

1925-
// The allowReservedWords parameter controls whether reserved words are permitted after the first dot
19261925
function parseEntityName(allowReservedWords: boolean, diagnosticMessage?: DiagnosticMessage): EntityName {
19271926
let entity: EntityName = allowReservedWords ? parseIdentifierName() : parseIdentifier(diagnosticMessage);
19281927
let dotPos = scanner.getStartPos();
@@ -1932,6 +1931,7 @@ namespace ts {
19321931
entity.jsdocDotPos = dotPos;
19331932
break;
19341933
}
1934+
dotPos = scanner.getStartPos();
19351935
const node: QualifiedName = <QualifiedName>createNode(SyntaxKind.QualifiedName, entity.pos);
19361936
node.left = entity;
19371937
node.right = parseRightSideOfDot(allowReservedWords);
@@ -2140,7 +2140,7 @@ namespace ts {
21402140
return finishNode(parameter);
21412141
}
21422142

2143-
function parseJSDocNodeWithType(kind: SyntaxKind): TypeNode {
2143+
function parseJSDocNodeWithType(kind: SyntaxKind.JSDocVariadicType | SyntaxKind.JSDocNonNullableType): TypeNode {
21442144
const result = createNode(kind) as JSDocVariadicType | JSDocNonNullableType;
21452145
nextToken();
21462146
result.type = parseType();
@@ -2689,27 +2689,30 @@ namespace ts {
26892689
}
26902690

26912691
function parseJSDocPostfixTypeOrHigher(): TypeNode {
2692-
let type = parseArrayTypeOrHigher();
2693-
let postfix: JSDocOptionalType | JSDocNonNullableType | JSDocNullableType;
2694-
// only parse postfix = inside jsdoc, because it's ambiguous elsewhere
2695-
if (contextFlags & NodeFlags.JSDoc && parseOptional(SyntaxKind.EqualsToken)) {
2696-
postfix = createNode(SyntaxKind.JSDocOptionalType, type.pos) as JSDocOptionalType;
2697-
}
2698-
else if (parseOptional(SyntaxKind.ExclamationToken)) {
2699-
postfix = createNode(SyntaxKind.JSDocNonNullableType, type.pos) as JSDocNonNullableType;
2700-
}
2701-
else if (parseOptional(SyntaxKind.QuestionToken)) {
2702-
postfix = createNode(SyntaxKind.JSDocNullableType, type.pos) as JSDocNullableType;
2703-
}
2704-
if (postfix) {
2705-
postfix.type = type;
2706-
type = finishNode(postfix);
2692+
const type = parseNonArrayType();
2693+
const kind = getKind(token());
2694+
if (!kind) return type;
2695+
nextToken();
2696+
2697+
const postfix = createNode(kind, type.pos) as JSDocOptionalType | JSDocNonNullableType | JSDocNullableType;
2698+
postfix.type = type;
2699+
return finishNode(postfix);
2700+
2701+
function getKind(tokenKind: SyntaxKind): SyntaxKind | undefined {
2702+
switch (tokenKind) {
2703+
case SyntaxKind.EqualsToken:
2704+
// only parse postfix = inside jsdoc, because it's ambiguous elsewhere
2705+
return contextFlags & NodeFlags.JSDoc ? SyntaxKind.JSDocOptionalType : undefined;
2706+
case SyntaxKind.ExclamationToken:
2707+
return SyntaxKind.JSDocNonNullableType;
2708+
case SyntaxKind.QuestionToken:
2709+
return SyntaxKind.JSDocNullableType;
2710+
}
27072711
}
2708-
return type;
27092712
}
27102713

27112714
function parseArrayTypeOrHigher(): TypeNode {
2712-
let type = parseNonArrayType();
2715+
let type = parseJSDocPostfixTypeOrHigher();
27132716
while (!scanner.hasPrecedingLineBreak() && parseOptional(SyntaxKind.OpenBracketToken)) {
27142717
if (isStartOfType()) {
27152718
const node = <IndexedAccessTypeNode>createNode(SyntaxKind.IndexedAccessType, type.pos);
@@ -2741,7 +2744,7 @@ namespace ts {
27412744
case SyntaxKind.KeyOfKeyword:
27422745
return parseTypeOperator(SyntaxKind.KeyOfKeyword);
27432746
}
2744-
return parseJSDocPostfixTypeOrHigher();
2747+
return parseArrayTypeOrHigher();
27452748
}
27462749

27472750
function parseUnionOrIntersectionType(kind: SyntaxKind.UnionType | SyntaxKind.IntersectionType, parseConstituentType: () => TypeNode, operator: SyntaxKind.BarToken | SyntaxKind.AmpersandToken): TypeNode {
@@ -6576,15 +6579,8 @@ namespace ts {
65766579
return finishNode(typedefTag);
65776580

65786581
function isObjectTypeReference(node: TypeNode) {
6579-
if (node.kind === SyntaxKind.ObjectKeyword) {
6580-
return true;
6581-
}
6582-
if (node.kind === SyntaxKind.TypeReference) {
6583-
const jsDocTypeReference = <TypeReferenceNode>node;
6584-
if (jsDocTypeReference.typeName.kind === SyntaxKind.Identifier) {
6585-
return (jsDocTypeReference.typeName as Identifier).text === "Object";
6586-
}
6587-
}
6582+
return node.kind === SyntaxKind.ObjectKeyword ||
6583+
isTypeReferenceNode(node) && ts.isIdentifier(node.typeName) && node.typeName.text === "Object";
65886584
}
65896585

65906586
function scanChildTags(): JSDocTypeLiteral {

src/harness/unittests/jsDocParsing.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ namespace ts {
5454
parsesCorrectly("typeReference3", "{a.function}");
5555
parsesCorrectly("arrayType1", "{a[]}");
5656
parsesCorrectly("arrayType2", "{a[][]}");
57-
parsesCorrectly("arrayType3", "{a[][]=}");
57+
parsesCorrectly("arrayType3", "{(a[][])=}");
5858
parsesCorrectly("keyword1", "{var}");
5959
parsesCorrectly("keyword2", "{null}");
6060
parsesCorrectly("keyword3", "{undefined}");

tests/baselines/reference/JSDocParsing/TypeExpressions.parsesCorrectly.arrayType3.json

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,35 @@
11
{
22
"kind": "JSDocOptionalType",
33
"pos": 1,
4-
"end": 7,
4+
"end": 9,
55
"flags": "JSDoc",
66
"type": {
7-
"kind": "ArrayType",
7+
"kind": "ParenthesizedType",
88
"pos": 1,
9-
"end": 6,
9+
"end": 8,
1010
"flags": "JSDoc",
11-
"elementType": {
11+
"type": {
1212
"kind": "ArrayType",
13-
"pos": 1,
14-
"end": 4,
13+
"pos": 2,
14+
"end": 7,
1515
"flags": "JSDoc",
1616
"elementType": {
17-
"kind": "TypeReference",
18-
"pos": 1,
19-
"end": 2,
17+
"kind": "ArrayType",
18+
"pos": 2,
19+
"end": 5,
2020
"flags": "JSDoc",
21-
"typeName": {
22-
"kind": "Identifier",
23-
"pos": 1,
24-
"end": 2,
21+
"elementType": {
22+
"kind": "TypeReference",
23+
"pos": 2,
24+
"end": 3,
2525
"flags": "JSDoc",
26-
"text": "a"
26+
"typeName": {
27+
"kind": "Identifier",
28+
"pos": 2,
29+
"end": 3,
30+
"flags": "JSDoc",
31+
"text": "a"
32+
}
2733
}
2834
}
2935
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
=== tests/cases/conformance/jsdoc/prefixPostfix.js ===
2+
/**
3+
* @param {number![]} x - number[]
4+
* @param {!number[]} y - number[]
5+
* @param {(number[])!} z - number[]
6+
* @param {number?[]} a - (number | null)[]
7+
* @param {?number[]} b - number[] | null
8+
* @param {(number[])?} c - number[] | null
9+
* @param {?...number} d - number[] | null
10+
* @param {...?number} e - (number | null)[]
11+
* @param {...number?} f - (number | null)[]
12+
*/
13+
function f(x, y, z, a, b, c, d, e, f) {
14+
>f : Symbol(f, Decl(prefixPostfix.js, 0, 0))
15+
>x : Symbol(x, Decl(prefixPostfix.js, 11, 11))
16+
>y : Symbol(y, Decl(prefixPostfix.js, 11, 13))
17+
>z : Symbol(z, Decl(prefixPostfix.js, 11, 16))
18+
>a : Symbol(a, Decl(prefixPostfix.js, 11, 19))
19+
>b : Symbol(b, Decl(prefixPostfix.js, 11, 22))
20+
>c : Symbol(c, Decl(prefixPostfix.js, 11, 25))
21+
>d : Symbol(d, Decl(prefixPostfix.js, 11, 28))
22+
>e : Symbol(e, Decl(prefixPostfix.js, 11, 31))
23+
>f : Symbol(f, Decl(prefixPostfix.js, 11, 34))
24+
}
25+
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
=== tests/cases/conformance/jsdoc/prefixPostfix.js ===
2+
/**
3+
* @param {number![]} x - number[]
4+
* @param {!number[]} y - number[]
5+
* @param {(number[])!} z - number[]
6+
* @param {number?[]} a - (number | null)[]
7+
* @param {?number[]} b - number[] | null
8+
* @param {(number[])?} c - number[] | null
9+
* @param {?...number} d - number[] | null
10+
* @param {...?number} e - (number | null)[]
11+
* @param {...number?} f - (number | null)[]
12+
*/
13+
function f(x, y, z, a, b, c, d, e, f) {
14+
>f : (x: number[], y: number[], z: number[], a: (number | null)[], b: number[] | null, c: number[] | null, d: number[] | null, ...e: (number | null)[], ...f: (number | null)[]) => void
15+
>x : number[]
16+
>y : number[]
17+
>z : number[]
18+
>a : (number | null)[]
19+
>b : number[] | null
20+
>c : number[] | null
21+
>d : number[] | null
22+
>e : (number | null)[]
23+
>f : (number | null)[]
24+
}
25+
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
// @allowJs: true
2+
// @checkJs: true
3+
// @noEmit: true
4+
// @strictNullChecks: true
5+
// @noImplicitAny: true
6+
7+
// @Filename: prefixPostfix.js
8+
9+
/**
10+
* @param {number![]} x - number[]
11+
* @param {!number[]} y - number[]
12+
* @param {(number[])!} z - number[]
13+
* @param {number?[]} a - (number | null)[]
14+
* @param {?number[]} b - number[] | null
15+
* @param {(number[])?} c - number[] | null
16+
* @param {?...number} d - number[] | null
17+
* @param {...?number} e - (number | null)[]
18+
* @param {...number?} f - (number | null)[]
19+
*/
20+
function f(x, y, z, a, b, c, d, e, f) {
21+
}

0 commit comments

Comments
 (0)