Skip to content

Commit 00279e9

Browse files
committed
Parse unexpected comments after email in author JSDoc tag (microsoft#17244)
1 parent ea9d519 commit 00279e9

File tree

3 files changed

+47
-22
lines changed

3 files changed

+47
-22
lines changed

src/compiler/parser.ts

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -468,6 +468,8 @@ namespace ts {
468468
visitNode(cbNode, (<JSDocPropertyLikeTag>node).typeExpression)
469469
: visitNode(cbNode, (<JSDocPropertyLikeTag>node).typeExpression) ||
470470
visitNode(cbNode, (<JSDocPropertyLikeTag>node).name));
471+
case SyntaxKind.JSDocAuthorTag:
472+
return visitNode(cbNode, (node as JSDocTag).tagName);
471473
case SyntaxKind.JSDocAugmentsTag:
472474
return visitNode(cbNode, (node as JSDocTag).tagName) ||
473475
visitNode(cbNode, (<JSDocAugmentsTag>node).class);
@@ -6612,7 +6614,7 @@ namespace ts {
66126614
let tag: JSDocTag | undefined;
66136615
switch (tagName.escapedText) {
66146616
case "author":
6615-
tag = parseAuthorTag(start, tagName);
6617+
tag = parseAuthorTag(start, tagName, indent);
66166618
break;
66176619
case "augments":
66186620
case "extends":
@@ -6877,14 +6879,22 @@ namespace ts {
68776879
return finishNode(result);
68786880
}
68796881

6880-
function parseAuthorTag(start: number, tagName: Identifier): JSDocAuthorTag {
6882+
function parseAuthorTag(start: number, tagName: Identifier, indent: number): JSDocAuthorTag {
68816883
const result = <JSDocAuthorTag>createNode(SyntaxKind.JSDocAuthorTag, start);
68826884
result.tagName = tagName;
68836885

6884-
const comment = tryParse(() => tryParseAuthorNameAndEmail());
6886+
const authorInfoWithEmail = tryParse(() => tryParseAuthorNameAndEmail());
6887+
if (!authorInfoWithEmail) {
6888+
return finishNode(result);
6889+
}
6890+
6891+
result.comment = authorInfoWithEmail;
68856892

6886-
if (comment) {
6887-
result.comment = comment;
6893+
if (lookAhead(() => nextToken() !== SyntaxKind.NewLineTrivia)) {
6894+
const comment = parseTagComments(indent);
6895+
if (comment) {
6896+
result.comment += comment;
6897+
}
68886898
}
68896899

68906900
return finishNode(result);
@@ -6894,39 +6904,31 @@ namespace ts {
68946904
const comments: string[] = [];
68956905
let seenLessThan = false;
68966906
let seenGreaterThan = false;
6897-
let seenAtToken = false;
68986907
let token = scanner.getToken();
68996908

69006909
loop: while (true) {
69016910
switch (token) {
69026911
case SyntaxKind.Identifier:
69036912
case SyntaxKind.WhitespaceTrivia:
69046913
case SyntaxKind.DotToken:
6914+
case SyntaxKind.AtToken:
69056915
comments.push(scanner.getTokenText());
69066916
break;
69076917
case SyntaxKind.LessThanToken:
6908-
if (seenLessThan || seenAtToken || seenGreaterThan) {
6918+
if (seenLessThan || seenGreaterThan) {
69096919
return;
69106920
}
69116921
seenLessThan = true;
69126922
comments.push(scanner.getTokenText());
69136923
break;
69146924
case SyntaxKind.GreaterThanToken:
6915-
if (!seenLessThan || !seenAtToken || seenGreaterThan) {
6925+
if (!seenLessThan || seenGreaterThan) {
69166926
return;
69176927
}
6918-
69196928
seenGreaterThan = true;
69206929
comments.push(scanner.getTokenText());
6930+
scanner.setTextPos(scanner.getTokenPos() + 1);
69216931
break loop;
6922-
case SyntaxKind.AtToken:
6923-
if (seenAtToken || !seenLessThan || seenGreaterThan) {
6924-
return;
6925-
}
6926-
6927-
seenAtToken = true;
6928-
comments.push(scanner.getTokenText());
6929-
break;
69306932
case SyntaxKind.NewLineTrivia:
69316933
case SyntaxKind.EndOfFileToken:
69326934
break loop;
@@ -6935,7 +6937,7 @@ namespace ts {
69356937
token = nextJSDocToken();
69366938
}
69376939

6938-
if (seenLessThan && seenAtToken && seenGreaterThan) {
6940+
if (seenLessThan && seenGreaterThan) {
69396941
return comments.length === 0 ? undefined : comments.join("");
69406942
}
69416943
}

src/testRunner/unittests/jsDocParsing.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,7 @@ namespace ts {
317317
parsesCorrectly("authorTag",
318318
`/**
319319
* @author John Doe <[email protected]>
320+
* @author John Doe <[email protected]> unexpected comment
320321
*/`);
321322
});
322323
});
Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,44 @@
11
{
22
"kind": "JSDocComment",
33
"pos": 0,
4-
"end": 50,
4+
"end": 112,
5+
"modifierFlagsCache": 0,
6+
"transformFlags": 0,
57
"tags": {
68
"0": {
79
"kind": "JSDocAuthorTag",
810
"pos": 7,
9-
"end": 45,
11+
"end": 50,
12+
"modifierFlagsCache": 0,
13+
"transformFlags": 0,
1014
"tagName": {
1115
"kind": "Identifier",
1216
"pos": 8,
1317
"end": 14,
18+
"modifierFlagsCache": 0,
19+
"transformFlags": 0,
1420
"escapedText": "author"
1521
},
1622
"comment": "John Doe <[email protected]>"
1723
},
18-
"length": 1,
24+
"1": {
25+
"kind": "JSDocAuthorTag",
26+
"pos": 50,
27+
"end": 110,
28+
"modifierFlagsCache": 0,
29+
"transformFlags": 0,
30+
"tagName": {
31+
"kind": "Identifier",
32+
"pos": 51,
33+
"end": 57,
34+
"modifierFlagsCache": 0,
35+
"transformFlags": 0,
36+
"escapedText": "author"
37+
},
38+
"comment": "John Doe <[email protected]> unexpected comment"
39+
},
40+
"length": 2,
1941
"pos": 7,
20-
"end": 45
42+
"end": 110
2143
}
2244
}

0 commit comments

Comments
 (0)