From ccfbb677172217a555370f08c2bef27a08449378 Mon Sep 17 00:00:00 2001 From: kingwl Date: Sat, 27 Jun 2020 20:38:40 +0800 Subject: [PATCH 1/7] add basicly support for rename string literal type --- src/services/findAllReferences.ts | 30 ++++++++++++------- src/services/rename.ts | 13 +++++++- src/services/utilities.ts | 14 +++++++++ .../cases/fourslash/renameStringLiteralOk.ts | 10 +++++++ .../fourslash/renameStringLiteralTypes.ts | 2 +- 5 files changed, 56 insertions(+), 13 deletions(-) create mode 100644 tests/cases/fourslash/renameStringLiteralOk.ts diff --git a/src/services/findAllReferences.ts b/src/services/findAllReferences.ts index 05d85fb708705..760f2ad28f531 100644 --- a/src/services/findAllReferences.ts +++ b/src/services/findAllReferences.ts @@ -620,7 +620,7 @@ namespace ts.FindAllReferences { // Could not find a symbol e.g. unknown identifier if (!symbol) { // String literal might be a property (and thus have a symbol), so do this here rather than in getReferencedSymbolsSpecial. - return !options.implementations && isStringLiteral(node) ? getReferencesForStringLiteral(node, sourceFiles, cancellationToken) : undefined; + return !options.implementations && isStringLiteral(node) ? getReferencesForStringLiteral(node, sourceFiles, checker, cancellationToken) : undefined; } if (symbol.escapedName === InternalSymbolName.ExportEquals) { @@ -768,7 +768,7 @@ namespace ts.FindAllReferences { // At `module.exports = ...`, reference node is `module` const node = isBinaryExpression(decl) && isPropertyAccessExpression(decl.left) ? decl.left.expression : isExportAssignment(decl) ? Debug.checkDefined(findChildOfKind(decl, SyntaxKind.ExportKeyword, sourceFile)) : - getNameOfDeclaration(decl) || decl; + getNameOfDeclaration(decl) || decl; references.push(nodeEntry(node)); } } @@ -880,7 +880,7 @@ namespace ts.FindAllReferences { Debug.assert(node.parent.name === node); return SpecialSearchKind.Class; } - // falls through + // falls through default: return SpecialSearchKind.None; } @@ -1833,7 +1833,7 @@ namespace ts.FindAllReferences { if (isObjectLiteralMethod(searchSpaceNode)) { break; } - // falls through + // falls through case SyntaxKind.PropertyDeclaration: case SyntaxKind.PropertySignature: case SyntaxKind.Constructor: @@ -1846,7 +1846,7 @@ namespace ts.FindAllReferences { if (isExternalModule(searchSpaceNode) || isParameterName(thisOrSuperKeyword)) { return undefined; } - // falls through + // falls through case SyntaxKind.FunctionDeclaration: case SyntaxKind.FunctionExpression: break; @@ -1888,11 +1888,19 @@ namespace ts.FindAllReferences { }]; } - function getReferencesForStringLiteral(node: StringLiteral, sourceFiles: readonly SourceFile[], cancellationToken: CancellationToken): SymbolAndEntries[] { + function getReferencesForStringLiteral(node: StringLiteral, sourceFiles: readonly SourceFile[], checker: TypeChecker, cancellationToken: CancellationToken): SymbolAndEntries[] { + const type = getContextualTypeOrAtAncestorTypeNode(node, checker); const references = flatMap(sourceFiles, sourceFile => { cancellationToken.throwIfCancellationRequested(); - return mapDefined(getPossibleSymbolReferenceNodes(sourceFile, node.text), ref => - isStringLiteral(ref) && ref.text === node.text ? nodeEntry(ref, EntryKind.StringLiteral) : undefined); + return mapDefined(getPossibleSymbolReferenceNodes(sourceFile, node.text), ref => { + if (type && isStringLiteral(ref) && ref.text === node.text) { + const refType = getContextualTypeOrAtAncestorTypeNode(ref, checker); + if (type !== checker.getStringType() && type === refType) { + return nodeEntry(ref, EntryKind.StringLiteral); + } + } + return undefined; + }); }); return [{ @@ -1907,7 +1915,7 @@ namespace ts.FindAllReferences { const result: Symbol[] = []; forEachRelatedSymbol(symbol, location, checker, isForRename, !(isForRename && providePrefixAndSuffixText), (sym, root, base) => { result.push(base || root || sym); }, - /*allowBaseTypes*/ () => !implementations); + /*allowBaseTypes*/() => !implementations); return result; } @@ -2081,8 +2089,8 @@ namespace ts.FindAllReferences { function isImplementation(node: Node): boolean { return !!(node.flags & NodeFlags.Ambient) ? !(isInterfaceDeclaration(node) || isTypeAliasDeclaration(node)) : (isVariableLike(node) ? hasInitializer(node) : - isFunctionLikeDeclaration(node) ? !!node.body : - isClassLike(node) || isModuleOrEnumDeclaration(node)); + isFunctionLikeDeclaration(node) ? !!node.body : + isClassLike(node) || isModuleOrEnumDeclaration(node)); } export function getReferenceEntriesForShorthandPropertyAssignment(node: Node, checker: TypeChecker, addReference: (node: Node) => void): void { diff --git a/src/services/rename.ts b/src/services/rename.ts index 4cdb4f14dc857..6e7a8112e2b0e 100644 --- a/src/services/rename.ts +++ b/src/services/rename.ts @@ -13,7 +13,18 @@ namespace ts.Rename { function getRenameInfoForNode(node: Node, typeChecker: TypeChecker, sourceFile: SourceFile, isDefinedInLibraryFile: (declaration: Node) => boolean, options?: RenameInfoOptions): RenameInfo | undefined { const symbol = typeChecker.getSymbolAtLocation(node); - if (!symbol) return; + if (!symbol) { + if (isStringLiteralLike(node)) { + const type = getContextualTypeOrAtAncestorTypeNode(node, typeChecker); + if (type && ((type.flags & TypeFlags.StringLiteral) || ( + (type.flags & TypeFlags.Union) && every((type as UnionType).types, type => !!(type.flags & TypeFlags.StringLiteral)) + ))) { + return getRenameInfoSuccess(node.text, node.text, ScriptElementKind.string, "", node, sourceFile); + } + } + return; + }; + // Only allow a symbol to be renamed if it actually has at least one declaration. const { declarations } = symbol; if (!declarations || declarations.length === 0) return; diff --git a/src/services/utilities.ts b/src/services/utilities.ts index d3b96994f61e9..74b8ffe4f6aa3 100644 --- a/src/services/utilities.ts +++ b/src/services/utilities.ts @@ -771,6 +771,20 @@ namespace ts { } } + function getAncestorTypeNode(node: Node) { + return findAncestor(node, a => !isQualifiedName(a.parent) && !isTypeNode(a.parent) && !isTypeElement(a.parent)); + } + + export function getContextualTypeOrAtAncestorTypeNode(node: Expression, checker: TypeChecker) { + const contextualType = checker.getContextualType(node); + if (contextualType) { + return contextualType; + } + + const ancestorTypeNode = getAncestorTypeNode(node); + return ancestorTypeNode && checker.getTypeAtLocation(ancestorTypeNode); + } + function getAdjustedLocationForDeclaration(node: Node, forRename: boolean) { if (!forRename) { switch (node.kind) { diff --git a/tests/cases/fourslash/renameStringLiteralOk.ts b/tests/cases/fourslash/renameStringLiteralOk.ts new file mode 100644 index 0000000000000..4f735d98961ea --- /dev/null +++ b/tests/cases/fourslash/renameStringLiteralOk.ts @@ -0,0 +1,10 @@ +/// + +//// interface Foo { +//// f: '[|foo|]' | 'bar' +//// } +//// const d: 'foo' = 'foo' +//// declare const f: Foo +//// f.f = '[|foo|]' + +verify.rangesWithSameTextAreRenameLocations("foo"); diff --git a/tests/cases/fourslash/renameStringLiteralTypes.ts b/tests/cases/fourslash/renameStringLiteralTypes.ts index ef2b7bb76adc9..294d0fc260893 100644 --- a/tests/cases/fourslash/renameStringLiteralTypes.ts +++ b/tests/cases/fourslash/renameStringLiteralTypes.ts @@ -11,4 +11,4 @@ //// ////animate({ deltaX: 100, deltaY: 100, easing: "[|ease-in-out|]" }); -goTo.eachRange(() => { verify.renameInfoFailed(); }); +verify.rangesWithSameTextAreRenameLocations("ease-in-out"); From 5a937eb572efdc4cb0f0866e8a394bc19a14b31d Mon Sep 17 00:00:00 2001 From: kingwl Date: Thu, 23 Jul 2020 15:25:03 +0800 Subject: [PATCH 2/7] fix merge conflict --- src/services/findAllReferences.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/services/findAllReferences.ts b/src/services/findAllReferences.ts index f1b8f427ecf47..fe18ed9722db0 100644 --- a/src/services/findAllReferences.ts +++ b/src/services/findAllReferences.ts @@ -1915,9 +1915,6 @@ namespace ts.FindAllReferences { function populateSearchSymbolSet(symbol: Symbol, location: Node, checker: TypeChecker, isForRename: boolean, providePrefixAndSuffixText: boolean, implementations: boolean): Symbol[] { const result: Symbol[] = []; forEachRelatedSymbol(symbol, location, checker, isForRename, !(isForRename && providePrefixAndSuffixText), -<<<<<<< HEAD - (sym, root, base) => { result.push(base || root || sym); }, -======= (sym, root, base) => { // static method/property and instance method/property might have the same name. Only include static or only include instance. if (base) { @@ -1928,7 +1925,6 @@ namespace ts.FindAllReferences { result.push(base || root || sym); }, // when try to find implementation, implementations is true, and not allowed to find base class ->>>>>>> master /*allowBaseTypes*/() => !implementations); return result; } From 05f54f68e7fd3802fc5b41e0fb8dbb18a4b47300 Mon Sep 17 00:00:00 2001 From: kingwl Date: Thu, 3 Sep 2020 14:39:28 +0800 Subject: [PATCH 3/7] fix some behavior --- src/services/findAllReferences.ts | 4 ++-- src/services/rename.ts | 2 +- src/services/utilities.ts | 11 +++++++++-- .../cases/fourslash/renameStringLiteralOk1.ts | 18 ++++++++++++++++++ 4 files changed, 30 insertions(+), 5 deletions(-) create mode 100644 tests/cases/fourslash/renameStringLiteralOk1.ts diff --git a/src/services/findAllReferences.ts b/src/services/findAllReferences.ts index fe18ed9722db0..3454406c1dfc0 100644 --- a/src/services/findAllReferences.ts +++ b/src/services/findAllReferences.ts @@ -1890,12 +1890,12 @@ namespace ts.FindAllReferences { } function getReferencesForStringLiteral(node: StringLiteral, sourceFiles: readonly SourceFile[], checker: TypeChecker, cancellationToken: CancellationToken): SymbolAndEntries[] { - const type = getContextualTypeOrAtAncestorTypeNode(node, checker); + const type = getContextualTypeOrAncestorTypeNodeType(node, checker); const references = flatMap(sourceFiles, sourceFile => { cancellationToken.throwIfCancellationRequested(); return mapDefined(getPossibleSymbolReferenceNodes(sourceFile, node.text), ref => { if (type && isStringLiteral(ref) && ref.text === node.text) { - const refType = getContextualTypeOrAtAncestorTypeNode(ref, checker); + const refType = getContextualTypeOrAncestorTypeNodeType(ref, checker); if (type !== checker.getStringType() && type === refType) { return nodeEntry(ref, EntryKind.StringLiteral); } diff --git a/src/services/rename.ts b/src/services/rename.ts index 3f07f9b9af185..59efe2f7a209c 100644 --- a/src/services/rename.ts +++ b/src/services/rename.ts @@ -15,7 +15,7 @@ namespace ts.Rename { const symbol = typeChecker.getSymbolAtLocation(node); if (!symbol) { if (isStringLiteralLike(node)) { - const type = getContextualTypeOrAtAncestorTypeNode(node, typeChecker); + const type = getContextualTypeOrAncestorTypeNodeType(node, typeChecker); if (type && ((type.flags & TypeFlags.StringLiteral) || ( (type.flags & TypeFlags.Union) && every((type as UnionType).types, type => !!(type.flags & TypeFlags.StringLiteral)) ))) { diff --git a/src/services/utilities.ts b/src/services/utilities.ts index ca0d551da772e..8f180ed788468 100644 --- a/src/services/utilities.ts +++ b/src/services/utilities.ts @@ -772,10 +772,17 @@ namespace ts { } function getAncestorTypeNode(node: Node) { - return findAncestor(node, a => !isQualifiedName(a.parent) && !isTypeNode(a.parent) && !isTypeElement(a.parent)); + let lastTypeNode: TypeNode | undefined; + findAncestor(node, a => { + if (isTypeNode(a)) { + lastTypeNode = a; + } + return !isQualifiedName(a.parent) && !isTypeNode(a.parent) && !isTypeElement(a.parent); + }); + return lastTypeNode; } - export function getContextualTypeOrAtAncestorTypeNode(node: Expression, checker: TypeChecker) { + export function getContextualTypeOrAncestorTypeNodeType(node: Expression, checker: TypeChecker) { const contextualType = checker.getContextualType(node); if (contextualType) { return contextualType; diff --git a/tests/cases/fourslash/renameStringLiteralOk1.ts b/tests/cases/fourslash/renameStringLiteralOk1.ts new file mode 100644 index 0000000000000..a6b0047d72d1e --- /dev/null +++ b/tests/cases/fourslash/renameStringLiteralOk1.ts @@ -0,0 +1,18 @@ +/// + +//// declare function f(): '[|foo|]' | 'bar' +//// class Foo { +//// f = f() +//// } +//// const d: 'foo' = 'foo' +//// declare const ff: Foo +//// ff.f = '[|foo|]' + +verify.rangesWithSameTextAreRenameLocations("foo"); + +interface Foo { + f: 'foo' | 'bar' +} +const d: 'foo' = 'foo' +declare const f: Foo +f.f = 'foo' \ No newline at end of file From c8ccc2228499ff454c71ec33ecb580448780822c Mon Sep 17 00:00:00 2001 From: TypeScript Bot Date: Wed, 9 Sep 2020 06:05:38 +0000 Subject: [PATCH 4/7] Update package-lock.json --- package-lock.json | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/package-lock.json b/package-lock.json index ea077489e3047..ba81347f672d7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -290,9 +290,9 @@ } }, "@octokit/plugin-paginate-rest": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.3.1.tgz", - "integrity": "sha512-81A+ONLpcSX7vWxnEmVZteQPNsbdeScSVUqjgMYPSk1trzG69iYkhS42wPRWtN0nYw6OEmT48DNeQCjHeyroYw==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.3.2.tgz", + "integrity": "sha512-PjHbMhKryxClCrmfvRpGaKCTxUcHIf2zirWRV9SMGf0EmxD/rFew/abSqbMiLl9uQgRZvqtTyCRMGMlUv1ZsBg==", "dev": true, "requires": { "@octokit/types": "^5.3.0" @@ -305,12 +305,12 @@ "dev": true }, "@octokit/plugin-rest-endpoint-methods": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-4.1.3.tgz", - "integrity": "sha512-az3seq9yuc0OXlNLrZ0fWTNbFuL4sN8GN1sLmovELg3+LnpWmOs3GAn2KGa6E7SKMgpCuFvJwvsHEfYasTHUxQ==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-4.1.4.tgz", + "integrity": "sha512-Y2tVpSa7HjV3DGIQrQOJcReJ2JtcN9FaGr9jDa332Flro923/h3/Iu9e7Y4GilnzfLclHEh5iCQoCkHm7tWOcg==", "dev": true, "requires": { - "@octokit/types": "^5.1.1", + "@octokit/types": "^5.4.1", "deprecation": "^2.3.1" } }, @@ -342,15 +342,15 @@ } }, "@octokit/rest": { - "version": "18.0.4", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-18.0.4.tgz", - "integrity": "sha512-l4PspvLvBG+bTDsji+XceDWuIf7qAZHLljbqJZ6UDdtACkW+MuFsprXicV5pEFAkxfPusyVDDPYJKRY1KJb7Zg==", + "version": "18.0.5", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-18.0.5.tgz", + "integrity": "sha512-SPKI24tQXrr1XsnaIjv2x0rl4M5eF1+hj8+vMe3d/exZ7NnL5sTe1BuFyCyJyrc+j1HkXankvgGN9zT0rwBwtg==", "dev": true, "requires": { "@octokit/core": "^3.0.0", "@octokit/plugin-paginate-rest": "^2.2.0", "@octokit/plugin-request-log": "^1.0.0", - "@octokit/plugin-rest-endpoint-methods": "4.1.3" + "@octokit/plugin-rest-endpoint-methods": "4.1.4" } }, "@octokit/types": { @@ -542,9 +542,9 @@ "dev": true }, "@types/node": { - "version": "14.6.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.6.2.tgz", - "integrity": "sha512-onlIwbaeqvZyniGPfdw/TEhKIh79pz66L1q06WUQqJLnAb6wbjvOtepLYTGHTqzdXgBYIE3ZdmqHDGsRsbBz7A==", + "version": "14.6.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.6.4.tgz", + "integrity": "sha512-Wk7nG1JSaMfMpoMJDKUsWYugliB2Vy55pdjLpmLixeyMi7HizW2I/9QoxsPCkXl3dO+ZOVqPumKaDUv5zJu2uQ==", "dev": true }, "@types/node-fetch": { @@ -7867,9 +7867,9 @@ "dev": true }, "uglify-js": { - "version": "3.10.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.10.3.tgz", - "integrity": "sha512-Lh00i69Uf6G74mvYpHCI9KVVXLcHW/xu79YTvH7Mkc9zyKUeSPz0owW0dguj0Scavns3ZOh3wY63J0Zb97Za2g==", + "version": "3.10.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.10.4.tgz", + "integrity": "sha512-kBFT3U4Dcj4/pJ52vfjCSfyLyvG9VYYuGYPmrPvAxRw/i7xHiT4VvCev+uiEMcEEiu6UNB6KgWmGtSUYIWScbw==", "dev": true, "optional": true }, From bb3b0cddf358899ba4d59e6db8bdac4c81309769 Mon Sep 17 00:00:00 2001 From: TypeScript Bot Date: Thu, 10 Sep 2020 06:05:34 +0000 Subject: [PATCH 5/7] Update package-lock.json --- package-lock.json | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index ba81347f672d7..4bbf42cf450b9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -268,20 +268,28 @@ } }, "@octokit/endpoint": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.5.tgz", - "integrity": "sha512-70K5u6zd45ItOny6aHQAsea8HHQjlQq85yqOMe+Aj8dkhN2qSJ9T+Q3YjUjEYfPRBcuUWNgMn62DQnP/4LAIiQ==", + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.6.tgz", + "integrity": "sha512-7Cc8olaCoL/mtquB7j/HTbPM+sY6Ebr4k2X2y4JoXpVKQ7r5xB4iGQE0IoO58wIPsUk4AzoT65AMEpymSbWTgQ==", "dev": true, "requires": { "@octokit/types": "^5.0.0", - "is-plain-object": "^4.0.0", + "is-plain-object": "^5.0.0", "universal-user-agent": "^6.0.0" + }, + "dependencies": { + "is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true + } } }, "@octokit/graphql": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.5.4.tgz", - "integrity": "sha512-ITpZ+dQc0cXAW1FmDkHJJM+8Lb6anUnin0VB5hLBilnYVdLC0ICFU/KIvT7OXfW9S81DE3U4Vx2EypDG1OYaPA==", + "version": "4.5.5", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.5.5.tgz", + "integrity": "sha512-hi4lvdXTU8AsMMxnwBvi/aDZbbCohM46/kZjePQce+gkfbAseCP1D8tdHPszQ5j1bDALzgazCLMeF/dzqaiA/g==", "dev": true, "requires": { "@octokit/request": "^5.3.0", @@ -290,9 +298,9 @@ } }, "@octokit/plugin-paginate-rest": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.3.2.tgz", - "integrity": "sha512-PjHbMhKryxClCrmfvRpGaKCTxUcHIf2zirWRV9SMGf0EmxD/rFew/abSqbMiLl9uQgRZvqtTyCRMGMlUv1ZsBg==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.3.3.tgz", + "integrity": "sha512-pYU1sHau3CzcYIC6K5tvxsGjVfxBWcG9fcDPj7k8lUCzwXD2YJFoIPCrbsxWd/rc1lnyNVKgCkwdk3Kbm36z9Q==", "dev": true, "requires": { "@octokit/types": "^5.3.0" From a3aa3362ba2c4db7e904f84d280c05055b319403 Mon Sep 17 00:00:00 2001 From: kingwl Date: Mon, 14 Sep 2020 15:10:18 +0800 Subject: [PATCH 6/7] do not break old behavior if not type checked --- src/services/findAllReferences.ts | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/services/findAllReferences.ts b/src/services/findAllReferences.ts index 3454406c1dfc0..9bb4cc9c40063 100644 --- a/src/services/findAllReferences.ts +++ b/src/services/findAllReferences.ts @@ -1894,13 +1894,17 @@ namespace ts.FindAllReferences { const references = flatMap(sourceFiles, sourceFile => { cancellationToken.throwIfCancellationRequested(); return mapDefined(getPossibleSymbolReferenceNodes(sourceFile, node.text), ref => { - if (type && isStringLiteral(ref) && ref.text === node.text) { - const refType = getContextualTypeOrAncestorTypeNodeType(ref, checker); - if (type !== checker.getStringType() && type === refType) { + if (isStringLiteral(ref) && ref.text === node.text) { + if (type) { + const refType = getContextualTypeOrAncestorTypeNodeType(ref, checker); + if (type !== checker.getStringType() && type === refType) { + return nodeEntry(ref, EntryKind.StringLiteral); + } + } + else { return nodeEntry(ref, EntryKind.StringLiteral); } } - return undefined; }); }); From e6086b1aa1329b25f4049e4ea7218767d136437e Mon Sep 17 00:00:00 2001 From: kingwl Date: Wed, 23 Sep 2020 22:24:22 +0800 Subject: [PATCH 7/7] fix cr issue --- package-lock.json | 8 -------- src/services/findAllReferences.ts | 20 +++++++++---------- .../cases/fourslash/renameStringLiteralOk.ts | 1 + 3 files changed, 11 insertions(+), 18 deletions(-) diff --git a/package-lock.json b/package-lock.json index b57c339710d95..8906cb88f5d86 100644 --- a/package-lock.json +++ b/package-lock.json @@ -276,14 +276,6 @@ "@octokit/types": "^5.0.0", "is-plain-object": "^5.0.0", "universal-user-agent": "^6.0.0" - }, - "dependencies": { - "is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true - } } }, "@octokit/graphql": { diff --git a/src/services/findAllReferences.ts b/src/services/findAllReferences.ts index 9bb4cc9c40063..953fafe3c91a7 100644 --- a/src/services/findAllReferences.ts +++ b/src/services/findAllReferences.ts @@ -11,7 +11,7 @@ namespace ts.FindAllReferences { | { readonly type: DefinitionKind.Label; readonly node: Identifier } | { readonly type: DefinitionKind.Keyword; readonly node: Node } | { readonly type: DefinitionKind.This; readonly node: Node } - | { readonly type: DefinitionKind.String; readonly node: StringLiteral }; + | { readonly type: DefinitionKind.String; readonly node: StringLiteralLike }; export const enum EntryKind { Span, Node, StringLiteral, SearchedLocalFoundProperty, SearchedPropertyFoundLocal } export type NodeEntryKind = EntryKind.Node | EntryKind.StringLiteral | EntryKind.SearchedLocalFoundProperty | EntryKind.SearchedPropertyFoundLocal; @@ -621,7 +621,7 @@ namespace ts.FindAllReferences { // Could not find a symbol e.g. unknown identifier if (!symbol) { // String literal might be a property (and thus have a symbol), so do this here rather than in getReferencedSymbolsSpecial. - return !options.implementations && isStringLiteral(node) ? getReferencesForStringLiteral(node, sourceFiles, checker, cancellationToken) : undefined; + return !options.implementations && isStringLiteralLike(node) ? getReferencesForStringLiteral(node, sourceFiles, checker, cancellationToken) : undefined; } if (symbol.escapedName === InternalSymbolName.ExportEquals) { @@ -769,7 +769,7 @@ namespace ts.FindAllReferences { // At `module.exports = ...`, reference node is `module` const node = isBinaryExpression(decl) && isPropertyAccessExpression(decl.left) ? decl.left.expression : isExportAssignment(decl) ? Debug.checkDefined(findChildOfKind(decl, SyntaxKind.ExportKeyword, sourceFile)) : - getNameOfDeclaration(decl) || decl; + getNameOfDeclaration(decl) || decl; references.push(nodeEntry(node)); } } @@ -881,7 +881,7 @@ namespace ts.FindAllReferences { Debug.assert(node.parent.name === node); return SpecialSearchKind.Class; } - // falls through + // falls through default: return SpecialSearchKind.None; } @@ -1834,7 +1834,7 @@ namespace ts.FindAllReferences { if (isObjectLiteralMethod(searchSpaceNode)) { break; } - // falls through + // falls through case SyntaxKind.PropertyDeclaration: case SyntaxKind.PropertySignature: case SyntaxKind.Constructor: @@ -1847,7 +1847,7 @@ namespace ts.FindAllReferences { if (isExternalModule(searchSpaceNode) || isParameterName(thisOrSuperKeyword)) { return undefined; } - // falls through + // falls through case SyntaxKind.FunctionDeclaration: case SyntaxKind.FunctionExpression: break; @@ -1889,12 +1889,12 @@ namespace ts.FindAllReferences { }]; } - function getReferencesForStringLiteral(node: StringLiteral, sourceFiles: readonly SourceFile[], checker: TypeChecker, cancellationToken: CancellationToken): SymbolAndEntries[] { + function getReferencesForStringLiteral(node: StringLiteralLike, sourceFiles: readonly SourceFile[], checker: TypeChecker, cancellationToken: CancellationToken): SymbolAndEntries[] { const type = getContextualTypeOrAncestorTypeNodeType(node, checker); const references = flatMap(sourceFiles, sourceFile => { cancellationToken.throwIfCancellationRequested(); return mapDefined(getPossibleSymbolReferenceNodes(sourceFile, node.text), ref => { - if (isStringLiteral(ref) && ref.text === node.text) { + if (isStringLiteralLike(ref) && ref.text === node.text) { if (type) { const refType = getContextualTypeOrAncestorTypeNodeType(ref, checker); if (type !== checker.getStringType() && type === refType) { @@ -2126,8 +2126,8 @@ namespace ts.FindAllReferences { function isImplementation(node: Node): boolean { return !!(node.flags & NodeFlags.Ambient) ? !(isInterfaceDeclaration(node) || isTypeAliasDeclaration(node)) : (isVariableLike(node) ? hasInitializer(node) : - isFunctionLikeDeclaration(node) ? !!node.body : - isClassLike(node) || isModuleOrEnumDeclaration(node)); + isFunctionLikeDeclaration(node) ? !!node.body : + isClassLike(node) || isModuleOrEnumDeclaration(node)); } export function getReferenceEntriesForShorthandPropertyAssignment(node: Node, checker: TypeChecker, addReference: (node: Node) => void): void { diff --git a/tests/cases/fourslash/renameStringLiteralOk.ts b/tests/cases/fourslash/renameStringLiteralOk.ts index 4f735d98961ea..7b8bdc5a18f15 100644 --- a/tests/cases/fourslash/renameStringLiteralOk.ts +++ b/tests/cases/fourslash/renameStringLiteralOk.ts @@ -6,5 +6,6 @@ //// const d: 'foo' = 'foo' //// declare const f: Foo //// f.f = '[|foo|]' +//// f.f = `[|foo|]` verify.rangesWithSameTextAreRenameLocations("foo");