From b9a06e515ff4ffaaf5eba87fa49f169fb532c7b5 Mon Sep 17 00:00:00 2001 From: Oleksandr T Date: Wed, 16 Feb 2022 03:20:51 +0200 Subject: [PATCH] fix(47261): allow linkcode/linkplain tags in see tag (#47403) --- src/compiler/parser.ts | 10 ++++++---- tests/baselines/reference/seeTag4.js | 23 +++++++++++++++++++++++ tests/baselines/reference/seeTag4.symbols | 13 +++++++++++++ tests/baselines/reference/seeTag4.types | 13 +++++++++++++ tests/cases/conformance/jsdoc/seeTag4.ts | 15 +++++++++++++++ 5 files changed, 70 insertions(+), 4 deletions(-) create mode 100644 tests/baselines/reference/seeTag4.js create mode 100644 tests/baselines/reference/seeTag4.symbols create mode 100644 tests/baselines/reference/seeTag4.types create mode 100644 tests/cases/conformance/jsdoc/seeTag4.ts diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index 6b550c75b61..3d63e5ac4ba 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -8148,12 +8148,14 @@ namespace ts { && nextTokenJSDoc() === SyntaxKind.AtToken && tokenIsIdentifierOrKeyword(nextTokenJSDoc())) { const kind = scanner.getTokenValue(); - if(kind === "link" || kind === "linkcode" || kind === "linkplain") { - return kind; - } + if (isJSDocLinkTag(kind)) return kind; } } + function isJSDocLinkTag(kind: string) { + return kind === "link" || kind === "linkcode" || kind === "linkplain"; + } + function parseUnknownTag(start: number, tagName: Identifier, indent: number, indentText: string) { return finishNode(factory.createJSDocUnknownTag(tagName, parseTrailingTagComments(start, getNodePos(), indent, indentText)), start); } @@ -8276,7 +8278,7 @@ namespace ts { function parseSeeTag(start: number, tagName: Identifier, indent?: number, indentText?: string): JSDocSeeTag { const isMarkdownOrJSDocLink = token() === SyntaxKind.OpenBracketToken - || lookAhead(() => nextTokenJSDoc() === SyntaxKind.AtToken && tokenIsIdentifierOrKeyword(nextTokenJSDoc()) && scanner.getTokenValue() === "link"); + || lookAhead(() => nextTokenJSDoc() === SyntaxKind.AtToken && tokenIsIdentifierOrKeyword(nextTokenJSDoc()) && isJSDocLinkTag(scanner.getTokenValue())); const nameExpression = isMarkdownOrJSDocLink ? undefined : parseJSDocNameReference(); const comments = indent !== undefined && indentText !== undefined ? parseTrailingTagComments(start, getNodePos(), indent, indentText) : undefined; return finishNode(factory.createJSDocSeeTag(tagName, nameExpression, comments), start); diff --git a/tests/baselines/reference/seeTag4.js b/tests/baselines/reference/seeTag4.js new file mode 100644 index 00000000000..54cc11f8587 --- /dev/null +++ b/tests/baselines/reference/seeTag4.js @@ -0,0 +1,23 @@ +//// [seeTag4.js] +/** + * @typedef {any} A + */ + +/** + * @see {@link A} + * @see {@linkcode A} + * @see {@linkplain A} + */ +let foo; + + +//// [seeTag4.js] +/** + * @typedef {any} A + */ +/** + * @see {@link A} + * @see {@linkcode A} + * @see {@linkplain A} + */ +var foo; diff --git a/tests/baselines/reference/seeTag4.symbols b/tests/baselines/reference/seeTag4.symbols new file mode 100644 index 00000000000..a3b72307a1f --- /dev/null +++ b/tests/baselines/reference/seeTag4.symbols @@ -0,0 +1,13 @@ +=== tests/cases/conformance/jsdoc/seeTag4.js === +/** + * @typedef {any} A + */ + +/** + * @see {@link A} + * @see {@linkcode A} + * @see {@linkplain A} + */ +let foo; +>foo : Symbol(foo, Decl(seeTag4.js, 9, 3)) + diff --git a/tests/baselines/reference/seeTag4.types b/tests/baselines/reference/seeTag4.types new file mode 100644 index 00000000000..89fb40eafd0 --- /dev/null +++ b/tests/baselines/reference/seeTag4.types @@ -0,0 +1,13 @@ +=== tests/cases/conformance/jsdoc/seeTag4.js === +/** + * @typedef {any} A + */ + +/** + * @see {@link A} + * @see {@linkcode A} + * @see {@linkplain A} + */ +let foo; +>foo : any + diff --git a/tests/cases/conformance/jsdoc/seeTag4.ts b/tests/cases/conformance/jsdoc/seeTag4.ts new file mode 100644 index 00000000000..d7973751555 --- /dev/null +++ b/tests/cases/conformance/jsdoc/seeTag4.ts @@ -0,0 +1,15 @@ +// @checkJs: true +// @allowJs: true +// @outdir: out/ +// @filename: seeTag4.js + +/** + * @typedef {any} A + */ + +/** + * @see {@link A} + * @see {@linkcode A} + * @see {@linkplain A} + */ +let foo;