From 71b39014eb3beb8c232c8745887251cb3a34a076 Mon Sep 17 00:00:00 2001 From: Andy Date: Mon, 9 Apr 2018 14:09:59 -0700 Subject: [PATCH] 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 --- src/compiler/parser.ts | 11 ++- src/harness/unittests/jsDocParsing.ts | 6 ++ ...ts.parsesCorrectly.Nested @param tags.json | 93 +++++++++++++++++++ ...parsesCorrectly.argSynonymForParamTag.json | 4 +- ...sCorrectly.argumentSynonymForParamTag.json | 4 +- ...less-than and greater-than characters.json | 4 +- ...DocComments.parsesCorrectly.paramTag1.json | 4 +- ...arsesCorrectly.paramTagBracketedName1.json | 4 +- ...arsesCorrectly.paramTagBracketedName2.json | 4 +- ...parsesCorrectly.paramTagNameThenType2.json | 4 +- ...Comments.parsesCorrectly.twoParamTag2.json | 2 +- 11 files changed, 121 insertions(+), 19 deletions(-) create mode 100644 tests/baselines/reference/JSDocParsing/DocComments.parsesCorrectly.Nested @param tags.json diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index 357df06dbda..0b89c3c313c 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -6361,8 +6361,8 @@ namespace ts { case "arg": case "argument": case "param": - tag = parseParameterOrPropertyTag(atToken, tagName, PropertyLikeParse.Parameter); - break; + addTag(parseParameterOrPropertyTag(atToken, tagName, PropertyLikeParse.Parameter, indent)); + return; case "return": case "returns": tag = parseReturnTag(atToken, tagName); @@ -6511,7 +6511,7 @@ namespace ts { } } - function parseParameterOrPropertyTag(atToken: AtToken, tagName: Identifier, target: PropertyLikeParse): JSDocParameterTag | JSDocPropertyTag { + function parseParameterOrPropertyTag(atToken: AtToken, tagName: Identifier, target: PropertyLikeParse, indent: number | undefined): JSDocParameterTag | JSDocPropertyTag { let typeExpression = tryParseTypeExpression(); let isNameFirst = !typeExpression; skipWhitespace(); @@ -6526,6 +6526,8 @@ namespace ts { const result = target === PropertyLikeParse.Parameter ? createNode(SyntaxKind.JSDocParameterTag, atToken.pos) : createNode(SyntaxKind.JSDocPropertyTag, atToken.pos); + let comment: string | undefined; + if (indent !== undefined) comment = parseTagComments(indent + scanner.getStartPos() - atToken.pos); const nestedTypeLiteral = parseNestedTypeLiteral(typeExpression, name, target); if (nestedTypeLiteral) { typeExpression = nestedTypeLiteral; @@ -6537,6 +6539,7 @@ namespace ts { result.name = name; result.isNameFirst = isNameFirst; result.isBracketed = isBracketed; + result.comment = comment; return finishNode(result); } @@ -6783,7 +6786,7 @@ namespace ts { if (target !== t) { return false; } - const tag = parseParameterOrPropertyTag(atToken, tagName, target); + const tag = parseParameterOrPropertyTag(atToken, tagName, target, /*indent*/ undefined); tag.comment = parseTagComments(tag.end - tag.pos); return tag; } diff --git a/src/harness/unittests/jsDocParsing.ts b/src/harness/unittests/jsDocParsing.ts index 39416dc5776..fbd9e761625 100644 --- a/src/harness/unittests/jsDocParsing.ts +++ b/src/harness/unittests/jsDocParsing.ts @@ -305,6 +305,12 @@ namespace ts { * @param x hi < > still part of the previous comment */`); + + parsesCorrectly("Nested @param tags", +`/** +* @param {object} o Doc doc +* @param {string} o.f Doc for f +*/`); }); }); describe("getFirstToken", () => { diff --git a/tests/baselines/reference/JSDocParsing/DocComments.parsesCorrectly.Nested @param tags.json b/tests/baselines/reference/JSDocParsing/DocComments.parsesCorrectly.Nested @param tags.json new file mode 100644 index 00000000000..03cffdc49ff --- /dev/null +++ b/tests/baselines/reference/JSDocParsing/DocComments.parsesCorrectly.Nested @param tags.json @@ -0,0 +1,93 @@ +{ + "kind": "JSDocComment", + "pos": 0, + "end": 66, + "tags": { + "0": { + "kind": "JSDocParameterTag", + "pos": 6, + "end": 63, + "atToken": { + "kind": "AtToken", + "pos": 6, + "end": 7 + }, + "tagName": { + "kind": "Identifier", + "pos": 7, + "end": 12, + "escapedText": "param" + }, + "typeExpression": { + "kind": "JSDocTypeExpression", + "pos": 34, + "end": 63, + "type": { + "kind": "JSDocTypeLiteral", + "pos": 34, + "end": 63, + "jsDocPropertyTags": [ + { + "kind": "JSDocParameterTag", + "pos": 34, + "end": 54, + "atToken": { + "kind": "AtToken", + "pos": 34, + "end": 35 + }, + "tagName": { + "kind": "Identifier", + "pos": 35, + "end": 40, + "escapedText": "param" + }, + "typeExpression": { + "kind": "JSDocTypeExpression", + "pos": 41, + "end": 49, + "type": { + "kind": "StringKeyword", + "pos": 42, + "end": 48 + } + }, + "name": { + "kind": "FirstNode", + "pos": 50, + "end": 53, + "left": { + "kind": "Identifier", + "pos": 50, + "end": 51, + "escapedText": "o" + }, + "right": { + "kind": "Identifier", + "pos": 52, + "end": 53, + "escapedText": "f" + } + }, + "isNameFirst": false, + "isBracketed": false, + "comment": "Doc for f" + } + ] + } + }, + "name": { + "kind": "Identifier", + "pos": 22, + "end": 23, + "escapedText": "o" + }, + "isNameFirst": true, + "isBracketed": false, + "comment": "Doc doc" + }, + "length": 1, + "pos": 6, + "end": 63 + } +} \ No newline at end of file diff --git a/tests/baselines/reference/JSDocParsing/DocComments.parsesCorrectly.argSynonymForParamTag.json b/tests/baselines/reference/JSDocParsing/DocComments.parsesCorrectly.argSynonymForParamTag.json index 1a49c026e4c..00d7f0dcc30 100644 --- a/tests/baselines/reference/JSDocParsing/DocComments.parsesCorrectly.argSynonymForParamTag.json +++ b/tests/baselines/reference/JSDocParsing/DocComments.parsesCorrectly.argSynonymForParamTag.json @@ -6,7 +6,7 @@ "0": { "kind": "JSDocParameterTag", "pos": 8, - "end": 28, + "end": 40, "atToken": { "kind": "AtToken", "pos": 8, @@ -40,6 +40,6 @@ }, "length": 1, "pos": 8, - "end": 28 + "end": 40 } } \ No newline at end of file diff --git a/tests/baselines/reference/JSDocParsing/DocComments.parsesCorrectly.argumentSynonymForParamTag.json b/tests/baselines/reference/JSDocParsing/DocComments.parsesCorrectly.argumentSynonymForParamTag.json index 4b463061bb5..6953601f112 100644 --- a/tests/baselines/reference/JSDocParsing/DocComments.parsesCorrectly.argumentSynonymForParamTag.json +++ b/tests/baselines/reference/JSDocParsing/DocComments.parsesCorrectly.argumentSynonymForParamTag.json @@ -6,7 +6,7 @@ "0": { "kind": "JSDocParameterTag", "pos": 8, - "end": 33, + "end": 45, "atToken": { "kind": "AtToken", "pos": 8, @@ -40,6 +40,6 @@ }, "length": 1, "pos": 8, - "end": 33 + "end": 45 } } \ No newline at end of file diff --git a/tests/baselines/reference/JSDocParsing/DocComments.parsesCorrectly.less-than and greater-than characters.json b/tests/baselines/reference/JSDocParsing/DocComments.parsesCorrectly.less-than and greater-than characters.json index 93d7cf14737..472fbbeb6bb 100644 --- a/tests/baselines/reference/JSDocParsing/DocComments.parsesCorrectly.less-than and greater-than characters.json +++ b/tests/baselines/reference/JSDocParsing/DocComments.parsesCorrectly.less-than and greater-than characters.json @@ -6,7 +6,7 @@ "0": { "kind": "JSDocParameterTag", "pos": 7, - "end": 16, + "end": 58, "atToken": { "kind": "AtToken", "pos": 7, @@ -30,6 +30,6 @@ }, "length": 1, "pos": 7, - "end": 16 + "end": 58 } } \ No newline at end of file diff --git a/tests/baselines/reference/JSDocParsing/DocComments.parsesCorrectly.paramTag1.json b/tests/baselines/reference/JSDocParsing/DocComments.parsesCorrectly.paramTag1.json index 21d94f52e6a..b3e58d84923 100644 --- a/tests/baselines/reference/JSDocParsing/DocComments.parsesCorrectly.paramTag1.json +++ b/tests/baselines/reference/JSDocParsing/DocComments.parsesCorrectly.paramTag1.json @@ -6,7 +6,7 @@ "0": { "kind": "JSDocParameterTag", "pos": 8, - "end": 30, + "end": 55, "atToken": { "kind": "AtToken", "pos": 8, @@ -40,6 +40,6 @@ }, "length": 1, "pos": 8, - "end": 30 + "end": 55 } } \ No newline at end of file diff --git a/tests/baselines/reference/JSDocParsing/DocComments.parsesCorrectly.paramTagBracketedName1.json b/tests/baselines/reference/JSDocParsing/DocComments.parsesCorrectly.paramTagBracketedName1.json index 18649dcb321..6721afb2ea7 100644 --- a/tests/baselines/reference/JSDocParsing/DocComments.parsesCorrectly.paramTagBracketedName1.json +++ b/tests/baselines/reference/JSDocParsing/DocComments.parsesCorrectly.paramTagBracketedName1.json @@ -6,7 +6,7 @@ "0": { "kind": "JSDocParameterTag", "pos": 8, - "end": 31, + "end": 57, "atToken": { "kind": "AtToken", "pos": 8, @@ -40,6 +40,6 @@ }, "length": 1, "pos": 8, - "end": 31 + "end": 57 } } \ No newline at end of file diff --git a/tests/baselines/reference/JSDocParsing/DocComments.parsesCorrectly.paramTagBracketedName2.json b/tests/baselines/reference/JSDocParsing/DocComments.parsesCorrectly.paramTagBracketedName2.json index 6bddf6235d5..bf53423ad6a 100644 --- a/tests/baselines/reference/JSDocParsing/DocComments.parsesCorrectly.paramTagBracketedName2.json +++ b/tests/baselines/reference/JSDocParsing/DocComments.parsesCorrectly.paramTagBracketedName2.json @@ -6,7 +6,7 @@ "0": { "kind": "JSDocParameterTag", "pos": 8, - "end": 36, + "end": 62, "atToken": { "kind": "AtToken", "pos": 8, @@ -40,6 +40,6 @@ }, "length": 1, "pos": 8, - "end": 36 + "end": 62 } } \ No newline at end of file diff --git a/tests/baselines/reference/JSDocParsing/DocComments.parsesCorrectly.paramTagNameThenType2.json b/tests/baselines/reference/JSDocParsing/DocComments.parsesCorrectly.paramTagNameThenType2.json index e6c48a3f759..68edeb90190 100644 --- a/tests/baselines/reference/JSDocParsing/DocComments.parsesCorrectly.paramTagNameThenType2.json +++ b/tests/baselines/reference/JSDocParsing/DocComments.parsesCorrectly.paramTagNameThenType2.json @@ -6,7 +6,7 @@ "0": { "kind": "JSDocParameterTag", "pos": 8, - "end": 29, + "end": 42, "atToken": { "kind": "AtToken", "pos": 8, @@ -40,6 +40,6 @@ }, "length": 1, "pos": 8, - "end": 29 + "end": 42 } } \ No newline at end of file diff --git a/tests/baselines/reference/JSDocParsing/DocComments.parsesCorrectly.twoParamTag2.json b/tests/baselines/reference/JSDocParsing/DocComments.parsesCorrectly.twoParamTag2.json index c73009315bc..6f073802fcd 100644 --- a/tests/baselines/reference/JSDocParsing/DocComments.parsesCorrectly.twoParamTag2.json +++ b/tests/baselines/reference/JSDocParsing/DocComments.parsesCorrectly.twoParamTag2.json @@ -6,7 +6,7 @@ "0": { "kind": "JSDocParameterTag", "pos": 8, - "end": 32, + "end": 34, "atToken": { "kind": "AtToken", "pos": 8,