diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts
index 7b6d49cf8f9c4..33f2f6c58ffd3 100644
--- a/src/compiler/checker.ts
+++ b/src/compiler/checker.ts
@@ -42379,6 +42379,12 @@ m2: ${(this.mapper2 as unknown as DebugTypeMapper).__debugToString().split("\n")
return resolveJSDocMemberName(name, /*ignoreErrors*/ false, getSymbolOfNode(container));
}
}
+ if (result && isJSDoc) {
+ const container = getJSDocHost(name);
+ if (container && isEnumMember(container) && container === result.valueDeclaration) {
+ return resolveEntityName(name, meaning, /*ignoreErrors*/ true, /* dontResolveAlias */ true, getSourceFileOfNode(container)) || result;
+ }
+ }
return result;
}
else if (isPrivateIdentifier(name)) {
diff --git a/tests/baselines/reference/findAllReferencesFromLinkTagReference1.baseline.jsonc b/tests/baselines/reference/findAllReferencesFromLinkTagReference1.baseline.jsonc
new file mode 100644
index 0000000000000..9fc705112fb73
--- /dev/null
+++ b/tests/baselines/reference/findAllReferencesFromLinkTagReference1.baseline.jsonc
@@ -0,0 +1,85 @@
+// === /tests/cases/fourslash/findAllReferencesFromLinkTagReference1.ts ===
+// enum E {
+// /** {@link /*FIND ALL REFS*/[|A|]} */
+// [|A|]
+// }
+
+[
+ {
+ "definition": {
+ "containerKind": "",
+ "containerName": "",
+ "fileName": "/tests/cases/fourslash/findAllReferencesFromLinkTagReference1.ts",
+ "kind": "enum member",
+ "name": "(enum member) E.A = 0",
+ "textSpan": {
+ "start": 34,
+ "length": 1
+ },
+ "displayParts": [
+ {
+ "text": "(",
+ "kind": "punctuation"
+ },
+ {
+ "text": "enum member",
+ "kind": "text"
+ },
+ {
+ "text": ")",
+ "kind": "punctuation"
+ },
+ {
+ "text": " ",
+ "kind": "space"
+ },
+ {
+ "text": "E",
+ "kind": "enumName"
+ },
+ {
+ "text": ".",
+ "kind": "punctuation"
+ },
+ {
+ "text": "A",
+ "kind": "enumMemberName"
+ },
+ {
+ "text": " ",
+ "kind": "space"
+ },
+ {
+ "text": "=",
+ "kind": "operator"
+ },
+ {
+ "text": " ",
+ "kind": "space"
+ },
+ {
+ "text": "0",
+ "kind": "numericLiteral"
+ }
+ ]
+ },
+ "references": [
+ {
+ "textSpan": {
+ "start": 24,
+ "length": 1
+ },
+ "fileName": "/tests/cases/fourslash/findAllReferencesFromLinkTagReference1.ts",
+ "isWriteAccess": false
+ },
+ {
+ "textSpan": {
+ "start": 34,
+ "length": 1
+ },
+ "fileName": "/tests/cases/fourslash/findAllReferencesFromLinkTagReference1.ts",
+ "isWriteAccess": true
+ }
+ ]
+ }
+]
\ No newline at end of file
diff --git a/tests/baselines/reference/findAllReferencesFromLinkTagReference2.baseline.jsonc b/tests/baselines/reference/findAllReferencesFromLinkTagReference2.baseline.jsonc
new file mode 100644
index 0000000000000..f897a6e5d5769
--- /dev/null
+++ b/tests/baselines/reference/findAllReferencesFromLinkTagReference2.baseline.jsonc
@@ -0,0 +1,64 @@
+// === /a.ts ===
+// enum E {
+// /** {@link /*FIND ALL REFS*/[|Foo|]} */
+// Foo
+// }
+// interface [|Foo|] {
+// foo: E.Foo;
+// }
+
+[
+ {
+ "definition": {
+ "containerKind": "",
+ "containerName": "",
+ "fileName": "/a.ts",
+ "kind": "interface",
+ "name": "interface Foo",
+ "textSpan": {
+ "start": 52,
+ "length": 3
+ },
+ "displayParts": [
+ {
+ "text": "interface",
+ "kind": "keyword"
+ },
+ {
+ "text": " ",
+ "kind": "space"
+ },
+ {
+ "text": "Foo",
+ "kind": "interfaceName"
+ }
+ ],
+ "contextSpan": {
+ "start": 42,
+ "length": 33
+ }
+ },
+ "references": [
+ {
+ "textSpan": {
+ "start": 24,
+ "length": 3
+ },
+ "fileName": "/a.ts",
+ "isWriteAccess": false
+ },
+ {
+ "textSpan": {
+ "start": 52,
+ "length": 3
+ },
+ "fileName": "/a.ts",
+ "contextSpan": {
+ "start": 42,
+ "length": 33
+ },
+ "isWriteAccess": true
+ }
+ ]
+ }
+]
\ No newline at end of file
diff --git a/tests/baselines/reference/findAllReferencesFromLinkTagReference3.baseline.jsonc b/tests/baselines/reference/findAllReferencesFromLinkTagReference3.baseline.jsonc
new file mode 100644
index 0000000000000..5c9eefb255da2
--- /dev/null
+++ b/tests/baselines/reference/findAllReferencesFromLinkTagReference3.baseline.jsonc
@@ -0,0 +1,66 @@
+// === /tests/cases/fourslash/a.ts ===
+// interface [|Foo|] {
+// foo: E.Foo;
+// }
+
+// === /tests/cases/fourslash/b.ts ===
+// enum E {
+// /** {@link /*FIND ALL REFS*/[|Foo|]} */
+// Foo
+// }
+
+[
+ {
+ "definition": {
+ "containerKind": "",
+ "containerName": "",
+ "fileName": "/tests/cases/fourslash/a.ts",
+ "kind": "interface",
+ "name": "interface Foo",
+ "textSpan": {
+ "start": 10,
+ "length": 3
+ },
+ "displayParts": [
+ {
+ "text": "interface",
+ "kind": "keyword"
+ },
+ {
+ "text": " ",
+ "kind": "space"
+ },
+ {
+ "text": "Foo",
+ "kind": "interfaceName"
+ }
+ ],
+ "contextSpan": {
+ "start": 0,
+ "length": 33
+ }
+ },
+ "references": [
+ {
+ "textSpan": {
+ "start": 10,
+ "length": 3
+ },
+ "fileName": "/tests/cases/fourslash/a.ts",
+ "contextSpan": {
+ "start": 0,
+ "length": 33
+ },
+ "isWriteAccess": true
+ },
+ {
+ "textSpan": {
+ "start": 24,
+ "length": 3
+ },
+ "fileName": "/tests/cases/fourslash/b.ts",
+ "isWriteAccess": false
+ }
+ ]
+ }
+]
\ No newline at end of file
diff --git a/tests/baselines/reference/findAllReferencesFromLinkTagReference4.baseline.jsonc b/tests/baselines/reference/findAllReferencesFromLinkTagReference4.baseline.jsonc
new file mode 100644
index 0000000000000..b1dbc94dc7666
--- /dev/null
+++ b/tests/baselines/reference/findAllReferencesFromLinkTagReference4.baseline.jsonc
@@ -0,0 +1,86 @@
+// === /tests/cases/fourslash/findAllReferencesFromLinkTagReference4.ts ===
+// enum E {
+// /** {@link /*FIND ALL REFS*/[|B|]} */
+// A,
+// [|B|]
+// }
+
+[
+ {
+ "definition": {
+ "containerKind": "",
+ "containerName": "",
+ "fileName": "/tests/cases/fourslash/findAllReferencesFromLinkTagReference4.ts",
+ "kind": "enum member",
+ "name": "(enum member) E.B = 1",
+ "textSpan": {
+ "start": 41,
+ "length": 1
+ },
+ "displayParts": [
+ {
+ "text": "(",
+ "kind": "punctuation"
+ },
+ {
+ "text": "enum member",
+ "kind": "text"
+ },
+ {
+ "text": ")",
+ "kind": "punctuation"
+ },
+ {
+ "text": " ",
+ "kind": "space"
+ },
+ {
+ "text": "E",
+ "kind": "enumName"
+ },
+ {
+ "text": ".",
+ "kind": "punctuation"
+ },
+ {
+ "text": "B",
+ "kind": "enumMemberName"
+ },
+ {
+ "text": " ",
+ "kind": "space"
+ },
+ {
+ "text": "=",
+ "kind": "operator"
+ },
+ {
+ "text": " ",
+ "kind": "space"
+ },
+ {
+ "text": "1",
+ "kind": "numericLiteral"
+ }
+ ]
+ },
+ "references": [
+ {
+ "textSpan": {
+ "start": 24,
+ "length": 1
+ },
+ "fileName": "/tests/cases/fourslash/findAllReferencesFromLinkTagReference4.ts",
+ "isWriteAccess": false
+ },
+ {
+ "textSpan": {
+ "start": 41,
+ "length": 1
+ },
+ "fileName": "/tests/cases/fourslash/findAllReferencesFromLinkTagReference4.ts",
+ "isWriteAccess": true
+ }
+ ]
+ }
+]
\ No newline at end of file
diff --git a/tests/baselines/reference/findAllReferencesFromLinkTagReference5.baseline.jsonc b/tests/baselines/reference/findAllReferencesFromLinkTagReference5.baseline.jsonc
new file mode 100644
index 0000000000000..c6f03b14a69d6
--- /dev/null
+++ b/tests/baselines/reference/findAllReferencesFromLinkTagReference5.baseline.jsonc
@@ -0,0 +1,85 @@
+// === /tests/cases/fourslash/findAllReferencesFromLinkTagReference5.ts ===
+// enum E {
+// /** {@link E./*FIND ALL REFS*/[|A|]} */
+// [|A|]
+// }
+
+[
+ {
+ "definition": {
+ "containerKind": "",
+ "containerName": "",
+ "fileName": "/tests/cases/fourslash/findAllReferencesFromLinkTagReference5.ts",
+ "kind": "enum member",
+ "name": "(enum member) E.A = 0",
+ "textSpan": {
+ "start": 36,
+ "length": 1
+ },
+ "displayParts": [
+ {
+ "text": "(",
+ "kind": "punctuation"
+ },
+ {
+ "text": "enum member",
+ "kind": "text"
+ },
+ {
+ "text": ")",
+ "kind": "punctuation"
+ },
+ {
+ "text": " ",
+ "kind": "space"
+ },
+ {
+ "text": "E",
+ "kind": "enumName"
+ },
+ {
+ "text": ".",
+ "kind": "punctuation"
+ },
+ {
+ "text": "A",
+ "kind": "enumMemberName"
+ },
+ {
+ "text": " ",
+ "kind": "space"
+ },
+ {
+ "text": "=",
+ "kind": "operator"
+ },
+ {
+ "text": " ",
+ "kind": "space"
+ },
+ {
+ "text": "0",
+ "kind": "numericLiteral"
+ }
+ ]
+ },
+ "references": [
+ {
+ "textSpan": {
+ "start": 26,
+ "length": 1
+ },
+ "fileName": "/tests/cases/fourslash/findAllReferencesFromLinkTagReference5.ts",
+ "isWriteAccess": false
+ },
+ {
+ "textSpan": {
+ "start": 36,
+ "length": 1
+ },
+ "fileName": "/tests/cases/fourslash/findAllReferencesFromLinkTagReference5.ts",
+ "isWriteAccess": true
+ }
+ ]
+ }
+]
\ No newline at end of file
diff --git a/tests/baselines/reference/renameReferenceFromLinkTag1.baseline b/tests/baselines/reference/renameReferenceFromLinkTag1.baseline
new file mode 100644
index 0000000000000..6a267b2d99745
--- /dev/null
+++ b/tests/baselines/reference/renameReferenceFromLinkTag1.baseline
@@ -0,0 +1,6 @@
+/*====== /tests/cases/fourslash/renameReferenceFromLinkTag1.ts ======*/
+
+enum E {
+ /** {@link [|RENAME|]} */
+ RENAME
+}
diff --git a/tests/baselines/reference/renameReferenceFromLinkTag2.baseline b/tests/baselines/reference/renameReferenceFromLinkTag2.baseline
new file mode 100644
index 0000000000000..3da46e2bfff7d
--- /dev/null
+++ b/tests/baselines/reference/renameReferenceFromLinkTag2.baseline
@@ -0,0 +1,9 @@
+/*====== /a.ts ======*/
+
+enum E {
+ /** {@link [|RENAME|]} */
+ Foo
+}
+interface RENAME {
+ foo: E.Foo;
+}
diff --git a/tests/baselines/reference/renameReferenceFromLinkTag3.baseline b/tests/baselines/reference/renameReferenceFromLinkTag3.baseline
new file mode 100644
index 0000000000000..19e3ec871e420
--- /dev/null
+++ b/tests/baselines/reference/renameReferenceFromLinkTag3.baseline
@@ -0,0 +1,12 @@
+/*====== /tests/cases/fourslash/a.ts ======*/
+
+interface RENAME {
+ foo: E.Foo;
+}
+
+/*====== /tests/cases/fourslash/b.ts ======*/
+
+enum E {
+ /** {@link RENAME} */
+ Foo
+}
diff --git a/tests/baselines/reference/renameReferenceFromLinkTag4.baseline b/tests/baselines/reference/renameReferenceFromLinkTag4.baseline
new file mode 100644
index 0000000000000..4020ebfd1dffa
--- /dev/null
+++ b/tests/baselines/reference/renameReferenceFromLinkTag4.baseline
@@ -0,0 +1,7 @@
+/*====== /tests/cases/fourslash/renameReferenceFromLinkTag4.ts ======*/
+
+enum E {
+ /** {@link [|RENAME|]} */
+ A,
+ RENAME
+}
diff --git a/tests/baselines/reference/renameReferenceFromLinkTag5.baseline b/tests/baselines/reference/renameReferenceFromLinkTag5.baseline
new file mode 100644
index 0000000000000..605869bd5e8cc
--- /dev/null
+++ b/tests/baselines/reference/renameReferenceFromLinkTag5.baseline
@@ -0,0 +1,6 @@
+/*====== /tests/cases/fourslash/renameReferenceFromLinkTag5.ts ======*/
+
+enum E {
+ /** {@link E.[|RENAME|]} */
+ RENAME
+}
diff --git a/tests/cases/fourslash/findAllReferencesFromLinkTagReference1.ts b/tests/cases/fourslash/findAllReferencesFromLinkTagReference1.ts
new file mode 100644
index 0000000000000..7265583f5ccce
--- /dev/null
+++ b/tests/cases/fourslash/findAllReferencesFromLinkTagReference1.ts
@@ -0,0 +1,8 @@
+///
+
+////enum E {
+//// /** {@link /**/A} */
+//// A
+////}
+
+verify.baselineFindAllReferences("");
diff --git a/tests/cases/fourslash/findAllReferencesFromLinkTagReference2.ts b/tests/cases/fourslash/findAllReferencesFromLinkTagReference2.ts
new file mode 100644
index 0000000000000..eae6a3d09ceeb
--- /dev/null
+++ b/tests/cases/fourslash/findAllReferencesFromLinkTagReference2.ts
@@ -0,0 +1,12 @@
+///
+
+// @Filename: /a.ts
+////enum E {
+//// /** {@link /**/Foo} */
+//// Foo
+////}
+////interface Foo {
+//// foo: E.Foo;
+////}
+
+verify.baselineFindAllReferences("");
diff --git a/tests/cases/fourslash/findAllReferencesFromLinkTagReference3.ts b/tests/cases/fourslash/findAllReferencesFromLinkTagReference3.ts
new file mode 100644
index 0000000000000..eb150a559647c
--- /dev/null
+++ b/tests/cases/fourslash/findAllReferencesFromLinkTagReference3.ts
@@ -0,0 +1,14 @@
+///
+
+// @filename: a.ts
+////interface Foo {
+//// foo: E.Foo;
+////}
+
+// @Filename: b.ts
+////enum E {
+//// /** {@link /**/Foo} */
+//// Foo
+////}
+
+verify.baselineFindAllReferences("");
diff --git a/tests/cases/fourslash/findAllReferencesFromLinkTagReference4.ts b/tests/cases/fourslash/findAllReferencesFromLinkTagReference4.ts
new file mode 100644
index 0000000000000..869349e0b8b1e
--- /dev/null
+++ b/tests/cases/fourslash/findAllReferencesFromLinkTagReference4.ts
@@ -0,0 +1,8 @@
+///
+////enum E {
+//// /** {@link /**/B} */
+//// A,
+//// B
+////}
+
+verify.baselineFindAllReferences("");
diff --git a/tests/cases/fourslash/findAllReferencesFromLinkTagReference5.ts b/tests/cases/fourslash/findAllReferencesFromLinkTagReference5.ts
new file mode 100644
index 0000000000000..8b9bee761743d
--- /dev/null
+++ b/tests/cases/fourslash/findAllReferencesFromLinkTagReference5.ts
@@ -0,0 +1,8 @@
+///
+
+////enum E {
+//// /** {@link E./**/A} */
+//// A
+////}
+
+verify.baselineFindAllReferences("");
diff --git a/tests/cases/fourslash/gotoDefinitionLinkTag2.ts b/tests/cases/fourslash/gotoDefinitionLinkTag2.ts
new file mode 100644
index 0000000000000..ad463c51f791f
--- /dev/null
+++ b/tests/cases/fourslash/gotoDefinitionLinkTag2.ts
@@ -0,0 +1,9 @@
+///
+
+////enum E {
+//// /** {@link /*1*/[|A|]} */
+//// [|/*2*/A|]
+////}
+
+goTo.marker("1");
+verify.goToDefinitionIs("2");
diff --git a/tests/cases/fourslash/gotoDefinitionLinkTag3.ts b/tests/cases/fourslash/gotoDefinitionLinkTag3.ts
new file mode 100644
index 0000000000000..8dc4105ae8cc2
--- /dev/null
+++ b/tests/cases/fourslash/gotoDefinitionLinkTag3.ts
@@ -0,0 +1,13 @@
+///
+
+// @Filename: /a.ts
+////enum E {
+//// /** {@link /*1*/[|Foo|]} */
+//// Foo
+////}
+////interface [|/*2*/Foo|] {
+//// foo: E.Foo;
+////}
+
+goTo.marker("1");
+verify.goToDefinitionIs("2");
diff --git a/tests/cases/fourslash/gotoDefinitionLinkTag4.ts b/tests/cases/fourslash/gotoDefinitionLinkTag4.ts
new file mode 100644
index 0000000000000..6df523b058e66
--- /dev/null
+++ b/tests/cases/fourslash/gotoDefinitionLinkTag4.ts
@@ -0,0 +1,15 @@
+///
+
+// @filename: a.ts
+////interface [|/*2*/Foo|] {
+//// foo: E.Foo;
+////}
+
+// @Filename: b.ts
+////enum E {
+//// /** {@link /*1*/[|Foo|]} */
+//// Foo
+////}
+
+goTo.marker("1");
+verify.goToDefinitionIs("2");
diff --git a/tests/cases/fourslash/gotoDefinitionLinkTag5.ts b/tests/cases/fourslash/gotoDefinitionLinkTag5.ts
new file mode 100644
index 0000000000000..8425653f41b91
--- /dev/null
+++ b/tests/cases/fourslash/gotoDefinitionLinkTag5.ts
@@ -0,0 +1,9 @@
+///
+////enum E {
+//// /** {@link /*1*/[|B|]} */
+//// A,
+//// [|/*2*/B|]
+////}
+
+goTo.marker("1");
+verify.goToDefinitionIs("2");
diff --git a/tests/cases/fourslash/gotoDefinitionLinkTag6.ts b/tests/cases/fourslash/gotoDefinitionLinkTag6.ts
new file mode 100644
index 0000000000000..c76fcb08fd8e8
--- /dev/null
+++ b/tests/cases/fourslash/gotoDefinitionLinkTag6.ts
@@ -0,0 +1,9 @@
+///
+
+////enum E {
+//// /** {@link E./*1*/[|A|]} */
+//// [|/*2*/A|]
+////}
+
+goTo.marker("1");
+verify.goToDefinitionIs("2");
diff --git a/tests/cases/fourslash/renameReferenceFromLinkTag1.ts b/tests/cases/fourslash/renameReferenceFromLinkTag1.ts
new file mode 100644
index 0000000000000..fe0e4c87b2073
--- /dev/null
+++ b/tests/cases/fourslash/renameReferenceFromLinkTag1.ts
@@ -0,0 +1,8 @@
+///
+
+////enum E {
+//// /** {@link /**/A} */
+//// A
+////}
+
+verify.baselineRename("", {});
\ No newline at end of file
diff --git a/tests/cases/fourslash/renameReferenceFromLinkTag2.ts b/tests/cases/fourslash/renameReferenceFromLinkTag2.ts
new file mode 100644
index 0000000000000..330416ee17a66
--- /dev/null
+++ b/tests/cases/fourslash/renameReferenceFromLinkTag2.ts
@@ -0,0 +1,12 @@
+///
+
+// @Filename: /a.ts
+////enum E {
+//// /** {@link /**/Foo} */
+//// Foo
+////}
+////interface Foo {
+//// foo: E.Foo;
+////}
+
+verify.baselineRename("", {});
diff --git a/tests/cases/fourslash/renameReferenceFromLinkTag3.ts b/tests/cases/fourslash/renameReferenceFromLinkTag3.ts
new file mode 100644
index 0000000000000..439b48f584146
--- /dev/null
+++ b/tests/cases/fourslash/renameReferenceFromLinkTag3.ts
@@ -0,0 +1,14 @@
+///
+
+// @filename: a.ts
+////interface Foo {
+//// foo: E.Foo;
+////}
+
+// @Filename: b.ts
+////enum E {
+//// /** {@link /**/Foo} */
+//// Foo
+////}
+
+verify.baselineRename("", {});
diff --git a/tests/cases/fourslash/renameReferenceFromLinkTag4.ts b/tests/cases/fourslash/renameReferenceFromLinkTag4.ts
new file mode 100644
index 0000000000000..cda21943d6bce
--- /dev/null
+++ b/tests/cases/fourslash/renameReferenceFromLinkTag4.ts
@@ -0,0 +1,8 @@
+///
+////enum E {
+//// /** {@link /**/B} */
+//// A,
+//// B
+////}
+
+verify.baselineRename("", {});
diff --git a/tests/cases/fourslash/renameReferenceFromLinkTag5.ts b/tests/cases/fourslash/renameReferenceFromLinkTag5.ts
new file mode 100644
index 0000000000000..bd80eb841eec3
--- /dev/null
+++ b/tests/cases/fourslash/renameReferenceFromLinkTag5.ts
@@ -0,0 +1,8 @@
+///
+
+////enum E {
+//// /** {@link E./**/A} */
+//// A
+////}
+
+verify.baselineRename("", {});