@@ -36955,6 +36955,12 @@ namespace ts {
3695536955 checkSourceElement(node.typeExpression);
3695636956 }
3695736957
36958+ function checkJSDocLinkLikeTag(node: JSDocLink | JSDocLinkCode | JSDocLinkPlain) {
36959+ if (node.name) {
36960+ resolveJSDocMemberName(node.name, /*ignoreErrors*/ true);
36961+ }
36962+ }
36963+
3695836964 function checkJSDocParameterTag(node: JSDocParameterTag) {
3695936965 checkSourceElement(node.typeExpression);
3696036966 }
@@ -41172,9 +41178,15 @@ namespace ts {
4117241178 }
4117341179
4117441180 function checkSourceElementWorker(node: Node): void {
41175- if (isInJSFile(node)) {
41176- forEach((node as JSDocContainer).jsDoc, ({ tags }) => forEach(tags, checkSourceElement));
41177- }
41181+ forEach((node as JSDocContainer).jsDoc, ({ comment, tags }) => {
41182+ checkJSDocCommentWorker(comment);
41183+ forEach(tags, tag => {
41184+ checkJSDocCommentWorker(tag.comment);
41185+ if (isInJSFile(node)) {
41186+ checkSourceElement(tag);
41187+ }
41188+ });
41189+ });
4117841190
4117941191 const kind = node.kind;
4118041192 if (cancellationToken) {
@@ -41262,6 +41274,10 @@ namespace ts {
4126241274 return checkJSDocTemplateTag(node as JSDocTemplateTag);
4126341275 case SyntaxKind.JSDocTypeTag:
4126441276 return checkJSDocTypeTag(node as JSDocTypeTag);
41277+ case SyntaxKind.JSDocLink:
41278+ case SyntaxKind.JSDocLinkCode:
41279+ case SyntaxKind.JSDocLinkPlain:
41280+ return checkJSDocLinkLikeTag(node as JSDocLink | JSDocLinkCode | JSDocLinkPlain);
4126541281 case SyntaxKind.JSDocParameterTag:
4126641282 return checkJSDocParameterTag(node as JSDocParameterTag);
4126741283 case SyntaxKind.JSDocPropertyTag:
@@ -41357,6 +41373,16 @@ namespace ts {
4135741373 }
4135841374 }
4135941375
41376+ function checkJSDocCommentWorker(node: string | readonly JSDocComment[] | undefined) {
41377+ if (isArray(node)) {
41378+ forEach(node, tag => {
41379+ if (isJSDocLinkLike(tag)) {
41380+ checkSourceElement(tag);
41381+ }
41382+ });
41383+ }
41384+ }
41385+
4136041386 function checkJSDocTypeIsInJsFile(node: Node): void {
4136141387 if (!isInJSFile(node)) {
4136241388 grammarErrorOnNode(node, Diagnostics.JSDoc_types_can_only_be_used_inside_documentation_comments);
@@ -41990,7 +42016,7 @@ namespace ts {
4199042016 if (!result && isJSDoc) {
4199142017 const container = findAncestor(name, or(isClassLike, isInterfaceDeclaration));
4199242018 if (container) {
41993- return resolveJSDocMemberName(name, getSymbolOfNode(container));
42019+ return resolveJSDocMemberName(name, /*ignoreErrors*/ false, getSymbolOfNode(container));
4199442020 }
4199542021 }
4199642022 return result;
@@ -42039,19 +42065,19 @@ namespace ts {
4203942065 *
4204042066 * For unqualified names, a container K may be provided as a second argument.
4204142067 */
42042- function resolveJSDocMemberName(name: EntityName | JSDocMemberName, container?: Symbol): Symbol | undefined {
42068+ function resolveJSDocMemberName(name: EntityName | JSDocMemberName, ignoreErrors?: boolean, container?: Symbol): Symbol | undefined {
4204342069 if (isEntityName(name)) {
4204442070 // resolve static values first
4204542071 const meaning = SymbolFlags.Type | SymbolFlags.Namespace | SymbolFlags.Value;
42046- let symbol = resolveEntityName(name, meaning, /* ignoreErrors*/ false , /*dontResolveAlias*/ true, getHostSignatureFromJSDoc(name));
42072+ let symbol = resolveEntityName(name, meaning, ignoreErrors, /*dontResolveAlias*/ true, getHostSignatureFromJSDoc(name));
4204742073 if (!symbol && isIdentifier(name) && container) {
4204842074 symbol = getMergedSymbol(getSymbol(getExportsOfSymbol(container), name.escapedText, meaning));
4204942075 }
4205042076 if (symbol) {
4205142077 return symbol;
4205242078 }
4205342079 }
42054- const left = isIdentifier(name) ? container : resolveJSDocMemberName(name.left);
42080+ const left = isIdentifier(name) ? container : resolveJSDocMemberName(name.left, ignoreErrors, container );
4205542081 const right = isIdentifier(name) ? name.escapedText : name.right.escapedText;
4205642082 if (left) {
4205742083 const proto = left.flags & SymbolFlags.Value && getPropertyOfType(getTypeOfSymbol(left), "prototype" as __String);
0 commit comments