@@ -345,7 +345,7 @@ namespace ts {
345
345
}
346
346
let result : SearchResult < Resolved > | undefined ;
347
347
if ( ! isExternalModuleNameRelative ( typeReferenceDirectiveName ) ) {
348
- result = loadModuleFromNearestNodeModulesDirectory ( Extensions . DtsOnly , typeReferenceDirectiveName , initialLocationForSecondaryLookup , moduleResolutionState , /*cache*/ undefined ) ;
348
+ result = loadModuleFromNearestNodeModulesDirectory ( Extensions . DtsOnly , typeReferenceDirectiveName , initialLocationForSecondaryLookup , moduleResolutionState , /*cache*/ undefined , /*redirectedReference*/ undefined ) ;
349
349
}
350
350
else {
351
351
const { path : candidate } = normalizePathAndParts ( combinePaths ( initialLocationForSecondaryLookup , typeReferenceDirectiveName ) ) ;
@@ -415,15 +415,15 @@ namespace ts {
415
415
* This assumes that any module id will have the same resolution for sibling files located in the same folder.
416
416
*/
417
417
export interface ModuleResolutionCache extends NonRelativeModuleNameResolutionCache {
418
- getOrCreateCacheForDirectory ( directoryName : string ) : Map < ResolvedModuleWithFailedLookupLocations > ;
418
+ getOrCreateCacheForDirectory ( directoryName : string , redirectedReference ?: ResolvedProjectReference ) : Map < ResolvedModuleWithFailedLookupLocations > ;
419
419
}
420
420
421
421
/**
422
422
* Stored map from non-relative module name to a table: directory -> result of module lookup in this directory
423
423
* We support only non-relative module names because resolution of relative module names is usually more deterministic and thus less expensive.
424
424
*/
425
425
export interface NonRelativeModuleNameResolutionCache {
426
- getOrCreateCacheForModuleName ( nonRelativeModuleName : string ) : PerModuleNameCache ;
426
+ getOrCreateCacheForModuleName ( nonRelativeModuleName : string , redirectedReference ?: ResolvedProjectReference ) : PerModuleNameCache ;
427
427
}
428
428
429
429
export interface PerModuleNameCache {
@@ -433,40 +433,78 @@ namespace ts {
433
433
434
434
export function createModuleResolutionCache ( currentDirectory : string , getCanonicalFileName : ( s : string ) => string ) : ModuleResolutionCache {
435
435
return createModuleResolutionCacheWithMaps (
436
- createMap < Map < ResolvedModuleWithFailedLookupLocations > > ( ) ,
437
- createMap < PerModuleNameCache > ( ) ,
436
+ createCacheWithRedirects ( ) ,
437
+ createCacheWithRedirects ( ) ,
438
438
currentDirectory ,
439
439
getCanonicalFileName
440
440
) ;
441
441
}
442
442
443
+ /*@internal */
444
+ export interface CacheWithRedirects < T > {
445
+ ownMap : Map < T > ;
446
+ redirectsMap : Map < Map < T > > ;
447
+ getOrCreateMapOfCacheRedirects ( redirectedReference : ResolvedProjectReference | undefined ) : Map < T > ;
448
+ clear ( ) : void ;
449
+ }
450
+
451
+ /*@internal */
452
+ export function createCacheWithRedirects < T > ( ) : CacheWithRedirects < T > {
453
+ const ownMap : Map < T > = createMap ( ) ;
454
+ const redirectsMap : Map < Map < T > > = createMap ( ) ;
455
+ return {
456
+ ownMap,
457
+ redirectsMap,
458
+ getOrCreateMapOfCacheRedirects,
459
+ clear
460
+ } ;
461
+
462
+ function getOrCreateMapOfCacheRedirects ( redirectedReference : ResolvedProjectReference | undefined ) {
463
+ if ( ! redirectedReference ) {
464
+ return ownMap ;
465
+ }
466
+ const path = redirectedReference . sourceFile . path ;
467
+ let redirects = redirectsMap . get ( path ) ;
468
+ if ( ! redirects ) {
469
+ redirects = createMap ( ) ;
470
+ redirectsMap . set ( path , redirects ) ;
471
+ }
472
+ return redirects ;
473
+ }
474
+
475
+ function clear ( ) {
476
+ ownMap . clear ( ) ;
477
+ redirectsMap . clear ( ) ;
478
+ }
479
+ }
480
+
443
481
/*@internal */
444
482
export function createModuleResolutionCacheWithMaps (
445
- directoryToModuleNameMap : Map < Map < ResolvedModuleWithFailedLookupLocations > > ,
446
- moduleNameToDirectoryMap : Map < PerModuleNameCache > ,
483
+ directoryToModuleNameMap : CacheWithRedirects < Map < ResolvedModuleWithFailedLookupLocations > > ,
484
+ moduleNameToDirectoryMap : CacheWithRedirects < PerModuleNameCache > ,
447
485
currentDirectory : string ,
448
486
getCanonicalFileName : GetCanonicalFileName ) : ModuleResolutionCache {
449
487
450
488
return { getOrCreateCacheForDirectory, getOrCreateCacheForModuleName } ;
451
489
452
- function getOrCreateCacheForDirectory ( directoryName : string ) {
490
+ function getOrCreateCacheForDirectory ( directoryName : string , redirectedReference ?: ResolvedProjectReference ) {
453
491
const path = toPath ( directoryName , currentDirectory , getCanonicalFileName ) ;
454
- let perFolderCache = directoryToModuleNameMap . get ( path ) ;
455
- if ( ! perFolderCache ) {
456
- perFolderCache = createMap < ResolvedModuleWithFailedLookupLocations > ( ) ;
457
- directoryToModuleNameMap . set ( path , perFolderCache ) ;
458
- }
459
- return perFolderCache ;
492
+ return getOrCreateCache < Map < ResolvedModuleWithFailedLookupLocations > > ( directoryToModuleNameMap , redirectedReference , path , createMap ) ;
460
493
}
461
494
462
- function getOrCreateCacheForModuleName ( nonRelativeModuleName : string ) : PerModuleNameCache {
495
+ function getOrCreateCacheForModuleName ( nonRelativeModuleName : string , redirectedReference ?: ResolvedProjectReference ) : PerModuleNameCache {
463
496
Debug . assert ( ! isExternalModuleNameRelative ( nonRelativeModuleName ) ) ;
464
- let perModuleNameCache = moduleNameToDirectoryMap . get ( nonRelativeModuleName ) ;
465
- if ( ! perModuleNameCache ) {
466
- perModuleNameCache = createPerModuleNameCache ( ) ;
467
- moduleNameToDirectoryMap . set ( nonRelativeModuleName , perModuleNameCache ) ;
497
+ return getOrCreateCache ( moduleNameToDirectoryMap , redirectedReference , nonRelativeModuleName , createPerModuleNameCache ) ;
498
+ }
499
+
500
+ function getOrCreateCache < T > ( cacheWithRedirects : CacheWithRedirects < T > , redirectedReference : ResolvedProjectReference | undefined , key : string , create : ( ) => T ) : T {
501
+ const cache = cacheWithRedirects . getOrCreateMapOfCacheRedirects ( redirectedReference ) ;
502
+ let result = cache . get ( key ) ;
503
+ if ( ! result ) {
504
+ result = create ( ) ;
505
+ cache . set ( key , result ) ;
468
506
}
469
- return perModuleNameCache ;
507
+ return result ;
470
508
}
471
509
472
510
function createPerModuleNameCache ( ) : PerModuleNameCache {
@@ -560,7 +598,7 @@ namespace ts {
560
598
}
561
599
}
562
600
const containingDirectory = getDirectoryPath ( containingFile ) ;
563
- const perFolderCache = cache && cache . getOrCreateCacheForDirectory ( containingDirectory ) ;
601
+ const perFolderCache = cache && cache . getOrCreateCacheForDirectory ( containingDirectory , redirectedReference ) ;
564
602
let result = perFolderCache && perFolderCache . get ( moduleName ) ;
565
603
566
604
if ( result ) {
@@ -584,10 +622,10 @@ namespace ts {
584
622
585
623
switch ( moduleResolution ) {
586
624
case ModuleResolutionKind . NodeJs :
587
- result = nodeModuleNameResolver ( moduleName , containingFile , compilerOptions , host , cache ) ;
625
+ result = nodeModuleNameResolver ( moduleName , containingFile , compilerOptions , host , cache , redirectedReference ) ;
588
626
break ;
589
627
case ModuleResolutionKind . Classic :
590
- result = classicNameResolver ( moduleName , containingFile , compilerOptions , host , cache ) ;
628
+ result = classicNameResolver ( moduleName , containingFile , compilerOptions , host , cache , redirectedReference ) ;
591
629
break ;
592
630
default :
593
631
return Debug . fail ( `Unexpected moduleResolution: ${ moduleResolution } ` ) ;
@@ -597,7 +635,7 @@ namespace ts {
597
635
perFolderCache . set ( moduleName , result ) ;
598
636
if ( ! isExternalModuleNameRelative ( moduleName ) ) {
599
637
// put result in per-module name cache
600
- cache ! . getOrCreateCacheForModuleName ( moduleName ) . set ( containingDirectory , result ) ;
638
+ cache ! . getOrCreateCacheForModuleName ( moduleName , redirectedReference ) . set ( containingDirectory , result ) ;
601
639
}
602
640
}
603
641
}
@@ -817,14 +855,14 @@ namespace ts {
817
855
}
818
856
819
857
function tryResolveJSModuleWorker ( moduleName : string , initialDir : string , host : ModuleResolutionHost ) : ResolvedModuleWithFailedLookupLocations {
820
- return nodeModuleNameResolverWorker ( moduleName , initialDir , { moduleResolution : ModuleResolutionKind . NodeJs , allowJs : true } , host , /*cache*/ undefined , /*jsOnly*/ true ) ;
858
+ return nodeModuleNameResolverWorker ( moduleName , initialDir , { moduleResolution : ModuleResolutionKind . NodeJs , allowJs : true } , host , /*cache*/ undefined , /*redirectedReference*/ undefined , /* jsOnly*/ true ) ;
821
859
}
822
860
823
- export function nodeModuleNameResolver ( moduleName : string , containingFile : string , compilerOptions : CompilerOptions , host : ModuleResolutionHost , cache ?: ModuleResolutionCache ) : ResolvedModuleWithFailedLookupLocations {
824
- return nodeModuleNameResolverWorker ( moduleName , getDirectoryPath ( containingFile ) , compilerOptions , host , cache , /*jsOnly*/ false ) ;
861
+ export function nodeModuleNameResolver ( moduleName : string , containingFile : string , compilerOptions : CompilerOptions , host : ModuleResolutionHost , cache ?: ModuleResolutionCache , redirectedReference ?: ResolvedProjectReference ) : ResolvedModuleWithFailedLookupLocations {
862
+ return nodeModuleNameResolverWorker ( moduleName , getDirectoryPath ( containingFile ) , compilerOptions , host , cache , redirectedReference , /*jsOnly*/ false ) ;
825
863
}
826
864
827
- function nodeModuleNameResolverWorker ( moduleName : string , containingDirectory : string , compilerOptions : CompilerOptions , host : ModuleResolutionHost , cache : ModuleResolutionCache | undefined , jsOnly : boolean ) : ResolvedModuleWithFailedLookupLocations {
865
+ function nodeModuleNameResolverWorker ( moduleName : string , containingDirectory : string , compilerOptions : CompilerOptions , host : ModuleResolutionHost , cache : ModuleResolutionCache | undefined , redirectedReference : ResolvedProjectReference | undefined , jsOnly : boolean ) : ResolvedModuleWithFailedLookupLocations {
828
866
const traceEnabled = isTraceEnabled ( compilerOptions , host ) ;
829
867
830
868
const failedLookupLocations : string [ ] = [ ] ;
@@ -852,7 +890,7 @@ namespace ts {
852
890
if ( traceEnabled ) {
853
891
trace ( host , Diagnostics . Loading_module_0_from_node_modules_folder_target_file_type_1 , moduleName , Extensions [ extensions ] ) ;
854
892
}
855
- const resolved = loadModuleFromNearestNodeModulesDirectory ( extensions , moduleName , containingDirectory , state , cache ) ;
893
+ const resolved = loadModuleFromNearestNodeModulesDirectory ( extensions , moduleName , containingDirectory , state , cache , redirectedReference ) ;
856
894
if ( ! resolved ) return undefined ;
857
895
858
896
let resolvedValue = resolved . value ;
@@ -1190,17 +1228,17 @@ namespace ts {
1190
1228
return idx === - 1 ? { packageName : moduleName , rest : "" } : { packageName : moduleName . slice ( 0 , idx ) , rest : moduleName . slice ( idx + 1 ) } ;
1191
1229
}
1192
1230
1193
- function loadModuleFromNearestNodeModulesDirectory ( extensions : Extensions , moduleName : string , directory : string , state : ModuleResolutionState , cache : NonRelativeModuleNameResolutionCache | undefined ) : SearchResult < Resolved > {
1194
- return loadModuleFromNearestNodeModulesDirectoryWorker ( extensions , moduleName , directory , state , /*typesScopeOnly*/ false , cache ) ;
1231
+ function loadModuleFromNearestNodeModulesDirectory ( extensions : Extensions , moduleName : string , directory : string , state : ModuleResolutionState , cache : NonRelativeModuleNameResolutionCache | undefined , redirectedReference : ResolvedProjectReference | undefined ) : SearchResult < Resolved > {
1232
+ return loadModuleFromNearestNodeModulesDirectoryWorker ( extensions , moduleName , directory , state , /*typesScopeOnly*/ false , cache , redirectedReference ) ;
1195
1233
}
1196
1234
1197
1235
function loadModuleFromNearestNodeModulesDirectoryTypesScope ( moduleName : string , directory : string , state : ModuleResolutionState ) : SearchResult < Resolved > {
1198
1236
// Extensions parameter here doesn't actually matter, because typesOnly ensures we're just doing @types lookup, which is always DtsOnly.
1199
- return loadModuleFromNearestNodeModulesDirectoryWorker ( Extensions . DtsOnly , moduleName , directory , state , /*typesScopeOnly*/ true , /*cache*/ undefined ) ;
1237
+ return loadModuleFromNearestNodeModulesDirectoryWorker ( Extensions . DtsOnly , moduleName , directory , state , /*typesScopeOnly*/ true , /*cache*/ undefined , /*redirectedReference*/ undefined ) ;
1200
1238
}
1201
1239
1202
- function loadModuleFromNearestNodeModulesDirectoryWorker ( extensions : Extensions , moduleName : string , directory : string , state : ModuleResolutionState , typesScopeOnly : boolean , cache : NonRelativeModuleNameResolutionCache | undefined ) : SearchResult < Resolved > {
1203
- const perModuleNameCache = cache && cache . getOrCreateCacheForModuleName ( moduleName ) ;
1240
+ function loadModuleFromNearestNodeModulesDirectoryWorker ( extensions : Extensions , moduleName : string , directory : string , state : ModuleResolutionState , typesScopeOnly : boolean , cache : NonRelativeModuleNameResolutionCache | undefined , redirectedReference : ResolvedProjectReference | undefined ) : SearchResult < Resolved > {
1241
+ const perModuleNameCache = cache && cache . getOrCreateCacheForModuleName ( moduleName , redirectedReference ) ;
1204
1242
return forEachAncestorDirectory ( normalizeSlashes ( directory ) , ancestorDirectory => {
1205
1243
if ( getBaseFileName ( ancestorDirectory ) !== "node_modules" ) {
1206
1244
const resolutionFromCache = tryFindNonRelativeModuleNameInCache ( perModuleNameCache , moduleName , ancestorDirectory , state ) ;
@@ -1368,7 +1406,7 @@ namespace ts {
1368
1406
}
1369
1407
}
1370
1408
1371
- export function classicNameResolver ( moduleName : string , containingFile : string , compilerOptions : CompilerOptions , host : ModuleResolutionHost , cache ?: NonRelativeModuleNameResolutionCache ) : ResolvedModuleWithFailedLookupLocations {
1409
+ export function classicNameResolver ( moduleName : string , containingFile : string , compilerOptions : CompilerOptions , host : ModuleResolutionHost , cache ?: NonRelativeModuleNameResolutionCache , redirectedReference ?: ResolvedProjectReference ) : ResolvedModuleWithFailedLookupLocations {
1372
1410
const traceEnabled = isTraceEnabled ( compilerOptions , host ) ;
1373
1411
const failedLookupLocations : string [ ] = [ ] ;
1374
1412
const state : ModuleResolutionState = { compilerOptions, host, traceEnabled, failedLookupLocations } ;
@@ -1385,7 +1423,7 @@ namespace ts {
1385
1423
}
1386
1424
1387
1425
if ( ! isExternalModuleNameRelative ( moduleName ) ) {
1388
- const perModuleNameCache = cache && cache . getOrCreateCacheForModuleName ( moduleName ) ;
1426
+ const perModuleNameCache = cache && cache . getOrCreateCacheForModuleName ( moduleName , redirectedReference ) ;
1389
1427
// Climb up parent directories looking for a module.
1390
1428
const resolved = forEachAncestorDirectory ( containingDirectory , directory => {
1391
1429
const resolutionFromCache = tryFindNonRelativeModuleNameInCache ( perModuleNameCache , moduleName , directory , state ) ;
0 commit comments