Skip to content

Commit 2373d5f

Browse files
author
Andy Hanson
committed
getEditsForFileRename: Don't update unrelated import
1 parent c437404 commit 2373d5f

File tree

2 files changed

+21
-6
lines changed

2 files changed

+21
-6
lines changed

Diff for: src/services/getEditsForFileRename.ts

+17-6
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ namespace ts {
104104
): void {
105105
for (const sourceFile of program.getSourceFiles()) {
106106
const newImportFromPath = oldToNew(sourceFile.fileName) || sourceFile.fileName;
107+
const importingSourceFileMoved = newImportFromPath !== sourceFile.fileName;
107108
const newImportFromDirectory = getDirectoryPath(newImportFromPath);
108109

109110
const oldFromNew: string | undefined = newToOld(sourceFile.fileName);
@@ -123,7 +124,10 @@ namespace ts {
123124
// TODO:GH#18217
124125
? getSourceFileToImportFromResolved(resolveModuleName(importLiteral.text, oldImportFromPath, program.getCompilerOptions(), host as ModuleResolutionHost), oldToNew, program)
125126
: getSourceFileToImport(importLiteral, sourceFile, program, host, oldToNew);
126-
return toImport === undefined ? undefined : moduleSpecifiers.getModuleSpecifier(program, sourceFile, newImportFromPath, toImport, host, preferences);
127+
// If neither the importing source file nor the imported file moved, do nothing.
128+
return toImport === undefined || !toImport.updated && !importingSourceFileMoved
129+
? undefined
130+
: moduleSpecifiers.getModuleSpecifier(program, sourceFile, newImportFromPath, toImport.newFileName, host, preferences);
127131
});
128132
}
129133
}
@@ -135,12 +139,18 @@ namespace ts {
135139
return ensurePathIsNonModuleName(combineNormal(pathA, pathB));
136140
}
137141

138-
function getSourceFileToImport(importLiteral: StringLiteralLike, importingSourceFile: SourceFile, program: Program, host: LanguageServiceHost, oldToNew: PathUpdater): string | undefined {
142+
interface ToImport {
143+
readonly newFileName: string;
144+
/** True if the imported file was renamed. */
145+
readonly updated: boolean;
146+
}
147+
function getSourceFileToImport(importLiteral: StringLiteralLike, importingSourceFile: SourceFile, program: Program, host: LanguageServiceHost, oldToNew: PathUpdater): ToImport | undefined {
139148
const symbol = program.getTypeChecker().getSymbolAtLocation(importLiteral);
140149
if (symbol) {
141150
if (symbol.declarations.some(d => isAmbientModule(d))) return undefined; // No need to update if it's an ambient module
142151
const oldFileName = find(symbol.declarations, isSourceFile)!.fileName;
143-
return oldToNew(oldFileName) || oldFileName;
152+
const newFileName = oldToNew(oldFileName);
153+
return newFileName === undefined ? { newFileName: oldFileName, updated: false } : { newFileName, updated: true };
144154
}
145155
else {
146156
const resolved = host.resolveModuleNames
@@ -150,14 +160,15 @@ namespace ts {
150160
}
151161
}
152162

153-
function getSourceFileToImportFromResolved(resolved: ResolvedModuleWithFailedLookupLocations | undefined, oldToNew: PathUpdater, program: Program): string | undefined {
163+
function getSourceFileToImportFromResolved(resolved: ResolvedModuleWithFailedLookupLocations | undefined, oldToNew: PathUpdater, program: Program): ToImport | undefined {
154164
return resolved && (
155165
(resolved.resolvedModule && getIfInProgram(resolved.resolvedModule.resolvedFileName)) || firstDefined(resolved.failedLookupLocations, getIfInProgram));
156166

157-
function getIfInProgram(oldLocation: string): string | undefined {
167+
function getIfInProgram(oldLocation: string): ToImport | undefined {
158168
const newLocation = oldToNew(oldLocation);
169+
159170
return program.getSourceFile(oldLocation) || newLocation !== undefined && program.getSourceFile(newLocation)
160-
? newLocation || oldLocation
171+
? newLocation !== undefined ? { newFileName: newLocation, updated: true } : { newFileName: oldLocation, updated: false }
161172
: undefined;
162173
}
163174
}

Diff for: tests/cases/fourslash/getEditsForFileRename.ts

+4
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@
1414
/////// <reference path="../old.ts" />
1515
////import old from "../old";
1616

17+
// @Filename: /unrelated.ts
18+
// Don't update an unrelated import
19+
////import { x } from "././src/./foo/./a";
20+
1721
// @Filename: /src/new.ts
1822
////
1923

0 commit comments

Comments
 (0)