@@ -167,7 +167,7 @@ namespace ts.server {
167
167
/**
168
168
* Set of files that was returned from the last call to getChangesSinceVersion.
169
169
*/
170
- private lastReportedFileNames : Map < true > | undefined ;
170
+ private lastReportedFileNames : Map < boolean > | undefined ;
171
171
/**
172
172
* Last version that was reported.
173
173
*/
@@ -803,6 +803,22 @@ namespace ts.server {
803
803
return result ;
804
804
}
805
805
806
+ /* @internal */
807
+ getFileNamesWithRedirectInfo ( includeProjectReferenceRedirectInfo : boolean ) {
808
+ const fileNames = this . getFileNames ( ) ;
809
+ if ( includeProjectReferenceRedirectInfo ) {
810
+ return fileNames . map ( ( fileName ) : protocol . FileWithProjectReferenceRedirectInfo => ( {
811
+ fileName,
812
+ isSourceOfProjectReferenceRedirect : this . isSourceOfProjectReferenceRedirect ( fileName )
813
+ } ) ) ;
814
+ }
815
+
816
+ return fileNames . map ( ( fileName ) : protocol . FileWithProjectReferenceRedirectInfo => ( {
817
+ fileName,
818
+ isSourceOfProjectReferenceRedirect : false
819
+ } ) ) ;
820
+ }
821
+
806
822
hasConfigFile ( configFilePath : NormalizedPath ) {
807
823
if ( this . program && this . languageServiceEnabled ) {
808
824
const configFile = this . program . getCompilerOptions ( ) . configFile ;
@@ -1301,16 +1317,13 @@ namespace ts.server {
1301
1317
1302
1318
/* @internal */
1303
1319
getChangesSinceVersion ( lastKnownVersion ?: number , includeProjectReferenceRedirectInfo ?: boolean ) : ProjectFilesWithTSDiagnostics {
1304
- const includeProjectReferenceRedirectInfoIfRequested = ( files : string [ ] ) => {
1305
- if ( includeProjectReferenceRedirectInfo ) {
1306
- return files . map ( ( fileName : string ) : protocol . FileWithProjectReferenceRedirectInfo => ( {
1320
+ const includeProjectReferenceRedirectInfoIfRequested =
1321
+ includeProjectReferenceRedirectInfo
1322
+ ? ( files : Map < boolean > ) => arrayFrom ( files . keys ( ) , ( fileName : string ) : protocol . FileWithProjectReferenceRedirectInfo => ( {
1307
1323
fileName,
1308
- isSourceOfProjectReferenceRedirect : this . program ?. isSourceOfProjectReferenceRedirect ( fileName ) ?? false
1309
- } ) ) ;
1310
- }
1311
-
1312
- return files ;
1313
- } ;
1324
+ isSourceOfProjectReferenceRedirect : files . get ( fileName ) ! // fileName guaranteed to be in files
1325
+ } ) )
1326
+ : ( files : Map < boolean > ) => arrayFrom ( files . keys ( ) ) ;
1314
1327
1315
1328
// Update the graph only if initial configured project load is not pending
1316
1329
if ( ! this . isInitialLoadPending ( ) ) {
@@ -1335,21 +1348,36 @@ namespace ts.server {
1335
1348
}
1336
1349
// compute and return the difference
1337
1350
const lastReportedFileNames = this . lastReportedFileNames ;
1338
- const externalFiles = this . getExternalFiles ( ) . map ( f => toNormalizedPath ( f ) ) ;
1339
- const currentFiles = arrayToSet ( this . getFileNames ( ) . concat ( externalFiles ) ) ;
1351
+ const externalFiles = this . getExternalFiles ( ) . map ( ( f ) : protocol . FileWithProjectReferenceRedirectInfo => ( {
1352
+ fileName : toNormalizedPath ( f ) ,
1353
+ isSourceOfProjectReferenceRedirect : false
1354
+ } ) ) ;
1355
+ const currentFiles = arrayToMap (
1356
+ this . getFileNamesWithRedirectInfo ( ! ! includeProjectReferenceRedirectInfo ) . concat ( externalFiles ) ,
1357
+ info => info . fileName ,
1358
+ info => info . isSourceOfProjectReferenceRedirect
1359
+ ) ;
1360
+
1361
+ const added : Map < boolean > = new Map < boolean > ( ) ;
1362
+ const removed : Map < boolean > = new Map < boolean > ( ) ;
1340
1363
1341
- const added : string [ ] = [ ] ;
1342
- const removed : string [ ] = [ ] ;
1343
1364
const updated : string [ ] = updatedFileNames ? arrayFrom ( updatedFileNames . keys ( ) ) : [ ] ;
1365
+ const updatedRedirects : protocol . FileWithProjectReferenceRedirectInfo [ ] = [ ] ;
1344
1366
1345
1367
forEachKey ( currentFiles , id => {
1346
1368
if ( ! lastReportedFileNames . has ( id ) ) {
1347
- added . push ( id ) ;
1369
+ added . set ( id , currentFiles . get ( id ) ! ) ; // id guaranteed to be in currentFiles
1370
+ }
1371
+ else if ( includeProjectReferenceRedirectInfo && lastReportedFileNames . get ( id ) !== currentFiles . get ( id ) ) {
1372
+ updatedRedirects . push ( {
1373
+ fileName : id ,
1374
+ isSourceOfProjectReferenceRedirect : currentFiles . get ( id ) ! // id guaranteed to be in currentFiles
1375
+ } ) ;
1348
1376
}
1349
1377
} ) ;
1350
1378
forEachKey ( lastReportedFileNames , id => {
1351
1379
if ( ! currentFiles . has ( id ) ) {
1352
- removed . push ( id ) ;
1380
+ removed . set ( id , lastReportedFileNames . get ( id ) ! ) ; // id guaranteed to be in lastReportedFileNames
1353
1381
}
1354
1382
} ) ;
1355
1383
this . lastReportedFileNames = currentFiles ;
@@ -1359,21 +1387,34 @@ namespace ts.server {
1359
1387
changes : {
1360
1388
added : includeProjectReferenceRedirectInfoIfRequested ( added ) ,
1361
1389
removed : includeProjectReferenceRedirectInfoIfRequested ( removed ) ,
1362
- updated : includeProjectReferenceRedirectInfoIfRequested ( updated )
1390
+ updated : includeProjectReferenceRedirectInfoIfRequested
1391
+ ? updated . map ( ( fileName ) : protocol . FileWithProjectReferenceRedirectInfo => ( {
1392
+ fileName,
1393
+ isSourceOfProjectReferenceRedirect : this . isSourceOfProjectReferenceRedirect ( fileName )
1394
+ } ) )
1395
+ : updated ,
1396
+ updatedRedirects : includeProjectReferenceRedirectInfo ? updatedRedirects : undefined
1363
1397
} ,
1364
1398
projectErrors : this . getGlobalProjectErrors ( )
1365
1399
} ;
1366
1400
}
1367
1401
else {
1368
1402
// unknown version - return everything
1369
- const projectFileNames = this . getFileNames ( ) ;
1370
- const externalFiles = this . getExternalFiles ( ) . map ( f => toNormalizedPath ( f ) ) ;
1403
+ const projectFileNames = this . getFileNamesWithRedirectInfo ( ! ! includeProjectReferenceRedirectInfo ) ;
1404
+ const externalFiles = this . getExternalFiles ( ) . map ( ( f ) : protocol . FileWithProjectReferenceRedirectInfo => ( {
1405
+ fileName : toNormalizedPath ( f ) ,
1406
+ isSourceOfProjectReferenceRedirect : false
1407
+ } ) ) ;
1371
1408
const allFiles = projectFileNames . concat ( externalFiles ) ;
1372
- this . lastReportedFileNames = arrayToSet ( allFiles ) ;
1409
+ this . lastReportedFileNames = arrayToMap (
1410
+ projectFileNames . concat ( externalFiles ) ,
1411
+ info => info . fileName ,
1412
+ info => info . isSourceOfProjectReferenceRedirect
1413
+ ) ;
1373
1414
this . lastReportedVersion = this . projectProgramVersion ;
1374
1415
return {
1375
1416
info,
1376
- files : includeProjectReferenceRedirectInfoIfRequested ( allFiles ) ,
1417
+ files : includeProjectReferenceRedirectInfo ? allFiles : allFiles . map ( f => f . fileName ) ,
1377
1418
projectErrors : this . getGlobalProjectErrors ( )
1378
1419
} ;
1379
1420
}
0 commit comments