From 7dcf11f13985be927886ebea353d282a9b3418e0 Mon Sep 17 00:00:00 2001 From: Oleksandr T Date: Tue, 4 Oct 2022 01:57:32 +0300 Subject: [PATCH] fix(50750): Object type literal with string literal property in contextual typing position causes language service error on all literal type references (#50757) * fix(50750): skip unbound symbols from JSDoc tags in typescript * skip contextual type checking in JsDoc for TypeScript files --- src/services/utilities.ts | 2 + ...findAllRefsForStringLiteral.baseline.jsonc | 52 +++++++++++++++++++ .../reference/renameForStringLiteral.baseline | 11 ++++ .../fourslash/findAllRefsForStringLiteral.ts | 14 +++++ .../cases/fourslash/renameForStringLiteral.ts | 14 +++++ 5 files changed, 93 insertions(+) create mode 100644 tests/baselines/reference/findAllRefsForStringLiteral.baseline.jsonc create mode 100644 tests/baselines/reference/renameForStringLiteral.baseline create mode 100644 tests/cases/fourslash/findAllRefsForStringLiteral.ts create mode 100644 tests/cases/fourslash/renameForStringLiteral.ts diff --git a/src/services/utilities.ts b/src/services/utilities.ts index 4d24e57d051ee..58d1b1cbca1e8 100644 --- a/src/services/utilities.ts +++ b/src/services/utilities.ts @@ -790,6 +790,8 @@ 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/findAllRefsForStringLiteral.baseline.jsonc new file mode 100644 index 0000000000000..5cfaa3f509c15 --- /dev/null +++ b/tests/baselines/reference/findAllRefsForStringLiteral.baseline.jsonc @@ -0,0 +1,52 @@ +// === /a.ts === +// interface Foo { +// property: /*FIND ALL REFS*/"[|foo|]"; +// } +// /** +// * @type {{ property: "foo"}} +// */ +// const obj: Foo = { +// property: "[|foo|]", +// } + +[ + { + "definition": { + "containerKind": "", + "containerName": "", + "fileName": "/a.ts", + "kind": "var", + "name": "foo", + "textSpan": { + "start": 31, + "length": 3 + }, + "displayParts": [ + { + "text": "\"foo\"", + "kind": "stringLiteral" + } + ] + }, + "references": [ + { + "textSpan": { + "start": 31, + "length": 3 + }, + "fileName": "/a.ts", + "isWriteAccess": false, + "isInString": true + }, + { + "textSpan": { + "start": 111, + "length": 3 + }, + "fileName": "/a.ts", + "isWriteAccess": false, + "isInString": true + } + ] + } +] \ No newline at end of file diff --git a/tests/baselines/reference/renameForStringLiteral.baseline b/tests/baselines/reference/renameForStringLiteral.baseline new file mode 100644 index 0000000000000..9e915526960da --- /dev/null +++ b/tests/baselines/reference/renameForStringLiteral.baseline @@ -0,0 +1,11 @@ +/*====== /a.ts ======*/ + +interface Foo { + property: "RENAME"; +} +/** + * @type {{ property: "foo"}} + */ +const obj: Foo = { + property: "RENAME", +} diff --git a/tests/cases/fourslash/findAllRefsForStringLiteral.ts b/tests/cases/fourslash/findAllRefsForStringLiteral.ts new file mode 100644 index 0000000000000..d7a3e92943ddf --- /dev/null +++ b/tests/cases/fourslash/findAllRefsForStringLiteral.ts @@ -0,0 +1,14 @@ +/// + +// @filename: /a.ts +////interface Foo { +//// property: /**/"foo"; +////} +/////** +//// * @type {{ property: "foo"}} +//// */ +////const obj: Foo = { +//// property: "foo", +////} + +verify.baselineFindAllReferences(""); diff --git a/tests/cases/fourslash/renameForStringLiteral.ts b/tests/cases/fourslash/renameForStringLiteral.ts new file mode 100644 index 0000000000000..5d35ded522ad4 --- /dev/null +++ b/tests/cases/fourslash/renameForStringLiteral.ts @@ -0,0 +1,14 @@ +/// + +// @filename: /a.ts +////interface Foo { +//// property: /**/"foo"; +////} +/////** +//// * @type {{ property: "foo"}} +//// */ +////const obj: Foo = { +//// property: "foo", +////} + +verify.baselineRename("", {});