Skip to content

Commit dd6dc5e

Browse files
authored
Merge pull request microsoft#24328 from Microsoft/getEditsForFileRename_oldFileStillPresent
getEditsForFileRename: Handle old file still being present
2 parents b61d485 + 900e269 commit dd6dc5e

File tree

7 files changed

+41
-6
lines changed

7 files changed

+41
-6
lines changed

src/harness/tsconfig.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@
6363
"../services/documentRegistry.ts",
6464
"../services/importTracker.ts",
6565
"../services/findAllReferences.ts",
66+
"../services/getEditsForFileRename.ts",
6667
"../services/goToDefinition.ts",
6768
"../services/jsDoc.ts",
6869
"../services/semver.ts",

src/server/tsconfig.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@
5959
"../services/documentRegistry.ts",
6060
"../services/importTracker.ts",
6161
"../services/findAllReferences.ts",
62+
"../services/getEditsForFileRename.ts",
6263
"../services/goToDefinition.ts",
6364
"../services/jsDoc.ts",
6465
"../services/semver.ts",

src/server/tsconfig.library.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@
6565
"../services/documentRegistry.ts",
6666
"../services/importTracker.ts",
6767
"../services/findAllReferences.ts",
68+
"../services/getEditsForFileRename.ts",
6869
"../services/goToDefinition.ts",
6970
"../services/jsDoc.ts",
7071
"../services/semver.ts",

src/services/getEditsForFileRename.ts

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,23 +32,20 @@ namespace ts {
3232
}
3333

3434
function getImportsToUpdate(program: Program, oldFilePath: string, host: LanguageServiceHost): ReadonlyArray<ToUpdate> {
35-
const checker = program.getTypeChecker();
3635
const result: ToUpdate[] = [];
3736
for (const sourceFile of program.getSourceFiles()) {
3837
for (const ref of sourceFile.referencedFiles) {
39-
if (!program.getSourceFileFromReference(sourceFile, ref) && resolveTripleslashReference(ref.fileName, sourceFile.fileName) === oldFilePath) {
38+
if (resolveTripleslashReference(ref.fileName, sourceFile.fileName) === oldFilePath) {
4039
result.push({ sourceFile, toUpdate: ref });
4140
}
4241
}
4342

4443
for (const importStringLiteral of sourceFile.imports) {
45-
// If it resolved to something already, ignore.
46-
if (checker.getSymbolAtLocation(importStringLiteral)) continue;
47-
4844
const resolved = host.resolveModuleNames
4945
? host.getResolvedModuleWithFailedLookupLocationsFromCache && host.getResolvedModuleWithFailedLookupLocationsFromCache(importStringLiteral.text, sourceFile.fileName)
5046
: program.getResolvedModuleWithFailedLookupLocationsFromCache(importStringLiteral.text, sourceFile.fileName);
51-
if (resolved && contains(resolved.failedLookupLocations, oldFilePath)) {
47+
// 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
48+
if (resolved && contains(resolved.resolvedModule ? [resolved.resolvedModule.resolvedFileName] : resolved.failedLookupLocations, oldFilePath)) {
5249
result.push({ sourceFile, toUpdate: importStringLiteral });
5350
}
5451
}

src/services/tsconfig.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
"documentRegistry.ts",
5757
"importTracker.ts",
5858
"findAllReferences.ts",
59+
"getEditsForFileRename.ts",
5960
"goToDefinition.ts",
6061
"jsDoc.ts",
6162
"semver.ts",

tests/cases/fourslash/getEditsForFileRename.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
/// <reference path='fourslash.ts' />
22

3+
// See also `getEditsForFileRename_oldFileStillPresent.ts`
4+
35
// @Filename: /a.ts
46
/////// <reference path="./src/old.ts" />
57
////import old from "./src/old";
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
/// <reference path='fourslash.ts' />
2+
3+
// Same test as `getEditsForFileRename.ts`, but with the old file not yet renamed.
4+
5+
// @Filename: /src/old.ts
6+
////stuff
7+
8+
// @Filename: /a.ts
9+
/////// <reference path="./src/old.ts" />
10+
////import old from "./src/old";
11+
12+
// @Filename: /src/a.ts
13+
/////// <reference path="./old.ts" />
14+
////import old from "./old";
15+
16+
// @Filename: /src/foo/a.ts
17+
/////// <reference path="../old.ts" />
18+
////import old from "../old";
19+
20+
// @Filename: /tsconfig.json
21+
////{ "files": ["/a.ts", "/src/a.ts", "/src/foo/a.ts", "/src/old.ts"] }
22+
23+
verify.getEditsForFileRename({
24+
oldPath: "/src/old.ts",
25+
newPath: "/src/new.ts",
26+
newFileContents: {
27+
"/a.ts": '/// <reference path="./src/new.ts" />\nimport old from "./src/new";',
28+
"/src/a.ts": '/// <reference path="./new.ts" />\nimport old from "./new";',
29+
"/src/foo/a.ts": '/// <reference path="../new.ts" />\nimport old from "../new";',
30+
"/tsconfig.json": '{ "files": ["/a.ts", "/src/a.ts", "/src/foo/a.ts", "/src/new.ts"] }',
31+
},
32+
});

0 commit comments

Comments
 (0)