@@ -167,7 +167,7 @@ namespace ts.server {
167167 /**
168168 * Set of files that was returned from the last call to getChangesSinceVersion.
169169 */
170- private lastReportedFileNames : Map < true > | undefined ;
170+ private lastReportedFileNames : Map < boolean > | undefined ;
171171 /**
172172 * Last version that was reported.
173173 */
@@ -803,6 +803,22 @@ namespace ts.server {
803803 return result ;
804804 }
805805
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+
806822 hasConfigFile ( configFilePath : NormalizedPath ) {
807823 if ( this . program && this . languageServiceEnabled ) {
808824 const configFile = this . program . getCompilerOptions ( ) . configFile ;
@@ -1301,16 +1317,13 @@ namespace ts.server {
13011317
13021318 /* @internal */
13031319 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 => ( {
13071323 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 ( ) ) ;
13141327
13151328 // Update the graph only if initial configured project load is not pending
13161329 if ( ! this . isInitialLoadPending ( ) ) {
@@ -1335,21 +1348,36 @@ namespace ts.server {
13351348 }
13361349 // compute and return the difference
13371350 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 > ( ) ;
13401363
1341- const added : string [ ] = [ ] ;
1342- const removed : string [ ] = [ ] ;
13431364 const updated : string [ ] = updatedFileNames ? arrayFrom ( updatedFileNames . keys ( ) ) : [ ] ;
1365+ const updatedRedirects : protocol . FileWithProjectReferenceRedirectInfo [ ] = [ ] ;
13441366
13451367 forEachKey ( currentFiles , id => {
13461368 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+ } ) ;
13481376 }
13491377 } ) ;
13501378 forEachKey ( lastReportedFileNames , id => {
13511379 if ( ! currentFiles . has ( id ) ) {
1352- removed . push ( id ) ;
1380+ removed . set ( id , lastReportedFileNames . get ( id ) ! ) ; // id guaranteed to be in lastReportedFileNames
13531381 }
13541382 } ) ;
13551383 this . lastReportedFileNames = currentFiles ;
@@ -1359,21 +1387,34 @@ namespace ts.server {
13591387 changes : {
13601388 added : includeProjectReferenceRedirectInfoIfRequested ( added ) ,
13611389 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
13631397 } ,
13641398 projectErrors : this . getGlobalProjectErrors ( )
13651399 } ;
13661400 }
13671401 else {
13681402 // 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+ } ) ) ;
13711408 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+ ) ;
13731414 this . lastReportedVersion = this . projectProgramVersion ;
13741415 return {
13751416 info,
1376- files : includeProjectReferenceRedirectInfoIfRequested ( allFiles ) ,
1417+ files : includeProjectReferenceRedirectInfo ? allFiles : allFiles . map ( f => f . fileName ) ,
13771418 projectErrors : this . getGlobalProjectErrors ( )
13781419 } ;
13791420 }
0 commit comments