Skip to content

Commit 9e4cd0b

Browse files
committed
Make the module resolution cache apis for updating compiler options or clearing it
1 parent 06f25c0 commit 9e4cd0b

File tree

5 files changed

+56
-41
lines changed

5 files changed

+56
-41
lines changed

src/compiler/moduleNameResolver.ts

Lines changed: 41 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -443,7 +443,12 @@ namespace ts {
443443
*/
444444
export interface ModuleResolutionCache extends NonRelativeModuleNameResolutionCache {
445445
getOrCreateCacheForDirectory(directoryName: string, redirectedReference?: ResolvedProjectReference): Map<ResolvedModuleWithFailedLookupLocations>;
446-
/*@internal*/ directoryToModuleNameMap: CacheWithRedirects<ESMap<string, ResolvedModuleWithFailedLookupLocations>>;
446+
clear(): void;
447+
/**
448+
* Updates with the current compilerOptions the cache will operate with.
449+
* This updates the redirects map as well if needed so module resolutions are cached if they can across the projects
450+
*/
451+
update(options: CompilerOptions): void;
447452
}
448453

449454
/**
@@ -452,7 +457,6 @@ namespace ts {
452457
*/
453458
export interface NonRelativeModuleNameResolutionCache {
454459
getOrCreateCacheForModuleName(nonRelativeModuleName: string, redirectedReference?: ResolvedProjectReference): PerModuleNameCache;
455-
/*@internal*/ moduleNameToDirectoryMap: CacheWithRedirects<PerModuleNameCache>;
456460
}
457461

458462
export interface PerModuleNameCache {
@@ -528,7 +532,41 @@ namespace ts {
528532
currentDirectory: string,
529533
getCanonicalFileName: GetCanonicalFileName): ModuleResolutionCache {
530534

531-
return { getOrCreateCacheForDirectory, getOrCreateCacheForModuleName, directoryToModuleNameMap, moduleNameToDirectoryMap };
535+
return {
536+
getOrCreateCacheForDirectory,
537+
getOrCreateCacheForModuleName,
538+
clear,
539+
update,
540+
};
541+
542+
function clear() {
543+
directoryToModuleNameMap.clear();
544+
moduleNameToDirectoryMap.clear();
545+
}
546+
547+
function update(options: CompilerOptions) {
548+
if (!options.configFile) return;
549+
if (directoryToModuleNameMap.redirectsMap.size === 0) {
550+
// The own map will be for projectCompilerOptions
551+
Debug.assert(moduleNameToDirectoryMap.redirectsMap.size === 0);
552+
Debug.assert(directoryToModuleNameMap.ownMap.size === 0);
553+
Debug.assert(moduleNameToDirectoryMap.ownMap.size === 0);
554+
directoryToModuleNameMap.redirectsMap.set(options.configFile.path, directoryToModuleNameMap.ownMap);
555+
moduleNameToDirectoryMap.redirectsMap.set(options.configFile.path, moduleNameToDirectoryMap.ownMap);
556+
}
557+
else {
558+
// Set correct own map
559+
Debug.assert(moduleNameToDirectoryMap.redirectsMap.size > 0);
560+
const ref: ResolvedProjectReference = {
561+
sourceFile: options.configFile,
562+
commandLine: { options } as ParsedCommandLine
563+
};
564+
directoryToModuleNameMap.setOwnMap(directoryToModuleNameMap.getOrCreateMapOfCacheRedirects(ref));
565+
moduleNameToDirectoryMap.setOwnMap(moduleNameToDirectoryMap.getOrCreateMapOfCacheRedirects(ref));
566+
}
567+
directoryToModuleNameMap.setOwnOptions(options);
568+
moduleNameToDirectoryMap.setOwnOptions(options);
569+
}
532570

533571
function getOrCreateCacheForDirectory(directoryName: string, redirectedReference?: ResolvedProjectReference) {
534572
const path = toPath(directoryName, currentDirectory, getCanonicalFileName);

src/compiler/resolutionCache.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -284,8 +284,7 @@ namespace ts {
284284
}
285285

286286
function clearPerDirectoryResolutions() {
287-
perDirectoryResolvedModuleNames.clear();
288-
nonRelativeModuleNameCache.clear();
287+
moduleResolutionCache.clear();
289288
perDirectoryResolvedTypeReferenceDirectives.clear();
290289
nonRelativeExternalModuleResolutions.forEach(watchFailedLookupLocationOfNonRelativeModuleResolutions);
291290
nonRelativeExternalModuleResolutions.clear();

src/compiler/tsbuildPublic.ts

Lines changed: 2 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -558,10 +558,7 @@ namespace ts {
558558
compilerHost.getSourceFile = cache.originalGetSourceFile;
559559
state.readFileWithCache = cache.originalReadFileWithCache;
560560
extendedConfigCache.clear();
561-
if (moduleResolutionCache) {
562-
moduleResolutionCache.directoryToModuleNameMap.clear();
563-
moduleResolutionCache.moduleNameToDirectoryMap.clear();
564-
}
561+
moduleResolutionCache?.clear();
565562
state.cache = undefined;
566563
}
567564

@@ -842,7 +839,7 @@ namespace ts {
842839
const { host, compilerHost } = state;
843840
state.projectCompilerOptions = config.options;
844841
// Update module resolution cache if needed
845-
updateModuleResolutionCache(state, project, config);
842+
state.moduleResolutionCache?.update(config.options);
846843

847844
// Create program
848845
program = host.createProgram(
@@ -1306,37 +1303,6 @@ namespace ts {
13061303
return { buildResult, step: BuildStep.QueueReferencingProjects };
13071304
}
13081305

1309-
function updateModuleResolutionCache(
1310-
state: SolutionBuilderState,
1311-
proj: ResolvedConfigFileName,
1312-
config: ParsedCommandLine
1313-
) {
1314-
if (!state.moduleResolutionCache) return;
1315-
1316-
// Update module resolution cache if needed
1317-
const { moduleResolutionCache } = state;
1318-
const projPath = toPath(state, proj);
1319-
if (moduleResolutionCache.directoryToModuleNameMap.redirectsMap.size === 0) {
1320-
// The own map will be for projectCompilerOptions
1321-
Debug.assert(moduleResolutionCache.moduleNameToDirectoryMap.redirectsMap.size === 0);
1322-
moduleResolutionCache.directoryToModuleNameMap.redirectsMap.set(projPath, moduleResolutionCache.directoryToModuleNameMap.ownMap);
1323-
moduleResolutionCache.moduleNameToDirectoryMap.redirectsMap.set(projPath, moduleResolutionCache.moduleNameToDirectoryMap.ownMap);
1324-
}
1325-
else {
1326-
// Set correct own map
1327-
Debug.assert(moduleResolutionCache.moduleNameToDirectoryMap.redirectsMap.size > 0);
1328-
1329-
const ref: ResolvedProjectReference = {
1330-
sourceFile: config.options.configFile!,
1331-
commandLine: config
1332-
};
1333-
moduleResolutionCache.directoryToModuleNameMap.setOwnMap(moduleResolutionCache.directoryToModuleNameMap.getOrCreateMapOfCacheRedirects(ref));
1334-
moduleResolutionCache.moduleNameToDirectoryMap.setOwnMap(moduleResolutionCache.moduleNameToDirectoryMap.getOrCreateMapOfCacheRedirects(ref));
1335-
}
1336-
moduleResolutionCache.directoryToModuleNameMap.setOwnOptions(config.options);
1337-
moduleResolutionCache.moduleNameToDirectoryMap.setOwnOptions(config.options);
1338-
}
1339-
13401306
function checkConfigFileUpToDateStatus(state: SolutionBuilderState, configFile: string, oldestOutputFileTime: Date, oldestOutputFileName: string): Status.OutOfDateWithSelf | undefined {
13411307
// Check tsconfig time
13421308
const tsconfigTime = getModifiedTime(state.host, configFile);

tests/baselines/reference/api/tsserverlibrary.d.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4729,6 +4729,12 @@ declare namespace ts {
47294729
*/
47304730
interface ModuleResolutionCache extends NonRelativeModuleNameResolutionCache {
47314731
getOrCreateCacheForDirectory(directoryName: string, redirectedReference?: ResolvedProjectReference): Map<ResolvedModuleWithFailedLookupLocations>;
4732+
clear(): void;
4733+
/**
4734+
* Updates with the current compilerOptions the cache will operate with.
4735+
* This updates the redirects map as well if needed so module resolutions are cached if they can across the projects
4736+
*/
4737+
update(options: CompilerOptions): void;
47324738
}
47334739
/**
47344740
* Stored map from non-relative module name to a table: directory -> result of module lookup in this directory

tests/baselines/reference/api/typescript.d.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4729,6 +4729,12 @@ declare namespace ts {
47294729
*/
47304730
interface ModuleResolutionCache extends NonRelativeModuleNameResolutionCache {
47314731
getOrCreateCacheForDirectory(directoryName: string, redirectedReference?: ResolvedProjectReference): Map<ResolvedModuleWithFailedLookupLocations>;
4732+
clear(): void;
4733+
/**
4734+
* Updates with the current compilerOptions the cache will operate with.
4735+
* This updates the redirects map as well if needed so module resolutions are cached if they can across the projects
4736+
*/
4737+
update(options: CompilerOptions): void;
47324738
}
47334739
/**
47344740
* Stored map from non-relative module name to a table: directory -> result of module lookup in this directory

0 commit comments

Comments
 (0)