diff --git a/src/services/findAllReferences.ts b/src/services/findAllReferences.ts index 4ff456f685bb6..06aea522ce9be 100644 --- a/src/services/findAllReferences.ts +++ b/src/services/findAllReferences.ts @@ -163,6 +163,7 @@ import { isParameterPropertyDeclaration, isPrivateIdentifierClassElementDeclaration, isPropertyAccessExpression, + isPropertySignature, isQualifiedName, isReferencedFile, isReferenceFileLocation, @@ -2471,7 +2472,7 @@ export namespace Core { if (isStringLiteralLike(ref) && ref.text === node.text) { if (type) { const refType = getContextualTypeFromParentOrAncestorTypeNode(ref, checker); - if (type !== checker.getStringType() && type === refType) { + if (type !== checker.getStringType() && (type === refType || isStringLiteralPropertyReference(ref, checker))) { return nodeEntry(ref, EntryKind.StringLiteral); } } @@ -2489,6 +2490,12 @@ export namespace Core { }]; } + function isStringLiteralPropertyReference(node: StringLiteralLike, checker: TypeChecker) { + if (isPropertySignature(node.parent)) { + return checker.getPropertyOfType(checker.getTypeAtLocation(node.parent.parent), node.text); + } + } + // For certain symbol kinds, we need to include other symbols in the search set. // This is not needed when searching for re-exports. function populateSearchSymbolSet(symbol: Symbol, location: Node, checker: TypeChecker, isForRename: boolean, providePrefixAndSuffixText: boolean, implementations: boolean): Symbol[] { diff --git a/tests/baselines/reference/renameStringLiteralTypes4.baseline.jsonc b/tests/baselines/reference/renameStringLiteralTypes4.baseline.jsonc new file mode 100644 index 0000000000000..d6095159aedb1 --- /dev/null +++ b/tests/baselines/reference/renameStringLiteralTypes4.baseline.jsonc @@ -0,0 +1,9 @@ +// === findRenameLocations === +// === /tests/cases/fourslash/renameStringLiteralTypes4.ts === +// interface I { +// <|"[|Prop 1RENAME|]": string;|> +// } +// +// declare const fn: (p: K) => void +// +// fn("[|Prop 1RENAME|]"/*RENAME*/) \ No newline at end of file diff --git a/tests/baselines/reference/renameStringLiteralTypes5.baseline.jsonc b/tests/baselines/reference/renameStringLiteralTypes5.baseline.jsonc new file mode 100644 index 0000000000000..3cb3e208e34b1 --- /dev/null +++ b/tests/baselines/reference/renameStringLiteralTypes5.baseline.jsonc @@ -0,0 +1,9 @@ +// === findRenameLocations === +// === /tests/cases/fourslash/renameStringLiteralTypes5.ts === +// type T = { +// <|"[|Prop 1RENAME|]": string;|> +// } +// +// declare const fn: (p: K) => void +// +// fn("[|Prop 1RENAME|]"/*RENAME*/) \ No newline at end of file diff --git a/tests/cases/fourslash/renameStringLiteralTypes4.ts b/tests/cases/fourslash/renameStringLiteralTypes4.ts new file mode 100644 index 0000000000000..8ac01df18dc57 --- /dev/null +++ b/tests/cases/fourslash/renameStringLiteralTypes4.ts @@ -0,0 +1,11 @@ +/// + +////interface I { +//// "Prop 1": string; +////} +//// +////declare const fn: (p: K) => void +//// +////fn("Prop 1"/**/) + +verify.baselineRename("", {}); diff --git a/tests/cases/fourslash/renameStringLiteralTypes5.ts b/tests/cases/fourslash/renameStringLiteralTypes5.ts new file mode 100644 index 0000000000000..aa40b656e57e3 --- /dev/null +++ b/tests/cases/fourslash/renameStringLiteralTypes5.ts @@ -0,0 +1,11 @@ +/// + +////type T = { +//// "Prop 1": string; +////} +//// +////declare const fn: (p: K) => void +//// +////fn("Prop 1"/**/) + +verify.baselineRename("", {});