@@ -293,33 +293,69 @@ namespace ts {
293293 return result ;
294294 }
295295
296- export function resolveModuleName ( moduleName : string , containingFile : string , compilerOptions : CompilerOptions , host : ModuleResolutionHost ) : ResolvedModuleWithFailedLookupLocations {
296+ /**
297+ * Cached module resolutions per containing directory.
298+ * This assumes that any module id will have the same resolution for sibling files located in the same folder.
299+ */
300+ export interface ModuleResolutionCache {
301+ getOrCreateCacheForDirectory ( directoryName : string ) : Map < ResolvedModuleWithFailedLookupLocations > ;
302+ }
303+
304+ export function createModuleResolutionCache ( currentDirectory : string , getCanonicalFileName : ( s : string ) => string ) {
305+ const map = createFileMap < Map < ResolvedModuleWithFailedLookupLocations > > ( ) ;
306+
307+ return { getOrCreateCacheForDirectory } ;
308+
309+ function getOrCreateCacheForDirectory ( directoryName : string ) {
310+ const path = toPath ( directoryName , currentDirectory , getCanonicalFileName ) ;
311+ let perFolderCache = map . get ( path ) ;
312+ if ( ! perFolderCache ) {
313+ perFolderCache = createMap < ResolvedModuleWithFailedLookupLocations > ( ) ;
314+ map . set ( path , perFolderCache ) ;
315+ }
316+ return perFolderCache ;
317+ }
318+ }
319+
320+ export function resolveModuleName ( moduleName : string , containingFile : string , compilerOptions : CompilerOptions , host : ModuleResolutionHost , cache ?: ModuleResolutionCache ) : ResolvedModuleWithFailedLookupLocations {
297321 const traceEnabled = isTraceEnabled ( compilerOptions , host ) ;
298322 if ( traceEnabled ) {
299323 trace ( host , Diagnostics . Resolving_module_0_from_1 , moduleName , containingFile ) ;
300324 }
325+ let perFolderCache = cache && cache . getOrCreateCacheForDirectory ( getDirectoryPath ( containingFile ) ) ;
326+ let result = perFolderCache && perFolderCache [ moduleName ] ;
301327
302- let moduleResolution = compilerOptions . moduleResolution ;
303- if ( moduleResolution === undefined ) {
304- moduleResolution = getEmitModuleKind ( compilerOptions ) === ModuleKind . CommonJS ? ModuleResolutionKind . NodeJs : ModuleResolutionKind . Classic ;
328+ if ( result ) {
305329 if ( traceEnabled ) {
306- trace ( host , Diagnostics . Module_resolution_kind_is_not_specified_using_0 , ModuleResolutionKind [ moduleResolution ] ) ;
330+ trace ( host , Diagnostics . Resolution_for_module_0_was_found_in_cache , moduleName ) ;
307331 }
308332 }
309333 else {
310- if ( traceEnabled ) {
311- trace ( host , Diagnostics . Explicitly_specified_module_resolution_kind_Colon_0 , ModuleResolutionKind [ moduleResolution ] ) ;
334+ let moduleResolution = compilerOptions . moduleResolution ;
335+ if ( moduleResolution === undefined ) {
336+ moduleResolution = getEmitModuleKind ( compilerOptions ) === ModuleKind . CommonJS ? ModuleResolutionKind . NodeJs : ModuleResolutionKind . Classic ;
337+ if ( traceEnabled ) {
338+ trace ( host , Diagnostics . Module_resolution_kind_is_not_specified_using_0 , ModuleResolutionKind [ moduleResolution ] ) ;
339+ }
340+ }
341+ else {
342+ if ( traceEnabled ) {
343+ trace ( host , Diagnostics . Explicitly_specified_module_resolution_kind_Colon_0 , ModuleResolutionKind [ moduleResolution ] ) ;
344+ }
312345 }
313- }
314346
315- let result : ResolvedModuleWithFailedLookupLocations ;
316- switch ( moduleResolution ) {
317- case ModuleResolutionKind . NodeJs :
318- result = nodeModuleNameResolver ( moduleName , containingFile , compilerOptions , host ) ;
319- break ;
320- case ModuleResolutionKind . Classic :
321- result = classicNameResolver ( moduleName , containingFile , compilerOptions , host ) ;
322- break ;
347+ switch ( moduleResolution ) {
348+ case ModuleResolutionKind . NodeJs :
349+ result = nodeModuleNameResolver ( moduleName , containingFile , compilerOptions , host ) ;
350+ break ;
351+ case ModuleResolutionKind . Classic :
352+ result = classicNameResolver ( moduleName , containingFile , compilerOptions , host ) ;
353+ break ;
354+ }
355+
356+ if ( perFolderCache ) {
357+ perFolderCache [ moduleName ] = result ;
358+ }
323359 }
324360
325361 if ( traceEnabled ) {
0 commit comments