Skip to content

Commit d4e3e19

Browse files
authored
Merge pull request #18333 from Microsoft/fix-forEachChild-JSDocTypedefTag
Fix forEachChild jsdoc `@typedef` tag
2 parents 4ee7d3a + cab05dd commit d4e3e19

File tree

7 files changed

+44
-40
lines changed

7 files changed

+44
-40
lines changed

src/compiler/parser.ts

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -438,8 +438,10 @@ namespace ts {
438438
visitNode(cbNode, (<JSDocTypedefTag>node).typeExpression);
439439
}
440440
case SyntaxKind.JSDocTypeLiteral:
441-
for (const tag of (node as JSDocTypeLiteral).jsDocPropertyTags) {
442-
visitNode(cbNode, tag);
441+
if ((node as JSDocTypeLiteral).jsDocPropertyTags) {
442+
for (const tag of (node as JSDocTypeLiteral).jsDocPropertyTags) {
443+
visitNode(cbNode, tag);
444+
}
443445
}
444446
return;
445447
case SyntaxKind.PartiallyEmittedExpression:
@@ -6652,19 +6654,18 @@ namespace ts {
66526654
if (!typeExpression || isObjectOrObjectArrayTypeReference(typeExpression.type)) {
66536655
let child: JSDocTypeTag | JSDocPropertyTag | false;
66546656
let jsdocTypeLiteral: JSDocTypeLiteral;
6655-
let alreadyHasTypeTag = false;
6657+
let childTypeTag: JSDocTypeTag;
66566658
const start = scanner.getStartPos();
66576659
while (child = tryParse(() => parseChildParameterOrPropertyTag(PropertyLikeParse.Property))) {
66586660
if (!jsdocTypeLiteral) {
66596661
jsdocTypeLiteral = <JSDocTypeLiteral>createNode(SyntaxKind.JSDocTypeLiteral, start);
66606662
}
66616663
if (child.kind === SyntaxKind.JSDocTypeTag) {
6662-
if (alreadyHasTypeTag) {
6664+
if (childTypeTag) {
66636665
break;
66646666
}
66656667
else {
6666-
jsdocTypeLiteral.jsDocTypeTag = child;
6667-
alreadyHasTypeTag = true;
6668+
childTypeTag = child;
66686669
}
66696670
}
66706671
else {
@@ -6678,7 +6679,9 @@ namespace ts {
66786679
if (typeExpression && typeExpression.type.kind === SyntaxKind.ArrayType) {
66796680
jsdocTypeLiteral.isArrayType = true;
66806681
}
6681-
typedefTag.typeExpression = finishNode(jsdocTypeLiteral);
6682+
typedefTag.typeExpression = childTypeTag && !isObjectOrObjectArrayTypeReference(childTypeTag.typeExpression.type) ?
6683+
childTypeTag.typeExpression :
6684+
finishNode(jsdocTypeLiteral);
66826685
}
66836686
}
66846687

src/compiler/types.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2211,7 +2211,6 @@ namespace ts {
22112211
export interface JSDocTypeLiteral extends JSDocType {
22122212
kind: SyntaxKind.JSDocTypeLiteral;
22132213
jsDocPropertyTags?: ReadonlyArray<JSDocPropertyLikeTag>;
2214-
jsDocTypeTag?: JSDocTypeTag;
22152214
/** If true, then this type literal represents an *array* of its type. */
22162215
isArrayType?: boolean;
22172216
}

tests/baselines/reference/JSDocParsing/DocComments.parsesCorrectly.typedefTagWithChildrenTags.json

Lines changed: 0 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -34,38 +34,6 @@
3434
"kind": "JSDocTypeLiteral",
3535
"pos": 26,
3636
"end": 98,
37-
"jsDocTypeTag": {
38-
"kind": "JSDocTypeTag",
39-
"pos": 28,
40-
"end": 42,
41-
"atToken": {
42-
"kind": "AtToken",
43-
"pos": 28,
44-
"end": 29
45-
},
46-
"tagName": {
47-
"kind": "Identifier",
48-
"pos": 29,
49-
"end": 33,
50-
"escapedText": "type"
51-
},
52-
"typeExpression": {
53-
"kind": "JSDocTypeExpression",
54-
"pos": 34,
55-
"end": 42,
56-
"type": {
57-
"kind": "TypeReference",
58-
"pos": 35,
59-
"end": 41,
60-
"typeName": {
61-
"kind": "Identifier",
62-
"pos": 35,
63-
"end": 41,
64-
"escapedText": "Object"
65-
}
66-
}
67-
}
68-
},
6937
"jsDocPropertyTags": [
7038
{
7139
"kind": "JSDocPropertyTag",
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
//// [jsdocTwoLineTypedef.ts]
2+
// Regression from #18301
3+
/**
4+
* @typedef LoadCallback
5+
* @type {function}
6+
*/
7+
type LoadCallback = void;
8+
9+
10+
//// [jsdocTwoLineTypedef.js]
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
=== tests/cases/conformance/jsdoc/jsdocTwoLineTypedef.ts ===
2+
// Regression from #18301
3+
/**
4+
* @typedef LoadCallback
5+
* @type {function}
6+
*/
7+
type LoadCallback = void;
8+
>LoadCallback : Symbol(LoadCallback, Decl(jsdocTwoLineTypedef.ts, 0, 0))
9+
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
=== tests/cases/conformance/jsdoc/jsdocTwoLineTypedef.ts ===
2+
// Regression from #18301
3+
/**
4+
* @typedef LoadCallback
5+
* @type {function}
6+
*/
7+
type LoadCallback = void;
8+
>LoadCallback : void
9+
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
// Regression from #18301
2+
/**
3+
* @typedef LoadCallback
4+
* @type {function}
5+
*/
6+
type LoadCallback = void;

0 commit comments

Comments
 (0)