diff --git a/src/harness/tsconfig.json b/src/harness/tsconfig.json index 08b8acadc93..102bddf91c7 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 806721c9c56..79cd76fc2c0 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 cabcd8ff104..57f6862cd6f 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 7c71f9a6ed8..1726f5e0681 100644 --- a/src/services/getEditsForFileRename.ts +++ b/src/services/getEditsForFileRename.ts @@ -32,23 +32,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 960e46fb367..2aabfdcd6a3 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"] }', + }, +});