Skip to content

Commit b536f9d

Browse files
committed
Should not remove the reused resolutions in the file when file contents have not changed.
1 parent aea8630 commit b536f9d

File tree

7 files changed

+18
-15
lines changed

7 files changed

+18
-15
lines changed

src/compiler/program.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -595,11 +595,11 @@ namespace ts {
595595
let _compilerOptionsObjectLiteralSyntax: ObjectLiteralExpression;
596596

597597
let moduleResolutionCache: ModuleResolutionCache;
598-
let resolveModuleNamesWorker: (moduleNames: string[], containingFile: string) => ResolvedModuleFull[];
598+
let resolveModuleNamesWorker: (moduleNames: string[], containingFile: string, reusedNames?: string[]) => ResolvedModuleFull[];
599599
const hasInvalidatedResolution = host.hasInvalidatedResolution || returnFalse;
600600
const hasChangedAutomaticTypeDirectiveNames = host.hasChangedAutomaticTypeDirectiveNames && host.hasChangedAutomaticTypeDirectiveNames.bind(host) || returnFalse;
601601
if (host.resolveModuleNames) {
602-
resolveModuleNamesWorker = (moduleNames, containingFile) => host.resolveModuleNames(checkAllDefined(moduleNames), containingFile).map(resolved => {
602+
resolveModuleNamesWorker = (moduleNames, containingFile, reusedNames) => host.resolveModuleNames(checkAllDefined(moduleNames), containingFile, reusedNames).map(resolved => {
603603
// An older host may have omitted extension, in which case we should infer it from the file extension of resolvedFileName.
604604
if (!resolved || (resolved as ResolvedModuleFull).extension !== undefined) {
605605
return resolved as ResolvedModuleFull;
@@ -820,6 +820,7 @@ namespace ts {
820820
* * ResolvedModuleFull instance: can be reused.
821821
*/
822822
let result: ResolvedModuleFull[];
823+
let reusedNames: string[];
823824
/** A transient placeholder used to mark predicted resolution in the result list. */
824825
const predictedToResolveToAmbientModuleMarker: ResolvedModuleFull = <any>{};
825826

@@ -835,6 +836,7 @@ namespace ts {
835836
trace(host, Diagnostics.Reusing_resolution_of_module_0_to_file_1_from_old_program, moduleName, containingFile);
836837
}
837838
(result || (result = new Array(moduleNames.length)))[i] = oldResolvedModule;
839+
(reusedNames || (reusedNames = [])).push(moduleName);
838840
continue;
839841
}
840842
}
@@ -863,7 +865,7 @@ namespace ts {
863865
}
864866

865867
const resolutions = unknownModuleNames && unknownModuleNames.length
866-
? resolveModuleNamesWorker(unknownModuleNames, containingFile)
868+
? resolveModuleNamesWorker(unknownModuleNames, containingFile, reusedNames)
867869
: emptyArray;
868870

869871
// Combine results of resolutions and predicted results

src/compiler/resolutionCache.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ namespace ts {
88
startRecordingFilesWithChangedResolutions(): void;
99
finishRecordingFilesWithChangedResolutions(): Path[];
1010

11-
resolveModuleNames(moduleNames: string[], containingFile: string, logChanges: boolean): ResolvedModuleFull[];
11+
resolveModuleNames(moduleNames: string[], containingFile: string, reusedNames: string[] | undefined, logChanges: boolean): ResolvedModuleFull[];
1212
resolveTypeReferenceDirectives(typeDirectiveNames: string[], containingFile: string): ResolvedTypeReferenceDirective[];
1313

1414
invalidateResolutionOfFile(filePath: Path): void;
@@ -207,6 +207,7 @@ namespace ts {
207207
perDirectoryCache: Map<Map<T>>,
208208
loader: (name: string, containingFile: string, options: CompilerOptions, host: ModuleResolutionHost) => T,
209209
getResolutionWithResolvedFileName: GetResolutionWithResolvedFileName<T, R>,
210+
reusedNames: string[] | undefined,
210211
logChanges: boolean): R[] {
211212

212213
const path = resolutionHost.toPath(containingFile);
@@ -253,7 +254,7 @@ namespace ts {
253254

254255
// Stop watching and remove the unused name
255256
resolutionsInFile.forEach((resolution, name) => {
256-
if (!seenNamesInFile.has(name)) {
257+
if (!seenNamesInFile.has(name) && !contains(reusedNames, name)) {
257258
stopWatchFailedLookupLocationOfResolution(resolution);
258259
resolutionsInFile.delete(name);
259260
}
@@ -285,16 +286,16 @@ namespace ts {
285286
typeDirectiveNames, containingFile,
286287
resolvedTypeReferenceDirectives, perDirectoryResolvedTypeReferenceDirectives,
287288
resolveTypeReferenceDirective, getResolvedTypeReferenceDirective,
288-
/*logChanges*/ false
289+
/*reusedNames*/ undefined, /*logChanges*/ false
289290
);
290291
}
291292

292-
function resolveModuleNames(moduleNames: string[], containingFile: string, logChanges: boolean): ResolvedModuleFull[] {
293+
function resolveModuleNames(moduleNames: string[], containingFile: string, reusedNames: string[] | undefined, logChanges: boolean): ResolvedModuleFull[] {
293294
return resolveNamesWithLocalCache(
294295
moduleNames, containingFile,
295296
resolvedModuleNames, perDirectoryResolvedModuleNames,
296297
resolveModuleName, getResolvedModule,
297-
logChanges
298+
reusedNames, logChanges
298299
);
299300
}
300301

src/compiler/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4138,7 +4138,7 @@ namespace ts {
41384138
* If resolveModuleNames is implemented then implementation for members from ModuleResolutionHost can be just
41394139
* 'throw new Error("NotImplemented")'
41404140
*/
4141-
resolveModuleNames?(moduleNames: string[], containingFile: string): ResolvedModule[];
4141+
resolveModuleNames?(moduleNames: string[], containingFile: string, reusedNames?: string[]): ResolvedModule[];
41424142
/**
41434143
* This method is a companion for 'resolveModuleNames' and is used to resolve 'types' references to actual type declaration files
41444144
*/

src/compiler/watchedProgram.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -396,8 +396,8 @@ namespace ts {
396396
return partialSystem.getDirectories(path);
397397
}
398398

399-
function resolveModuleNames(moduleNames: string[], containingFile: string) {
400-
return resolutionCache.resolveModuleNames(moduleNames, containingFile, /*logChanges*/ false);
399+
function resolveModuleNames(moduleNames: string[], containingFile: string, reusedNames?: string[]) {
400+
return resolutionCache.resolveModuleNames(moduleNames, containingFile, reusedNames, /*logChanges*/ false);
401401
}
402402

403403
function resolveTypeReferenceDirectives(typeDirectiveNames: string[], containingFile: string) {

src/server/project.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -325,8 +325,8 @@ namespace ts.server {
325325
return !this.isWatchedMissingFile(path) && this.partialSystem.fileExists(file);
326326
}
327327

328-
resolveModuleNames(moduleNames: string[], containingFile: string): ResolvedModuleFull[] {
329-
return this.resolutionCache.resolveModuleNames(moduleNames, containingFile, /*logChanges*/ true);
328+
resolveModuleNames(moduleNames: string[], containingFile: string, reusedNames?: string[]): ResolvedModuleFull[] {
329+
return this.resolutionCache.resolveModuleNames(moduleNames, containingFile, reusedNames, /*logChanges*/ true);
330330
}
331331

332332
resolveTypeReferenceDirectives(typeDirectiveNames: string[], containingFile: string): ResolvedTypeReferenceDirective[] {

src/services/services.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1177,7 +1177,7 @@ namespace ts {
11771177
}
11781178

11791179
if (host.resolveModuleNames) {
1180-
compilerHost.resolveModuleNames = (moduleNames, containingFile) => host.resolveModuleNames(moduleNames, containingFile);
1180+
compilerHost.resolveModuleNames = (moduleNames, containingFile, reusedNames) => host.resolveModuleNames(moduleNames, containingFile, reusedNames);
11811181
}
11821182
if (host.resolveTypeReferenceDirectives) {
11831183
compilerHost.resolveTypeReferenceDirectives = (typeReferenceDirectiveNames, containingFile) => {

src/services/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ namespace ts {
183183
* if implementation is omitted then language service will use built-in module resolution logic and get answers to
184184
* host specific questions using 'getScriptSnapshot'.
185185
*/
186-
resolveModuleNames?(moduleNames: string[], containingFile: string): ResolvedModule[];
186+
resolveModuleNames?(moduleNames: string[], containingFile: string, reusedNames?: string[]): ResolvedModule[];
187187
resolveTypeReferenceDirectives?(typeDirectiveNames: string[], containingFile: string): ResolvedTypeReferenceDirective[];
188188
hasInvalidatedResolution?: HasInvalidatedResolution;
189189
hasChangedAutomaticTypeDirectiveNames?(): boolean;

0 commit comments

Comments
 (0)