Reuse map if module resolution is same for redirected and own files

This commit is contained in:
Sheetal Nandi 2019-04-23 15:32:02 -07:00
parent 4b81e37941
commit 3264b64f08
3 changed files with 13 additions and 7 deletions

View file

@ -436,10 +436,10 @@ namespace ts {
set(directory: string, result: ResolvedModuleWithFailedLookupLocations): void; set(directory: string, result: ResolvedModuleWithFailedLookupLocations): void;
} }
export function createModuleResolutionCache(currentDirectory: string, getCanonicalFileName: (s: string) => string): ModuleResolutionCache { export function createModuleResolutionCache(currentDirectory: string, getCanonicalFileName: (s: string) => string, options?: CompilerOptions): ModuleResolutionCache {
return createModuleResolutionCacheWithMaps( return createModuleResolutionCacheWithMaps(
createCacheWithRedirects(), createCacheWithRedirects(options),
createCacheWithRedirects(), createCacheWithRedirects(options),
currentDirectory, currentDirectory,
getCanonicalFileName getCanonicalFileName
); );
@ -454,7 +454,7 @@ namespace ts {
} }
/*@internal*/ /*@internal*/
export function createCacheWithRedirects<T>(): CacheWithRedirects<T> { export function createCacheWithRedirects<T>(options?: CompilerOptions): CacheWithRedirects<T> {
const ownMap: Map<T> = createMap(); const ownMap: Map<T> = createMap();
const redirectsMap: Map<Map<T>> = createMap(); const redirectsMap: Map<Map<T>> = createMap();
return { return {
@ -471,7 +471,8 @@ namespace ts {
const path = redirectedReference.sourceFile.path; const path = redirectedReference.sourceFile.path;
let redirects = redirectsMap.get(path); let redirects = redirectsMap.get(path);
if (!redirects) { if (!redirects) {
redirects = createMap(); // Reuse map if redirected reference map uses same resolution
redirects = !options || optionsHaveModuleResolutionChanges(options, redirectedReference.commandLine.options) ? createMap() : ownMap;
redirectsMap.set(path, redirects); redirectsMap.set(path, redirects);
} }
return redirects; return redirects;

View file

@ -773,7 +773,7 @@ namespace ts {
}); });
} }
else { else {
moduleResolutionCache = createModuleResolutionCache(currentDirectory, x => host.getCanonicalFileName(x)); moduleResolutionCache = createModuleResolutionCache(currentDirectory, x => host.getCanonicalFileName(x), options);
const loader = (moduleName: string, containingFile: string, redirectedReference: ResolvedProjectReference | undefined) => resolveModuleName(moduleName, containingFile, options, host, moduleResolutionCache, redirectedReference).resolvedModule!; // TODO: GH#18217 const loader = (moduleName: string, containingFile: string, redirectedReference: ResolvedProjectReference | undefined) => resolveModuleName(moduleName, containingFile, options, host, moduleResolutionCache, redirectedReference).resolvedModule!; // TODO: GH#18217
resolveModuleNamesWorker = (moduleNames, containingFile, _reusedNames, redirectedReference) => loadWithLocalCache<ResolvedModuleFull>(Debug.assertEachDefined(moduleNames), containingFile, redirectedReference, loader); resolveModuleNamesWorker = (moduleNames, containingFile, _reusedNames, redirectedReference) => loadWithLocalCache<ResolvedModuleFull>(Debug.assertEachDefined(moduleNames), containingFile, redirectedReference, loader);
} }

View file

@ -101,7 +101,12 @@ namespace ts {
} }
export function changesAffectModuleResolution(oldOptions: CompilerOptions, newOptions: CompilerOptions): boolean { export function changesAffectModuleResolution(oldOptions: CompilerOptions, newOptions: CompilerOptions): boolean {
return oldOptions.configFilePath !== newOptions.configFilePath || moduleResolutionOptionDeclarations.some(o => return oldOptions.configFilePath !== newOptions.configFilePath ||
optionsHaveModuleResolutionChanges(oldOptions, newOptions);
}
export function optionsHaveModuleResolutionChanges(oldOptions: CompilerOptions, newOptions: CompilerOptions) {
return moduleResolutionOptionDeclarations.some(o =>
!isJsonEqual(getCompilerOptionValue(oldOptions, o), getCompilerOptionValue(newOptions, o))); !isJsonEqual(getCompilerOptionValue(oldOptions, o), getCompilerOptionValue(newOptions, o)));
} }