diff --git a/src/services/findAllReferences.ts b/src/services/findAllReferences.ts index 522577f9d8f87..364e150b5a7af 100644 --- a/src/services/findAllReferences.ts +++ b/src/services/findAllReferences.ts @@ -1013,9 +1013,8 @@ export namespace Core { const checker = program.getTypeChecker(); // constructors should use the class symbol, detected by name, if present const symbol = checker.getSymbolAtLocation(isConstructorDeclaration(node) && node.parent.name || node); - // Could not find a symbol e.g. unknown identifier - if (!symbol) { + if (!symbol || (isStringLiteralLike(node) && isStringLiteralPropertyReference(node, checker))) { // String literal might be a property (and thus have a symbol), so do this here rather than in getReferencedSymbolsSpecial. if (!options.implementations && isStringLiteralLike(node)) { if (isModuleSpecifierLike(node)) { @@ -1389,7 +1388,6 @@ export namespace Core { /** Only set if `options.implementations` is true. These are the symbols checked to get the implementations of a property access. */ readonly parents: readonly Symbol[] | undefined; readonly allSearchSymbols: readonly Symbol[]; - /** * Whether a symbol is in the search set. * Do not compare directly to `symbol` because there may be related symbols to search for. See `populateSearchSymbolSet`. @@ -2480,7 +2478,7 @@ export namespace Core { cancellationToken.throwIfCancellationRequested(); return mapDefined(getPossibleSymbolReferenceNodes(sourceFile, node.text), ref => { if (isStringLiteralLike(ref) && ref.text === node.text) { - if (type) { + if (type && !isStringLiteralPropertyReference(node, checker)) { const refType = getContextualTypeFromParentOrAncestorTypeNode(ref, checker); if (type !== checker.getStringType() && (type === refType || isStringLiteralPropertyReference(ref, checker))) { return nodeEntry(ref, EntryKind.StringLiteral); diff --git a/tests/baselines/reference/renameStringLiteralTypes6.baseline.jsonc b/tests/baselines/reference/renameStringLiteralTypes6.baseline.jsonc new file mode 100644 index 0000000000000..e34b4a0bbf388 --- /dev/null +++ b/tests/baselines/reference/renameStringLiteralTypes6.baseline.jsonc @@ -0,0 +1,9 @@ +// === findRenameLocations === +// === /tests/cases/fourslash/renameStringLiteralTypes6.ts === +// interface Case_1 { +// <|"[|Att 2RENAME|]"/*RENAME*/: string|> +// } +// +// declare const fnc_1: (p: K) => void +// +// fnc_1("[|Att 2RENAME|]") \ No newline at end of file diff --git a/tests/baselines/reference/renameStringLiteralTypes7.baseline.jsonc b/tests/baselines/reference/renameStringLiteralTypes7.baseline.jsonc new file mode 100644 index 0000000000000..bf5d7d29e9994 --- /dev/null +++ b/tests/baselines/reference/renameStringLiteralTypes7.baseline.jsonc @@ -0,0 +1,11 @@ +// === findRenameLocations === +// === /tests/cases/fourslash/renameStringLiteralTypes7.ts === +// declare const Att_1: "[|Att 2RENAME|]"/*RENAME*/ +// +// interface Case_1 { +// [Att_1]: string +// } +// +// declare const fnc_1: (p: K) => void +// +// fnc_1("[|Att 2RENAME|]") \ No newline at end of file diff --git a/tests/baselines/reference/renameStringLiteralTypes8.baseline.jsonc b/tests/baselines/reference/renameStringLiteralTypes8.baseline.jsonc new file mode 100644 index 0000000000000..a608bbdf3b75f --- /dev/null +++ b/tests/baselines/reference/renameStringLiteralTypes8.baseline.jsonc @@ -0,0 +1,9 @@ +// === findRenameLocations === +// === /tests/cases/fourslash/renameStringLiteralTypes8.ts === +// type T = { +// <|"[|Prop 1RENAME|]"/*RENAME*/: string;|> +// } +// +// declare const fn: (p: K) => void +// +// fn("[|Prop 1RENAME|]") \ No newline at end of file diff --git a/tests/cases/fourslash/renameStringLiteralTypes5.ts b/tests/cases/fourslash/renameStringLiteralTypes5.ts index aa40b656e57e3..44e809b3b94e5 100644 --- a/tests/cases/fourslash/renameStringLiteralTypes5.ts +++ b/tests/cases/fourslash/renameStringLiteralTypes5.ts @@ -1,5 +1,4 @@ /// - ////type T = { //// "Prop 1": string; ////} @@ -7,5 +6,4 @@ ////declare const fn: (p: K) => void //// ////fn("Prop 1"/**/) - -verify.baselineRename("", {}); +verify.baselineRename("", {}); \ No newline at end of file diff --git a/tests/cases/fourslash/renameStringLiteralTypes6.ts b/tests/cases/fourslash/renameStringLiteralTypes6.ts new file mode 100644 index 0000000000000..7e8b9b68ce6fe --- /dev/null +++ b/tests/cases/fourslash/renameStringLiteralTypes6.ts @@ -0,0 +1,12 @@ +/// + + +////interface Case_1 { +//// "Att 2"/**/: string +////} +//// +////declare const fnc_1: (p: K) => void +//// +////fnc_1("Att 2") + +verify.baselineRename("", {}); diff --git a/tests/cases/fourslash/renameStringLiteralTypes7.ts b/tests/cases/fourslash/renameStringLiteralTypes7.ts new file mode 100644 index 0000000000000..76280e63838d6 --- /dev/null +++ b/tests/cases/fourslash/renameStringLiteralTypes7.ts @@ -0,0 +1,13 @@ +/// + +////declare const Att_1: "Att 2"/**/ +//// +////interface Case_1 { +//// [Att_1]: string +////} +//// +////declare const fnc_1: (p: K) => void +//// +////fnc_1("Att 2") + +verify.baselineRename("", {}); diff --git a/tests/cases/fourslash/renameStringLiteralTypes8.ts b/tests/cases/fourslash/renameStringLiteralTypes8.ts new file mode 100644 index 0000000000000..0273d1c1dc95b --- /dev/null +++ b/tests/cases/fourslash/renameStringLiteralTypes8.ts @@ -0,0 +1,9 @@ +/// +////type T = { +//// "Prop 1"/**/: string; +////} +//// +////declare const fn: (p: K) => void +//// +////fn("Prop 1") +verify.baselineRename("", {}); \ No newline at end of file