@@ -65,6 +65,7 @@ module ts.server {
65
65
ls : ts . LanguageService = null ;
66
66
compilationSettings : ts . CompilerOptions ;
67
67
filenameToScript : ts . Map < ScriptInfo > = { } ;
68
+ roots : ScriptInfo [ ] = [ ] ;
68
69
69
70
constructor ( public host : ServerHost , public project : Project ) {
70
71
}
@@ -144,7 +145,7 @@ module ts.server {
144
145
var scriptInfo = ts . lookUp ( this . filenameToScript , info . fileName ) ;
145
146
if ( ! scriptInfo ) {
146
147
this . filenameToScript [ info . fileName ] = info ;
147
- return info ;
148
+ this . roots . push ( info ) ;
148
149
}
149
150
}
150
151
@@ -286,10 +287,12 @@ module ts.server {
286
287
return this . filenameToSourceFile [ info . fileName ] ;
287
288
}
288
289
289
- getSourceFileFromName ( filename : string ) {
290
+ getSourceFileFromName ( filename : string , requireOpen ?: boolean ) {
290
291
var info = this . projectService . getScriptInfo ( filename ) ;
291
292
if ( info ) {
292
- return this . getSourceFile ( info ) ;
293
+ if ( ( ! requireOpen ) || info . isOpen ) {
294
+ return this . getSourceFile ( info ) ;
295
+ }
293
296
}
294
297
}
295
298
@@ -324,7 +327,7 @@ module ts.server {
324
327
// add a root file to project
325
328
addRoot ( info : ScriptInfo ) {
326
329
info . defaultProject = this ;
327
- return this . compilerService . host . addRoot ( info ) ;
330
+ this . compilerService . host . addRoot ( info ) ;
328
331
}
329
332
330
333
filesToString ( ) {
@@ -360,7 +363,7 @@ module ts.server {
360
363
}
361
364
362
365
interface ProjectServiceEventHandler {
363
- ( eventName : string , project : Project ) : void ;
366
+ ( eventName : string , project : Project , fileName : string ) : void ;
364
367
}
365
368
366
369
export class ProjectService {
@@ -392,7 +395,6 @@ module ts.server {
392
395
}
393
396
}
394
397
395
-
396
398
log ( msg : string , type = "Err" ) {
397
399
this . psLogger . msg ( msg , type ) ;
398
400
}
@@ -423,7 +425,20 @@ module ts.server {
423
425
for ( var i = 0 , len = referencingProjects . length ; i < len ; i ++ ) {
424
426
referencingProjects [ i ] . removeReferencedFile ( info ) ;
425
427
}
428
+ for ( var j = 0 , flen = this . openFileRoots . length ; j < flen ; j ++ ) {
429
+ var openFile = this . openFileRoots [ j ] ;
430
+ if ( this . eventHandler ) {
431
+ this . eventHandler ( "context" , openFile . defaultProject , openFile . fileName ) ;
432
+ }
433
+ }
434
+ for ( var j = 0 , flen = this . openFilesReferenced . length ; j < flen ; j ++ ) {
435
+ var openFile = this . openFilesReferenced [ j ] ;
436
+ if ( this . eventHandler ) {
437
+ this . eventHandler ( "context" , openFile . defaultProject , openFile . fileName ) ;
438
+ }
439
+ }
426
440
}
441
+
427
442
this . printProjects ( ) ;
428
443
}
429
444
@@ -503,19 +518,52 @@ module ts.server {
503
518
info . close ( ) ;
504
519
}
505
520
506
- findReferencingProjects ( info : ScriptInfo ) {
521
+ findReferencingProjects ( info : ScriptInfo , excludedProject ?: Project ) {
507
522
var referencingProjects : Project [ ] = [ ] ;
508
523
info . defaultProject = undefined ;
509
524
for ( var i = 0 , len = this . inferredProjects . length ; i < len ; i ++ ) {
510
525
this . inferredProjects [ i ] . updateGraph ( ) ;
511
- if ( this . inferredProjects [ i ] . getSourceFile ( info ) ) {
512
- info . defaultProject = this . inferredProjects [ i ] ;
513
- referencingProjects . push ( this . inferredProjects [ i ] ) ;
526
+ if ( this . inferredProjects [ i ] != excludedProject ) {
527
+ if ( this . inferredProjects [ i ] . getSourceFile ( info ) ) {
528
+ info . defaultProject = this . inferredProjects [ i ] ;
529
+ referencingProjects . push ( this . inferredProjects [ i ] ) ;
530
+ }
514
531
}
515
532
}
516
533
return referencingProjects ;
517
534
}
518
535
536
+ updateProjectStructure ( ) {
537
+ this . log ( "updating project structure from ..." , "Info" ) ;
538
+ this . printProjects ( ) ;
539
+ for ( var i = 0 , len = this . openFilesReferenced . length ; i < len ; i ++ ) {
540
+ var refdFile = this . openFilesReferenced [ i ] ;
541
+ refdFile . defaultProject . updateGraph ( ) ;
542
+ var sourceFile = refdFile . defaultProject . getSourceFile ( refdFile ) ;
543
+ if ( ! sourceFile ) {
544
+ this . openFilesReferenced = copyListRemovingItem ( refdFile , this . openFilesReferenced ) ;
545
+ this . addOpenFile ( refdFile ) ;
546
+ }
547
+ }
548
+ var openFileRoots : ScriptInfo [ ] = [ ] ;
549
+ for ( var i = 0 , len = this . openFileRoots . length ; i < len ; i ++ ) {
550
+ var rootFile = this . openFileRoots [ i ] ;
551
+ var rootedProject = rootFile . defaultProject ;
552
+ var referencingProjects = this . findReferencingProjects ( rootFile , rootedProject ) ;
553
+ if ( referencingProjects . length == 0 ) {
554
+ rootFile . defaultProject = rootedProject ;
555
+ openFileRoots . push ( rootFile ) ;
556
+ }
557
+ else {
558
+ // remove project from inferred projects list
559
+ this . inferredProjects = copyListRemovingItem ( rootedProject , this . inferredProjects ) ;
560
+ this . openFilesReferenced . push ( rootFile ) ;
561
+ }
562
+ }
563
+ this . openFileRoots = openFileRoots ;
564
+ this . printProjects ( ) ;
565
+ }
566
+
519
567
getScriptInfo ( filename : string ) {
520
568
filename = ts . normalizePath ( filename ) ;
521
569
return ts . lookUp ( this . filenameToScriptInfo , filename ) ;
@@ -621,6 +669,7 @@ module ts.server {
621
669
this . psLogger . startGroup ( ) ;
622
670
for ( var i = 0 , len = this . inferredProjects . length ; i < len ; i ++ ) {
623
671
var project = this . inferredProjects [ i ] ;
672
+ project . updateGraph ( ) ;
624
673
this . psLogger . info ( "Project " + i . toString ( ) ) ;
625
674
this . psLogger . info ( project . filesToString ( ) ) ;
626
675
this . psLogger . info ( "-----------------------------------------------" ) ;
0 commit comments