Skip to content

Commit 71b3901

Browse files
author
Andy
authored
Fix bug: Include comment for @param tag with nested tag (#23276)
* Fix bug: Include comment for @param tag with nested tag * Add another comment to test
1 parent 542184a commit 71b3901

11 files changed

+121
-19
lines changed

src/compiler/parser.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6361,8 +6361,8 @@ namespace ts {
63616361
case "arg":
63626362
case "argument":
63636363
case "param":
6364-
tag = parseParameterOrPropertyTag(atToken, tagName, PropertyLikeParse.Parameter);
6365-
break;
6364+
addTag(parseParameterOrPropertyTag(atToken, tagName, PropertyLikeParse.Parameter, indent));
6365+
return;
63666366
case "return":
63676367
case "returns":
63686368
tag = parseReturnTag(atToken, tagName);
@@ -6511,7 +6511,7 @@ namespace ts {
65116511
}
65126512
}
65136513

6514-
function parseParameterOrPropertyTag(atToken: AtToken, tagName: Identifier, target: PropertyLikeParse): JSDocParameterTag | JSDocPropertyTag {
6514+
function parseParameterOrPropertyTag(atToken: AtToken, tagName: Identifier, target: PropertyLikeParse, indent: number | undefined): JSDocParameterTag | JSDocPropertyTag {
65156515
let typeExpression = tryParseTypeExpression();
65166516
let isNameFirst = !typeExpression;
65176517
skipWhitespace();
@@ -6526,6 +6526,8 @@ namespace ts {
65266526
const result = target === PropertyLikeParse.Parameter ?
65276527
<JSDocParameterTag>createNode(SyntaxKind.JSDocParameterTag, atToken.pos) :
65286528
<JSDocPropertyTag>createNode(SyntaxKind.JSDocPropertyTag, atToken.pos);
6529+
let comment: string | undefined;
6530+
if (indent !== undefined) comment = parseTagComments(indent + scanner.getStartPos() - atToken.pos);
65296531
const nestedTypeLiteral = parseNestedTypeLiteral(typeExpression, name, target);
65306532
if (nestedTypeLiteral) {
65316533
typeExpression = nestedTypeLiteral;
@@ -6537,6 +6539,7 @@ namespace ts {
65376539
result.name = name;
65386540
result.isNameFirst = isNameFirst;
65396541
result.isBracketed = isBracketed;
6542+
result.comment = comment;
65406543
return finishNode(result);
65416544
}
65426545

@@ -6783,7 +6786,7 @@ namespace ts {
67836786
if (target !== t) {
67846787
return false;
67856788
}
6786-
const tag = parseParameterOrPropertyTag(atToken, tagName, target);
6789+
const tag = parseParameterOrPropertyTag(atToken, tagName, target, /*indent*/ undefined);
67876790
tag.comment = parseTagComments(tag.end - tag.pos);
67886791
return tag;
67896792
}

src/harness/unittests/jsDocParsing.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -305,6 +305,12 @@ namespace ts {
305305
* @param x hi
306306
< > still part of the previous comment
307307
*/`);
308+
309+
parsesCorrectly("Nested @param tags",
310+
`/**
311+
* @param {object} o Doc doc
312+
* @param {string} o.f Doc for f
313+
*/`);
308314
});
309315
});
310316
describe("getFirstToken", () => {
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
{
2+
"kind": "JSDocComment",
3+
"pos": 0,
4+
"end": 66,
5+
"tags": {
6+
"0": {
7+
"kind": "JSDocParameterTag",
8+
"pos": 6,
9+
"end": 63,
10+
"atToken": {
11+
"kind": "AtToken",
12+
"pos": 6,
13+
"end": 7
14+
},
15+
"tagName": {
16+
"kind": "Identifier",
17+
"pos": 7,
18+
"end": 12,
19+
"escapedText": "param"
20+
},
21+
"typeExpression": {
22+
"kind": "JSDocTypeExpression",
23+
"pos": 34,
24+
"end": 63,
25+
"type": {
26+
"kind": "JSDocTypeLiteral",
27+
"pos": 34,
28+
"end": 63,
29+
"jsDocPropertyTags": [
30+
{
31+
"kind": "JSDocParameterTag",
32+
"pos": 34,
33+
"end": 54,
34+
"atToken": {
35+
"kind": "AtToken",
36+
"pos": 34,
37+
"end": 35
38+
},
39+
"tagName": {
40+
"kind": "Identifier",
41+
"pos": 35,
42+
"end": 40,
43+
"escapedText": "param"
44+
},
45+
"typeExpression": {
46+
"kind": "JSDocTypeExpression",
47+
"pos": 41,
48+
"end": 49,
49+
"type": {
50+
"kind": "StringKeyword",
51+
"pos": 42,
52+
"end": 48
53+
}
54+
},
55+
"name": {
56+
"kind": "FirstNode",
57+
"pos": 50,
58+
"end": 53,
59+
"left": {
60+
"kind": "Identifier",
61+
"pos": 50,
62+
"end": 51,
63+
"escapedText": "o"
64+
},
65+
"right": {
66+
"kind": "Identifier",
67+
"pos": 52,
68+
"end": 53,
69+
"escapedText": "f"
70+
}
71+
},
72+
"isNameFirst": false,
73+
"isBracketed": false,
74+
"comment": "Doc for f"
75+
}
76+
]
77+
}
78+
},
79+
"name": {
80+
"kind": "Identifier",
81+
"pos": 22,
82+
"end": 23,
83+
"escapedText": "o"
84+
},
85+
"isNameFirst": true,
86+
"isBracketed": false,
87+
"comment": "Doc doc"
88+
},
89+
"length": 1,
90+
"pos": 6,
91+
"end": 63
92+
}
93+
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
"0": {
77
"kind": "JSDocParameterTag",
88
"pos": 8,
9-
"end": 28,
9+
"end": 40,
1010
"atToken": {
1111
"kind": "AtToken",
1212
"pos": 8,
@@ -40,6 +40,6 @@
4040
},
4141
"length": 1,
4242
"pos": 8,
43-
"end": 28
43+
"end": 40
4444
}
4545
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
"0": {
77
"kind": "JSDocParameterTag",
88
"pos": 8,
9-
"end": 33,
9+
"end": 45,
1010
"atToken": {
1111
"kind": "AtToken",
1212
"pos": 8,
@@ -40,6 +40,6 @@
4040
},
4141
"length": 1,
4242
"pos": 8,
43-
"end": 33
43+
"end": 45
4444
}
4545
}

tests/baselines/reference/JSDocParsing/DocComments.parsesCorrectly.less-than and greater-than characters.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
"0": {
77
"kind": "JSDocParameterTag",
88
"pos": 7,
9-
"end": 16,
9+
"end": 58,
1010
"atToken": {
1111
"kind": "AtToken",
1212
"pos": 7,
@@ -30,6 +30,6 @@
3030
},
3131
"length": 1,
3232
"pos": 7,
33-
"end": 16
33+
"end": 58
3434
}
3535
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
"0": {
77
"kind": "JSDocParameterTag",
88
"pos": 8,
9-
"end": 30,
9+
"end": 55,
1010
"atToken": {
1111
"kind": "AtToken",
1212
"pos": 8,
@@ -40,6 +40,6 @@
4040
},
4141
"length": 1,
4242
"pos": 8,
43-
"end": 30
43+
"end": 55
4444
}
4545
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
"0": {
77
"kind": "JSDocParameterTag",
88
"pos": 8,
9-
"end": 31,
9+
"end": 57,
1010
"atToken": {
1111
"kind": "AtToken",
1212
"pos": 8,
@@ -40,6 +40,6 @@
4040
},
4141
"length": 1,
4242
"pos": 8,
43-
"end": 31
43+
"end": 57
4444
}
4545
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
"0": {
77
"kind": "JSDocParameterTag",
88
"pos": 8,
9-
"end": 36,
9+
"end": 62,
1010
"atToken": {
1111
"kind": "AtToken",
1212
"pos": 8,
@@ -40,6 +40,6 @@
4040
},
4141
"length": 1,
4242
"pos": 8,
43-
"end": 36
43+
"end": 62
4444
}
4545
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
"0": {
77
"kind": "JSDocParameterTag",
88
"pos": 8,
9-
"end": 29,
9+
"end": 42,
1010
"atToken": {
1111
"kind": "AtToken",
1212
"pos": 8,
@@ -40,6 +40,6 @@
4040
},
4141
"length": 1,
4242
"pos": 8,
43-
"end": 29
43+
"end": 42
4444
}
4545
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
"0": {
77
"kind": "JSDocParameterTag",
88
"pos": 8,
9-
"end": 32,
9+
"end": 34,
1010
"atToken": {
1111
"kind": "AtToken",
1212
"pos": 8,

0 commit comments

Comments
 (0)