@@ -1369,7 +1369,7 @@ namespace ts {
1369
1369
const seenPackageNames = new Map < string , SeenPackageName > ( ) ;
1370
1370
1371
1371
for ( const oldSourceFile of oldProgram . getSourceFiles ( ) ) {
1372
- let newSourceFile = host . getSourceFileByPath
1372
+ const newSourceFile = host . getSourceFileByPath
1373
1373
? host . getSourceFileByPath ( oldSourceFile . fileName , oldSourceFile . resolvedPath , options . target ! , /*onError*/ undefined , shouldCreateNewSourceFile )
1374
1374
: host . getSourceFile ( oldSourceFile . fileName , options . target ! , /*onError*/ undefined , shouldCreateNewSourceFile ) ; // TODO: GH#18217
1375
1375
@@ -1387,12 +1387,15 @@ namespace ts {
1387
1387
// Underlying file has changed. Might not redirect anymore. Must rebuild program.
1388
1388
return StructureIsReused . Not ;
1389
1389
}
1390
- fileChanged = false ;
1391
- newSourceFile = oldSourceFile ; // Use the redirect.
1390
+ // redirect target should already be present
1391
+ Debug . checkDefined ( find ( newSourceFiles , f => f . path === oldSourceFile . redirectInfo ?. redirectTarget . path ) ) ;
1392
+ // Add to the newSourceFiles for now and handle redirect if program is used completely
1393
+ newSourceFiles . push ( newSourceFile ) ;
1394
+ continue ;
1392
1395
}
1393
1396
else if ( oldProgram . redirectTargetsMap . has ( oldSourceFile . path ) ) {
1394
1397
// If a redirected-to source file changes, the redirect may be broken.
1395
- if ( newSourceFile !== oldSourceFile ) {
1398
+ if ( newSourceFile . version !== oldSourceFile . version ) {
1396
1399
return StructureIsReused . Not ;
1397
1400
}
1398
1401
fileChanged = false ;
@@ -1527,11 +1530,24 @@ namespace ts {
1527
1530
1528
1531
// update fileName -> file mapping
1529
1532
Debug . assert ( newSourceFiles . length === oldProgram . getSourceFiles ( ) . length ) ;
1530
- for ( const newSourceFile of newSourceFiles ) {
1531
- filesByName . set ( newSourceFile . path , newSourceFile ) ;
1532
- // Ensure imports are calculated if the file version didnt change so but its different instance of file
1533
- collectExternalModuleReferences ( newSourceFile ) ;
1534
- }
1533
+ newSourceFiles . forEach ( ( newSourceFile , index ) => {
1534
+ // Update file if its redirecting to different file
1535
+ const oldSourceFile = oldProgram ! . getSourceFiles ( ) [ index ] ;
1536
+ if ( oldSourceFile . redirectInfo ) {
1537
+ const newRedirectTarget = filesByName . get ( oldSourceFile . redirectInfo . redirectTarget . path ) as SourceFile ;
1538
+ newSourceFile = newRedirectTarget === oldSourceFile . redirectInfo . redirectTarget ?
1539
+ oldSourceFile :
1540
+ // Create new redirect file
1541
+ createRedirectSourceFile ( newRedirectTarget , newSourceFile , oldSourceFile . fileName , oldSourceFile . path , oldSourceFile . resolvedPath , oldSourceFile . originalFileName ) ;
1542
+ newSourceFiles [ index ] = newSourceFile ;
1543
+ filesByName . set ( newSourceFile . path , newSourceFile ) ;
1544
+ }
1545
+ else {
1546
+ filesByName . set ( newSourceFile . path , newSourceFile ) ;
1547
+ // Ensure imports are calculated if the file version didnt change so but its different instance of file
1548
+ collectExternalModuleReferences ( newSourceFile ) ;
1549
+ }
1550
+ } ) ;
1535
1551
const oldFilesByNameMap = oldProgram . getFilesByNameMap ( ) ;
1536
1552
oldFilesByNameMap . forEach ( ( oldFile , path ) => {
1537
1553
if ( ! oldFile ) {
@@ -2417,7 +2433,6 @@ namespace ts {
2417
2433
redirect . resolvedPath = resolvedPath ;
2418
2434
redirect . originalFileName = originalFileName ;
2419
2435
redirect . redirectInfo = { redirectTarget, unredirected } ;
2420
- sourceFilesFoundSearchingNodeModules . set ( path , currentNodeModulesDepth > 0 ) ;
2421
2436
Object . defineProperties ( redirect , {
2422
2437
id : {
2423
2438
get ( this : SourceFile ) { return this . redirectInfo ! . redirectTarget . id ; } ,
@@ -2542,7 +2557,7 @@ namespace ts {
2542
2557
const dupFile = createRedirectSourceFile ( fileFromPackageId , file ! , fileName , path , toPath ( fileName ) , originalFileName ) ; // TODO: GH#18217
2543
2558
redirectTargetsMap . add ( fileFromPackageId . path , fileName ) ;
2544
2559
addFileToFilesByName ( dupFile , path , redirectedPath ) ;
2545
- sourceFileToPackageName . set ( path , packageId . name ) ;
2560
+ sourceFilesFoundSearchingNodeModules . set ( path , currentNodeModulesDepth > 0 ) ;
2546
2561
processingOtherFiles ! . push ( dupFile ) ;
2547
2562
return dupFile ;
2548
2563
}
0 commit comments