From 46eaf62abb99800a8f9d8ce326852c13fa51e0ba Mon Sep 17 00:00:00 2001 From: Andy Hanson Date: Tue, 22 May 2018 12:20:34 -0700 Subject: [PATCH 1/2] getEditsForFileRename: Handle old file still being present --- src/harness/tsconfig.json | 1 + src/server/tsconfig.json | 1 + src/server/tsconfig.library.json | 1 + src/services/getEditsForFileRename.ts | 9 ++---- src/services/tsconfig.json | 1 + .../cases/fourslash/getEditsForFileRename.ts | 2 ++ ...tEditsForFileRename_oldFileStillPresent.ts | 32 +++++++++++++++++++ 7 files changed, 41 insertions(+), 6 deletions(-) create mode 100644 tests/cases/fourslash/getEditsForFileRename_oldFileStillPresent.ts diff --git a/src/harness/tsconfig.json b/src/harness/tsconfig.json index 359701a02cb..ba068cbc85a 100644 --- a/src/harness/tsconfig.json +++ b/src/harness/tsconfig.json @@ -63,6 +63,7 @@ "../services/documentRegistry.ts", "../services/importTracker.ts", "../services/findAllReferences.ts", + "../services/getEditsForFileRename.ts", "../services/goToDefinition.ts", "../services/jsDoc.ts", "../services/semver.ts", diff --git a/src/server/tsconfig.json b/src/server/tsconfig.json index 8ae6974baf0..f8ea769d92c 100644 --- a/src/server/tsconfig.json +++ b/src/server/tsconfig.json @@ -59,6 +59,7 @@ "../services/documentRegistry.ts", "../services/importTracker.ts", "../services/findAllReferences.ts", + "../services/getEditsForFileRename.ts", "../services/goToDefinition.ts", "../services/jsDoc.ts", "../services/semver.ts", diff --git a/src/server/tsconfig.library.json b/src/server/tsconfig.library.json index 922af11e879..8ba0a6edf62 100644 --- a/src/server/tsconfig.library.json +++ b/src/server/tsconfig.library.json @@ -65,6 +65,7 @@ "../services/documentRegistry.ts", "../services/importTracker.ts", "../services/findAllReferences.ts", + "../services/getEditsForFileRename.ts", "../services/goToDefinition.ts", "../services/jsDoc.ts", "../services/semver.ts", diff --git a/src/services/getEditsForFileRename.ts b/src/services/getEditsForFileRename.ts index d05d22a98d9..a1c74380f5e 100644 --- a/src/services/getEditsForFileRename.ts +++ b/src/services/getEditsForFileRename.ts @@ -31,23 +31,20 @@ namespace ts { } function getImportsToUpdate(program: Program, oldFilePath: string, host: LanguageServiceHost): ReadonlyArray { - const checker = program.getTypeChecker(); const result: ToUpdate[] = []; for (const sourceFile of program.getSourceFiles()) { for (const ref of sourceFile.referencedFiles) { - if (!program.getSourceFileFromReference(sourceFile, ref) && resolveTripleslashReference(ref.fileName, sourceFile.fileName) === oldFilePath) { + if (resolveTripleslashReference(ref.fileName, sourceFile.fileName) === oldFilePath) { result.push({ sourceFile, toUpdate: ref }); } } for (const importStringLiteral of sourceFile.imports) { - // If it resolved to something already, ignore. - if (checker.getSymbolAtLocation(importStringLiteral)) continue; - const resolved = host.resolveModuleNames ? host.getResolvedModuleWithFailedLookupLocationsFromCache && host.getResolvedModuleWithFailedLookupLocationsFromCache(importStringLiteral.text, sourceFile.fileName) : program.getResolvedModuleWithFailedLookupLocationsFromCache(importStringLiteral.text, sourceFile.fileName); - if (resolved && contains(resolved.failedLookupLocations, oldFilePath)) { + // We may or may not have picked up on the file being renamed, so maybe successfully resolved to oldFilePath, or maybe that's in failedLookupLocations + if (resolved && contains([resolved.resolvedModule && resolved.resolvedModule.resolvedFileName, ...resolved.failedLookupLocations], oldFilePath)) { result.push({ sourceFile, toUpdate: importStringLiteral }); } } diff --git a/src/services/tsconfig.json b/src/services/tsconfig.json index 7e1ccc9c3af..05d4831b08f 100644 --- a/src/services/tsconfig.json +++ b/src/services/tsconfig.json @@ -56,6 +56,7 @@ "documentRegistry.ts", "importTracker.ts", "findAllReferences.ts", + "getEditsForFileRename.ts", "goToDefinition.ts", "jsDoc.ts", "semver.ts", diff --git a/tests/cases/fourslash/getEditsForFileRename.ts b/tests/cases/fourslash/getEditsForFileRename.ts index f2694818d1d..8e53883b37e 100644 --- a/tests/cases/fourslash/getEditsForFileRename.ts +++ b/tests/cases/fourslash/getEditsForFileRename.ts @@ -1,5 +1,7 @@ /// +// See also `getEditsForFileRename_oldFileStillPresent.ts` + // @Filename: /a.ts /////// ////import old from "./src/old"; diff --git a/tests/cases/fourslash/getEditsForFileRename_oldFileStillPresent.ts b/tests/cases/fourslash/getEditsForFileRename_oldFileStillPresent.ts new file mode 100644 index 00000000000..c4ebf341a5e --- /dev/null +++ b/tests/cases/fourslash/getEditsForFileRename_oldFileStillPresent.ts @@ -0,0 +1,32 @@ +/// + +// Same test as `getEditsForFileRename.ts`, but with the old file not yet renamed. + +// @Filename: /src/old.ts +////stuff + +// @Filename: /a.ts +/////// +////import old from "./src/old"; + +// @Filename: /src/a.ts +/////// +////import old from "./old"; + +// @Filename: /src/foo/a.ts +/////// +////import old from "../old"; + +// @Filename: /tsconfig.json +////{ "files": ["/a.ts", "/src/a.ts", "/src/foo/a.ts", "/src/old.ts"] } + +verify.getEditsForFileRename({ + oldPath: "/src/old.ts", + newPath: "/src/new.ts", + newFileContents: { + "/a.ts": '/// \nimport old from "./src/new";', + "/src/a.ts": '/// \nimport old from "./new";', + "/src/foo/a.ts": '/// \nimport old from "../new";', + "/tsconfig.json": '{ "files": ["/a.ts", "/src/a.ts", "/src/foo/a.ts", "/src/new.ts"] }', + }, +}); From 900e269872d566422a63440e05205b0e620925ff Mon Sep 17 00:00:00 2001 From: Andy Hanson Date: Tue, 22 May 2018 13:39:30 -0700 Subject: [PATCH 2/2] Don't need to check failedLookupLocations if resolved successfully --- src/services/getEditsForFileRename.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/getEditsForFileRename.ts b/src/services/getEditsForFileRename.ts index a1c74380f5e..b35e73a5ce0 100644 --- a/src/services/getEditsForFileRename.ts +++ b/src/services/getEditsForFileRename.ts @@ -44,7 +44,7 @@ namespace ts { ? host.getResolvedModuleWithFailedLookupLocationsFromCache && host.getResolvedModuleWithFailedLookupLocationsFromCache(importStringLiteral.text, sourceFile.fileName) : program.getResolvedModuleWithFailedLookupLocationsFromCache(importStringLiteral.text, sourceFile.fileName); // We may or may not have picked up on the file being renamed, so maybe successfully resolved to oldFilePath, or maybe that's in failedLookupLocations - if (resolved && contains([resolved.resolvedModule && resolved.resolvedModule.resolvedFileName, ...resolved.failedLookupLocations], oldFilePath)) { + if (resolved && contains(resolved.resolvedModule ? [resolved.resolvedModule.resolvedFileName] : resolved.failedLookupLocations, oldFilePath)) { result.push({ sourceFile, toUpdate: importStringLiteral }); } }