From 3264b64f08cd3a946fecf9b9ebd9d741190b5543 Mon Sep 17 00:00:00 2001 From: Sheetal Nandi Date: Tue, 23 Apr 2019 15:32:02 -0700 Subject: [PATCH] Reuse map if module resolution is same for redirected and own files --- src/compiler/moduleNameResolver.ts | 11 ++++++----- src/compiler/program.ts | 2 +- src/compiler/utilities.ts | 7 ++++++- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/compiler/moduleNameResolver.ts b/src/compiler/moduleNameResolver.ts index b8aa9fa2df465..090abfa978e7d 100644 --- a/src/compiler/moduleNameResolver.ts +++ b/src/compiler/moduleNameResolver.ts @@ -436,10 +436,10 @@ namespace ts { 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( - createCacheWithRedirects(), - createCacheWithRedirects(), + createCacheWithRedirects(options), + createCacheWithRedirects(options), currentDirectory, getCanonicalFileName ); @@ -454,7 +454,7 @@ namespace ts { } /*@internal*/ - export function createCacheWithRedirects(): CacheWithRedirects { + export function createCacheWithRedirects(options?: CompilerOptions): CacheWithRedirects { const ownMap: Map = createMap(); const redirectsMap: Map> = createMap(); return { @@ -471,7 +471,8 @@ namespace ts { const path = redirectedReference.sourceFile.path; let redirects = redirectsMap.get(path); 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); } return redirects; diff --git a/src/compiler/program.ts b/src/compiler/program.ts index 4f50aa3ab1f59..c6c592b0e7381 100644 --- a/src/compiler/program.ts +++ b/src/compiler/program.ts @@ -773,7 +773,7 @@ namespace ts { }); } 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 resolveModuleNamesWorker = (moduleNames, containingFile, _reusedNames, redirectedReference) => loadWithLocalCache(Debug.assertEachDefined(moduleNames), containingFile, redirectedReference, loader); } diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index 2e6c3ae4f866e..5e7474920fd27 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -101,7 +101,12 @@ namespace ts { } 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))); }