@@ -1175,7 +1175,7 @@ export function getReferencedFileLocation(program: Program, ref: ReferencedFile)
11751175 switch ( kind ) {
11761176 case FileIncludeKind . Import :
11771177 const importLiteral = getModuleNameStringLiteralAt ( file , index ) ;
1178- packageId = program . resolvedModules ?. get ( file . path ) ?. get ( importLiteral . text , getModeForResolutionAtIndex ( file , index ) ) ?. resolvedModule ?. packageId ;
1178+ packageId = program . getResolvedModule ( file , importLiteral . text , getModeForResolutionAtIndex ( file , index ) ) ?. resolvedModule ?. packageId ;
11791179 if ( importLiteral . pos === - 1 ) return { file, packageId, text : importLiteral . text } ;
11801180 pos = skipTrivia ( file . text , importLiteral . pos ) ;
11811181 end = importLiteral . end ;
@@ -1185,7 +1185,7 @@ export function getReferencedFileLocation(program: Program, ref: ReferencedFile)
11851185 break ;
11861186 case FileIncludeKind . TypeReferenceDirective :
11871187 ( { pos, end, resolutionMode } = file . typeReferenceDirectives [ index ] ) ;
1188- packageId = program . resolvedTypeReferenceDirectiveNames ?. get ( file . path ) ?. get ( toFileNameLowerCase ( file . typeReferenceDirectives [ index ] . fileName ) , resolutionMode || file . impliedNodeFormat ) ?. resolvedTypeReferenceDirective ?. packageId ;
1188+ packageId = program . getResolvedTypeReferenceDirective ( file , toFileNameLowerCase ( file . typeReferenceDirectives [ index ] . fileName ) , resolutionMode || file . impliedNodeFormat ) ?. resolvedTypeReferenceDirective ?. packageId ;
11891189 break ;
11901190 case FileIncludeKind . LibReferenceDirective :
11911191 ( { pos, end } = file . libReferenceDirectives [ index ] ) ;
@@ -1886,6 +1886,10 @@ export function createProgram(rootNamesOrOptions: readonly string[] | CreateProg
18861886 resolvedModules,
18871887 resolvedTypeReferenceDirectiveNames,
18881888 resolvedLibReferences,
1889+ getResolvedModule,
1890+ getResolvedTypeReferenceDirective,
1891+ forEachResolvedModule,
1892+ forEachResolvedTypeReferenceDirective,
18891893 getCurrentPackagesMap : ( ) => packageMap ,
18901894 typesPackageExists,
18911895 packageBundlesTypes,
@@ -1935,18 +1939,47 @@ export function createProgram(rootNamesOrOptions: readonly string[] | CreateProg
19351939
19361940 return program ;
19371941
1942+ function getResolvedModule ( file : SourceFile , moduleName : string , mode : ResolutionMode ) {
1943+ return resolvedModules ?. get ( file . path ) ?. get ( moduleName , mode ) ;
1944+ }
1945+
1946+ function getResolvedTypeReferenceDirective ( file : SourceFile , typeDirectiveName : string , mode : ResolutionMode ) {
1947+ return resolvedTypeReferenceDirectiveNames ?. get ( file . path ) ?. get ( typeDirectiveName , mode ) ;
1948+ }
1949+
1950+ function forEachResolvedModule (
1951+ callback : ( resolution : ResolvedModuleWithFailedLookupLocations , moduleName : string , mode : ResolutionMode , filePath : Path ) => void ,
1952+ file ?: SourceFile ,
1953+ ) {
1954+ forEachResolution ( resolvedModules , callback , file ) ;
1955+ }
1956+
1957+ function forEachResolvedTypeReferenceDirective (
1958+ callback : ( resolution : ResolvedTypeReferenceDirectiveWithFailedLookupLocations , moduleName : string , mode : ResolutionMode , filePath : Path ) => void ,
1959+ file ?: SourceFile ,
1960+ ) : void {
1961+ forEachResolution ( resolvedTypeReferenceDirectiveNames , callback , file ) ;
1962+ }
1963+
1964+ function forEachResolution < T > (
1965+ resolutionCache : Map < Path , ModeAwareCache < T > > | undefined ,
1966+ callback : ( resolution : T , moduleName : string , mode : ResolutionMode , filePath : Path ) => void ,
1967+ file : SourceFile | undefined ,
1968+ ) {
1969+ if ( file ) resolutionCache ?. get ( file . path ) ?. forEach ( ( resolution , name , mode ) => callback ( resolution , name , mode , file . path ) ) ;
1970+ else resolutionCache ?. forEach ( ( resolutions , filePath ) => resolutions . forEach ( ( resolution , name , mode ) => callback ( resolution , name , mode , filePath ) ) ) ;
1971+ }
1972+
19381973 function getPackagesMap ( ) {
19391974 if ( packageMap ) return packageMap ;
19401975 packageMap = new Map ( ) ;
19411976 // A package name maps to true when we detect it has .d.ts files.
19421977 // This is useful as an approximation of whether a package bundles its own types.
19431978 // Note: we only look at files already found by module resolution,
19441979 // so there may be files we did not consider.
1945- files . forEach ( sf =>
1946- resolvedModules ?. get ( sf . path ) ?. forEach ( ( { resolvedModule } ) => {
1947- if ( resolvedModule ?. packageId ) packageMap ! . set ( resolvedModule . packageId . name , resolvedModule . extension === Extension . Dts || ! ! packageMap ! . get ( resolvedModule . packageId . name ) ) ;
1948- } )
1949- ) ;
1980+ forEachResolvedModule ( ( { resolvedModule } ) => {
1981+ if ( resolvedModule ?. packageId ) packageMap ! . set ( resolvedModule . packageId . name , resolvedModule . extension === Extension . Dts || ! ! packageMap ! . get ( resolvedModule . packageId . name ) ) ;
1982+ } ) ;
19501983 return packageMap ;
19511984 }
19521985
@@ -2119,7 +2152,7 @@ export function createProgram(rootNamesOrOptions: readonly string[] | CreateProg
21192152 // If the source file is unchanged and doesnt have invalidated resolution, reuse the module resolutions
21202153 if ( file === oldSourceFile && ! hasInvalidatedResolutions ( file . path ) ) {
21212154 const mode = getModeForUsageLocation ( file , moduleName ) ;
2122- const oldResolution = oldProgram ?. resolvedModules ?. get ( file . path ) ?. get ( moduleName . text , mode ) ;
2155+ const oldResolution = oldProgram ?. getResolvedModule ( file , moduleName . text , mode ) ;
21232156 if ( oldResolution ?. resolvedModule ) {
21242157 if ( isTraceEnabled ( options , host ) ) {
21252158 trace (
@@ -2187,7 +2220,7 @@ export function createProgram(rootNamesOrOptions: readonly string[] | CreateProg
21872220 // If we change our policy of rechecking failed lookups on each program create,
21882221 // we should adjust the value returned here.
21892222 function moduleNameResolvesToAmbientModuleInNonModifiedFile ( moduleName : StringLiteralLike ) : boolean {
2190- const resolutionToFile = oldProgram ?. resolvedModules ?. get ( file . path ) ?. get ( moduleName . text , getModeForUsageLocation ( file , moduleName ) ) ?. resolvedModule ;
2223+ const resolutionToFile = oldProgram ?. getResolvedModule ( file , moduleName . text , getModeForUsageLocation ( file , moduleName ) ) ?. resolvedModule ;
21912224 const resolvedFile = resolutionToFile && oldProgram ! . getSourceFile ( resolutionToFile . resolvedFileName ) ;
21922225 if ( resolutionToFile && resolvedFile ) {
21932226 // In the old program, we resolved to an ambient module that was in the same
@@ -2234,7 +2267,9 @@ export function createProgram(rootNamesOrOptions: readonly string[] | CreateProg
22342267 if ( canReuseResolutions ) {
22352268 const typeDirectiveName = getTypeReferenceResolutionName ( entry ) ;
22362269 const mode = getModeForFileReference ( entry , containingSourceFile ?. impliedNodeFormat ) ;
2237- const oldResolution = ( ! isString ( containingFile ) ? oldProgram ?. resolvedTypeReferenceDirectiveNames ?. get ( containingFile . path ) : oldProgram ?. getAutomaticTypeDirectiveResolutions ( ) ) ?. get ( typeDirectiveName , mode ) ;
2270+ const oldResolution = ! isString ( containingFile ) ?
2271+ oldProgram ?. getResolvedTypeReferenceDirective ( containingFile , typeDirectiveName , mode ) :
2272+ oldProgram ?. getAutomaticTypeDirectiveResolutions ( ) ?. get ( typeDirectiveName , mode ) ;
22382273 if ( oldResolution ?. resolvedTypeReferenceDirective ) {
22392274 if ( isTraceEnabled ( options , host ) ) {
22402275 trace (
@@ -2476,22 +2511,29 @@ export function createProgram(rootNamesOrOptions: readonly string[] | CreateProg
24762511 const moduleNames = getModuleNames ( newSourceFile ) ;
24772512 const resolutions = resolveModuleNamesReusingOldState ( moduleNames , newSourceFile ) ;
24782513 ( resolvedModulesProcessing ??= new Map ( ) ) . set ( newSourceFile . path , resolutions ) ;
2479- const oldResolutions = oldProgram . resolvedModules ?. get ( newSourceFile . path ) ;
24802514 // ensure that module resolution results are still correct
2481- const resolutionsChanged = hasChangesInResolutions ( moduleNames , newSourceFile , resolutions , oldResolutions , moduleResolutionIsEqualTo , moduleResolutionNameAndModeGetter ) ;
2515+ const resolutionsChanged = hasChangesInResolutions (
2516+ moduleNames ,
2517+ newSourceFile ,
2518+ resolutions ,
2519+ ( name , mode ) => oldProgram ! . getResolvedModule ( newSourceFile , name , mode ) ,
2520+ moduleResolutionIsEqualTo ,
2521+ moduleResolutionNameAndModeGetter ,
2522+ ) ;
24822523 if ( resolutionsChanged ) structureIsReused = StructureIsReused . SafeModules ;
24832524 const typesReferenceDirectives = newSourceFile . typeReferenceDirectives ;
24842525 const typeReferenceResolutions = resolveTypeReferenceDirectiveNamesReusingOldState ( typesReferenceDirectives , newSourceFile ) ;
24852526 ( resolvedTypeReferenceDirectiveNamesProcessing ??= new Map ( ) ) . set ( newSourceFile . path , typeReferenceResolutions ) ;
24862527 // ensure that types resolutions are still correct
2487- const oldTypeResolutions = oldProgram . resolvedTypeReferenceDirectiveNames ?. get ( newSourceFile . path ) ;
2488- const typeReferenceResolutionsChanged = hasChangesInResolutions ( typesReferenceDirectives , newSourceFile , typeReferenceResolutions , oldTypeResolutions , typeDirectiveIsEqualTo , typeReferenceResolutionNameAndModeGetter ) ;
2489- if ( typeReferenceResolutionsChanged ) {
2490- structureIsReused = StructureIsReused . SafeModules ;
2491- }
2492- else if ( oldTypeResolutions ) {
2493- ( resolvedTypeReferenceDirectiveNamesProcessing ??= new Map ( ) ) . set ( newSourceFile . path , oldTypeResolutions ) ;
2494- }
2528+ const typeReferenceResolutionsChanged = hasChangesInResolutions (
2529+ typesReferenceDirectives ,
2530+ newSourceFile ,
2531+ typeReferenceResolutions ,
2532+ ( name , mode ) => oldProgram ?. getResolvedTypeReferenceDirective ( newSourceFile , name , mode ) ,
2533+ typeDirectiveIsEqualTo ,
2534+ typeReferenceResolutionNameAndModeGetter ,
2535+ ) ;
2536+ if ( typeReferenceResolutionsChanged ) structureIsReused = StructureIsReused . SafeModules ;
24952537 }
24962538
24972539 if ( structureIsReused !== StructureIsReused . Completely ) {
@@ -4931,7 +4973,7 @@ export function createProgram(rootNamesOrOptions: readonly string[] | CreateProg
49314973 symlinks = createSymlinkCache ( currentDirectory , getCanonicalFileName ) ;
49324974 }
49334975 if ( files && ! symlinks . hasProcessedResolutions ( ) ) {
4934- symlinks . setSymlinksFromResolutions ( resolvedModules , resolvedTypeReferenceDirectiveNames , automaticTypeDirectiveResolutions ) ;
4976+ symlinks . setSymlinksFromResolutions ( forEachResolvedModule , forEachResolvedTypeReferenceDirective , automaticTypeDirectiveResolutions ) ;
49354977 }
49364978 return symlinks ;
49374979 }
0 commit comments