From dc8a10ee990bbd66fc4e7f0bca1c283f189ee28e Mon Sep 17 00:00:00 2001 From: Oleksandr T Date: Tue, 4 Oct 2022 15:28:54 +0300 Subject: [PATCH 1/4] Add test case for completion in the jsdoc type literals for typescript files. --- tests/cases/fourslash/completionsAtJsDoc.ts | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 tests/cases/fourslash/completionsAtJsDoc.ts diff --git a/tests/cases/fourslash/completionsAtJsDoc.ts b/tests/cases/fourslash/completionsAtJsDoc.ts new file mode 100644 index 0000000000000..a83d07ab249cc --- /dev/null +++ b/tests/cases/fourslash/completionsAtJsDoc.ts @@ -0,0 +1,8 @@ +/// + +////interface Foo { } +/////** +//// * @type {Foo<{/**/}>} +//// */ + +verify.completions({ marker: "", exact: [], isNewIdentifierLocation: true }); From b0a985bf0b8ce150d383e29cfa177982831fef5d Mon Sep 17 00:00:00 2001 From: Oleksandr T Date: Tue, 4 Oct 2022 11:40:38 +0300 Subject: [PATCH 2/4] Add test for find-all-refs on string literal types in JsDoc for TypeScript files --- src/services/utilities.ts | 2 - ...ndAllRefsForStringLiteral1.baseline.jsonc} | 0 ...indAllRefsForStringLiteral2.baseline.jsonc | 38 +++++++++++++++++++ ...ral.ts => findAllRefsForStringLiteral1.ts} | 0 .../fourslash/findAllRefsForStringLiteral2.ts | 9 +++++ 5 files changed, 47 insertions(+), 2 deletions(-) rename tests/baselines/reference/{findAllRefsForStringLiteral.baseline.jsonc => findAllRefsForStringLiteral1.baseline.jsonc} (100%) create mode 100644 tests/baselines/reference/findAllRefsForStringLiteral2.baseline.jsonc rename tests/cases/fourslash/{findAllRefsForStringLiteral.ts => findAllRefsForStringLiteral1.ts} (100%) create mode 100644 tests/cases/fourslash/findAllRefsForStringLiteral2.ts 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..e316226b87971 --- /dev/null +++ b/tests/baselines/reference/findAllRefsForStringLiteral2.baseline.jsonc @@ -0,0 +1,38 @@ +// === /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": 42, + "length": 3 + }, + "fileName": "/a.ts", + "isWriteAccess": false, + "isInString": true + } + ] + } +] \ No newline at end of file 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(""); From 2b278c9e3d943b9937d653f214f455903487866d Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Tue, 4 Oct 2022 23:34:12 +0000 Subject: [PATCH 3/4] Add a lightweight walk to bind object type literals in JSDoc. --- src/compiler/binder.ts | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) 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) { From 1d901bfa82f7f166ee3779f8541741d6a25dc52d Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Tue, 4 Oct 2022 23:34:20 +0000 Subject: [PATCH 4/4] Updated test case and baseline. --- .../findAllRefsForStringLiteral2.baseline.jsonc | 11 ++++++++++- tests/cases/fourslash/completionsAtJsDoc.ts | 9 ++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/tests/baselines/reference/findAllRefsForStringLiteral2.baseline.jsonc b/tests/baselines/reference/findAllRefsForStringLiteral2.baseline.jsonc index e316226b87971..540fd3534a0c8 100644 --- a/tests/baselines/reference/findAllRefsForStringLiteral2.baseline.jsonc +++ b/tests/baselines/reference/findAllRefsForStringLiteral2.baseline.jsonc @@ -1,6 +1,6 @@ // === /a.ts === // /** -// * @type {"foo" | "bar"} +// * @type {"[|foo|]" | "bar"} // */ // let x = "[|foo|]"/*FIND ALL REFS*/ @@ -24,6 +24,15 @@ ] }, "references": [ + { + "textSpan": { + "start": 15, + "length": 3 + }, + "fileName": "/a.ts", + "isWriteAccess": false, + "isInString": true + }, { "textSpan": { "start": 42, diff --git a/tests/cases/fourslash/completionsAtJsDoc.ts b/tests/cases/fourslash/completionsAtJsDoc.ts index a83d07ab249cc..2f7819a719453 100644 --- a/tests/cases/fourslash/completionsAtJsDoc.ts +++ b/tests/cases/fourslash/completionsAtJsDoc.ts @@ -5,4 +5,11 @@ //// * @type {Foo<{/**/}>} //// */ -verify.completions({ marker: "", exact: [], isNewIdentifierLocation: true }); +verify.completions({ + marker: "", + exact: { + name: "readonly", + sortText: completion.SortText.GlobalsOrKeywords + }, + isNewIdentifierLocation: true, +});