Skip to content

Commit 1a9c819

Browse files
authored
Optimize module resolution cache for watch and editor (microsoft#37055)
* Refactor resolveName * Have resolutions of failed lookups as array and resolved to fileName map
1 parent 6856c01 commit 1a9c819

File tree

12 files changed

+152
-189
lines changed

12 files changed

+152
-189
lines changed

src/compiler/moduleNameResolver.ts

+10-9
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,11 @@ namespace ts {
8484
return { fileName: resolved.path, packageId: resolved.packageId };
8585
}
8686

87-
function createResolvedModuleWithFailedLookupLocations(resolved: Resolved | undefined, isExternalLibraryImport: boolean, failedLookupLocations: string[]): ResolvedModuleWithFailedLookupLocations {
87+
function createResolvedModuleWithFailedLookupLocations(resolved: Resolved | undefined, isExternalLibraryImport: boolean | undefined, failedLookupLocations: string[], resultFromCache: ResolvedModuleWithFailedLookupLocations | undefined): ResolvedModuleWithFailedLookupLocations {
88+
if (resultFromCache) {
89+
resultFromCache.failedLookupLocations.push(...failedLookupLocations);
90+
return resultFromCache;
91+
}
8892
return {
8993
resolvedModule: resolved && { resolvedFileName: resolved.path, originalPath: resolved.originalPath === true ? undefined : resolved.originalPath, extension: resolved.extension, isExternalLibraryImport, packageId: resolved.packageId },
9094
failedLookupLocations
@@ -96,6 +100,7 @@ namespace ts {
96100
compilerOptions: CompilerOptions;
97101
traceEnabled: boolean;
98102
failedLookupLocations: Push<string>;
103+
resultFromCache?: ResolvedModuleWithFailedLookupLocations;
99104
}
100105

101106
/** Just the fields that we use for module resolution. */
@@ -926,11 +931,7 @@ namespace ts {
926931
const state: ModuleResolutionState = { compilerOptions, host, traceEnabled, failedLookupLocations };
927932

928933
const result = forEach(extensions, ext => tryResolve(ext));
929-
if (result && result.value) {
930-
const { resolved, isExternalLibraryImport } = result.value;
931-
return createResolvedModuleWithFailedLookupLocations(resolved, isExternalLibraryImport, failedLookupLocations);
932-
}
933-
return { resolvedModule: undefined, failedLookupLocations };
934+
return createResolvedModuleWithFailedLookupLocations(result?.value?.resolved, result?.value?.isExternalLibraryImport, failedLookupLocations, state.resultFromCache);
934935

935936
function tryResolve(extensions: Extensions): SearchResult<{ resolved: Resolved, isExternalLibraryImport: boolean }> {
936937
const loader: ResolutionKindSpecificLoader = (extensions, candidate, onlyRecordFailures, state) => nodeLoadModuleByRelativeName(extensions, candidate, onlyRecordFailures, state, /*considerPackageJson*/ true);
@@ -1435,7 +1436,7 @@ namespace ts {
14351436
if (state.traceEnabled) {
14361437
trace(state.host, Diagnostics.Resolution_for_module_0_was_found_in_cache_from_location_1, moduleName, containingDirectory);
14371438
}
1438-
state.failedLookupLocations.push(...result.failedLookupLocations);
1439+
state.resultFromCache = result;
14391440
return { value: result.resolvedModule && { path: result.resolvedModule.resolvedFileName, originalPath: result.resolvedModule.originalPath || true, extension: result.resolvedModule.extension, packageId: result.resolvedModule.packageId } };
14401441
}
14411442
}
@@ -1448,7 +1449,7 @@ namespace ts {
14481449

14491450
const resolved = tryResolve(Extensions.TypeScript) || tryResolve(Extensions.JavaScript);
14501451
// No originalPath because classic resolution doesn't resolve realPath
1451-
return createResolvedModuleWithFailedLookupLocations(resolved && resolved.value, /*isExternalLibraryImport*/ false, failedLookupLocations);
1452+
return createResolvedModuleWithFailedLookupLocations(resolved && resolved.value, /*isExternalLibraryImport*/ false, failedLookupLocations, state.resultFromCache);
14521453

14531454
function tryResolve(extensions: Extensions): SearchResult<Resolved> {
14541455
const resolvedUsingSettings = tryLoadModuleUsingOptionalResolutionSettings(extensions, moduleName, containingDirectory, loadModuleFromFileNoPackageId, state);
@@ -1495,7 +1496,7 @@ namespace ts {
14951496
const failedLookupLocations: string[] = [];
14961497
const state: ModuleResolutionState = { compilerOptions, host, traceEnabled, failedLookupLocations };
14971498
const resolved = loadModuleFromImmediateNodeModulesDirectory(Extensions.DtsOnly, moduleName, globalCache, state, /*typesScopeOnly*/ false);
1498-
return createResolvedModuleWithFailedLookupLocations(resolved, /*isExternalLibraryImport*/ true, failedLookupLocations);
1499+
return createResolvedModuleWithFailedLookupLocations(resolved, /*isExternalLibraryImport*/ true, failedLookupLocations, state.resultFromCache);
14991500
}
15001501

15011502
/**

0 commit comments

Comments
 (0)