diff --git a/src/compiler/binder.ts b/src/compiler/binder.ts index 4c3eac092b45a..4e250aa465979 100644 --- a/src/compiler/binder.ts +++ b/src/compiler/binder.ts @@ -2456,13 +2456,23 @@ namespace ts { } else { for (const j of node.jsDoc!) { - setParent(j, node); - setParentRecursive(j, /*incremental*/ false); + setParentsAndBindAnonymousJSDocTypes(j); } } } } + function setParentsAndBindAnonymousJSDocTypes(node: Node) { + setParent(node, parent); + const saveParent = parent; + parent = node; + if (node.kind === SyntaxKind.TypeLiteral) { + bindWorker(node); + } + forEachChild(node, setParentsAndBindAnonymousJSDocTypes); + parent = saveParent; + } + function updateStrictModeStatementList(statements: NodeArray) { if (!inStrictMode) { for (const statement of statements) { diff --git a/src/services/utilities.ts b/src/services/utilities.ts index 58d1b1cbca1e8..4d24e57d051ee 100644 --- a/src/services/utilities.ts +++ b/src/services/utilities.ts @@ -790,8 +790,6 @@ namespace ts { } export function getContextualTypeFromParentOrAncestorTypeNode(node: Expression, checker: TypeChecker): Type | undefined { - if (node.flags & (NodeFlags.JSDoc & ~NodeFlags.JavaScriptFile)) return undefined; - const contextualType = getContextualTypeFromParent(node, checker); if (contextualType) return contextualType; diff --git a/tests/baselines/reference/findAllRefsForStringLiteral.baseline.jsonc b/tests/baselines/reference/findAllRefsForStringLiteral1.baseline.jsonc similarity index 100% rename from tests/baselines/reference/findAllRefsForStringLiteral.baseline.jsonc rename to tests/baselines/reference/findAllRefsForStringLiteral1.baseline.jsonc diff --git a/tests/baselines/reference/findAllRefsForStringLiteral2.baseline.jsonc b/tests/baselines/reference/findAllRefsForStringLiteral2.baseline.jsonc new file mode 100644 index 0000000000000..540fd3534a0c8 --- /dev/null +++ b/tests/baselines/reference/findAllRefsForStringLiteral2.baseline.jsonc @@ -0,0 +1,47 @@ +// === /a.ts === +// /** +// * @type {"[|foo|]" | "bar"} +// */ +// let x = "[|foo|]"/*FIND ALL REFS*/ + +[ + { + "definition": { + "containerKind": "", + "containerName": "", + "fileName": "/a.ts", + "kind": "var", + "name": "foo", + "textSpan": { + "start": 42, + "length": 3 + }, + "displayParts": [ + { + "text": "\"foo\"", + "kind": "stringLiteral" + } + ] + }, + "references": [ + { + "textSpan": { + "start": 15, + "length": 3 + }, + "fileName": "/a.ts", + "isWriteAccess": false, + "isInString": true + }, + { + "textSpan": { + "start": 42, + "length": 3 + }, + "fileName": "/a.ts", + "isWriteAccess": false, + "isInString": true + } + ] + } +] \ No newline at end of file diff --git a/tests/cases/fourslash/completionsAtJsDoc.ts b/tests/cases/fourslash/completionsAtJsDoc.ts new file mode 100644 index 0000000000000..2f7819a719453 --- /dev/null +++ b/tests/cases/fourslash/completionsAtJsDoc.ts @@ -0,0 +1,15 @@ +/// + +////interface Foo { } +/////** +//// * @type {Foo<{/**/}>} +//// */ + +verify.completions({ + marker: "", + exact: { + name: "readonly", + sortText: completion.SortText.GlobalsOrKeywords + }, + isNewIdentifierLocation: true, +}); diff --git a/tests/cases/fourslash/findAllRefsForStringLiteral.ts b/tests/cases/fourslash/findAllRefsForStringLiteral1.ts similarity index 100% rename from tests/cases/fourslash/findAllRefsForStringLiteral.ts rename to tests/cases/fourslash/findAllRefsForStringLiteral1.ts diff --git a/tests/cases/fourslash/findAllRefsForStringLiteral2.ts b/tests/cases/fourslash/findAllRefsForStringLiteral2.ts new file mode 100644 index 0000000000000..80d978e1d3513 --- /dev/null +++ b/tests/cases/fourslash/findAllRefsForStringLiteral2.ts @@ -0,0 +1,9 @@ +/// + +// @filename: /a.ts +/////** +//// * @type {"foo" | "bar"} +//// */ +////let x = "foo"/**/ + +verify.baselineFindAllReferences("");