@@ -186,23 +186,25 @@ namespace ts.projectSystem {
186
186
}
187
187
}
188
188
189
- export function createSession ( host : server . ServerHost , typingsInstaller ?: server . ITypingsInstaller , projectServiceEventHandler ?: server . ProjectServiceEventHandler , cancellationToken ?: server . ServerCancellationToken , throttleWaitMilliseconds ?: number ) {
190
- if ( typingsInstaller === undefined ) {
191
- typingsInstaller = new TestTypingsInstaller ( "/a/data/" , /*throttleLimit*/ 5 , host ) ;
189
+ export function createSession ( host : server . ServerHost , opts : Partial < server . SessionOptions > = { } ) {
190
+ if ( opts . typingsInstaller === undefined ) {
191
+ opts . typingsInstaller = new TestTypingsInstaller ( "/a/data/" , /*throttleLimit*/ 5 , host ) ;
192
192
}
193
- const opts : server . SessionOptions = {
193
+ if ( opts . eventHandler !== undefined ) {
194
+ opts . canUseEvents = true ;
195
+ }
196
+ return new TestSession ( {
194
197
host,
195
- cancellationToken : cancellationToken || server . nullCancellationToken ,
198
+ cancellationToken : server . nullCancellationToken ,
196
199
useSingleInferredProject : false ,
197
- typingsInstaller,
200
+ useInferredProjectPerProjectRoot : false ,
201
+ typingsInstaller : opts . typingsInstaller ,
198
202
byteLength : Utils . byteLength ,
199
203
hrtime : process . hrtime ,
200
204
logger : nullLogger ,
201
- canUseEvents : projectServiceEventHandler !== undefined ,
202
- eventHandler : projectServiceEventHandler ,
203
- throttleWaitMilliseconds
204
- } ;
205
- return new TestSession ( opts ) ;
205
+ canUseEvents : false ,
206
+ ...opts
207
+ } ) ;
206
208
}
207
209
208
210
export interface CreateProjectServiceParameters {
@@ -216,9 +218,16 @@ namespace ts.projectSystem {
216
218
217
219
export class TestProjectService extends server . ProjectService {
218
220
constructor ( host : server . ServerHost , logger : server . Logger , cancellationToken : HostCancellationToken , useSingleInferredProject : boolean ,
219
- typingsInstaller : server . ITypingsInstaller , eventHandler : server . ProjectServiceEventHandler ) {
221
+ typingsInstaller : server . ITypingsInstaller , eventHandler : server . ProjectServiceEventHandler , opts : Partial < server . ProjectServiceOptions > = { } ) {
220
222
super ( {
221
- host, logger, cancellationToken, useSingleInferredProject, typingsInstaller, eventHandler
223
+ host,
224
+ logger,
225
+ cancellationToken,
226
+ useSingleInferredProject,
227
+ useInferredProjectPerProjectRoot : false ,
228
+ typingsInstaller,
229
+ eventHandler,
230
+ ...opts
222
231
} ) ;
223
232
}
224
233
@@ -632,7 +641,7 @@ namespace ts.projectSystem {
632
641
}
633
642
}
634
643
635
- describe ( "tsserver-project-system " , ( ) => {
644
+ describe ( "tsserverProjectSystem " , ( ) => {
636
645
const commonFile1 : FileOrFolder = {
637
646
path : "/a/b/commonFile1.ts" ,
638
647
content : "let x = 1"
@@ -2231,13 +2240,16 @@ namespace ts.projectSystem {
2231
2240
filePath === f2 . path ? server . maxProgramSizeForNonTsFiles + 1 : originalGetFileSize . call ( host , filePath ) ;
2232
2241
2233
2242
let lastEvent : server . ProjectLanguageServiceStateEvent ;
2234
- const session = createSession ( host , /*typingsInstaller*/ undefined , e => {
2235
- if ( e . eventName === server . ConfigFileDiagEvent || e . eventName === server . ContextEvent || e . eventName === server . ProjectInfoTelemetryEvent ) {
2236
- return ;
2243
+ const session = createSession ( host , {
2244
+ canUseEvents : true ,
2245
+ eventHandler : e => {
2246
+ if ( e . eventName === server . ConfigFileDiagEvent || e . eventName === server . ContextEvent || e . eventName === server . ProjectInfoTelemetryEvent ) {
2247
+ return ;
2248
+ }
2249
+ assert . equal ( e . eventName , server . ProjectLanguageServiceStateEvent ) ;
2250
+ assert . equal ( e . data . project . getProjectName ( ) , config . path , "project name" ) ;
2251
+ lastEvent = < server . ProjectLanguageServiceStateEvent > e ;
2237
2252
}
2238
- assert . equal ( e . eventName , server . ProjectLanguageServiceStateEvent ) ;
2239
- assert . equal ( e . data . project . getProjectName ( ) , config . path , "project name" ) ;
2240
- lastEvent = < server . ProjectLanguageServiceStateEvent > e ;
2241
2253
} ) ;
2242
2254
session . executeCommand ( < protocol . OpenRequest > {
2243
2255
seq : 0 ,
@@ -2281,12 +2293,15 @@ namespace ts.projectSystem {
2281
2293
host . getFileSize = ( filePath : string ) =>
2282
2294
filePath === f2 . path ? server . maxProgramSizeForNonTsFiles + 1 : originalGetFileSize . call ( host , filePath ) ;
2283
2295
let lastEvent : server . ProjectLanguageServiceStateEvent ;
2284
- const session = createSession ( host , /*typingsInstaller*/ undefined , e => {
2285
- if ( e . eventName === server . ConfigFileDiagEvent || e . eventName === server . ProjectInfoTelemetryEvent ) {
2286
- return ;
2296
+ const session = createSession ( host , {
2297
+ canUseEvents : true ,
2298
+ eventHandler : e => {
2299
+ if ( e . eventName === server . ConfigFileDiagEvent || e . eventName === server . ProjectInfoTelemetryEvent ) {
2300
+ return ;
2301
+ }
2302
+ assert . equal ( e . eventName , server . ProjectLanguageServiceStateEvent ) ;
2303
+ lastEvent = < server . ProjectLanguageServiceStateEvent > e ;
2287
2304
}
2288
- assert . equal ( e . eventName , server . ProjectLanguageServiceStateEvent ) ;
2289
- lastEvent = < server . ProjectLanguageServiceStateEvent > e ;
2290
2305
} ) ;
2291
2306
session . executeCommand ( < protocol . OpenRequest > {
2292
2307
seq : 0 ,
@@ -3070,7 +3085,10 @@ namespace ts.projectSystem {
3070
3085
} ;
3071
3086
3072
3087
const host = createServerHost ( [ file , configFile ] ) ;
3073
- const session = createSession ( host , /*typingsInstaller*/ undefined , serverEventManager . handler ) ;
3088
+ const session = createSession ( host , {
3089
+ canUseEvents : true ,
3090
+ eventHandler : serverEventManager . handler
3091
+ } ) ;
3074
3092
openFilesForSession ( [ file ] , session ) ;
3075
3093
serverEventManager . checkEventCountOfType ( "configFileDiag" , 1 ) ;
3076
3094
@@ -3097,7 +3115,10 @@ namespace ts.projectSystem {
3097
3115
} ;
3098
3116
3099
3117
const host = createServerHost ( [ file , configFile ] ) ;
3100
- const session = createSession ( host , /*typingsInstaller*/ undefined , serverEventManager . handler ) ;
3118
+ const session = createSession ( host , {
3119
+ canUseEvents : true ,
3120
+ eventHandler : serverEventManager . handler
3121
+ } ) ;
3101
3122
openFilesForSession ( [ file ] , session ) ;
3102
3123
serverEventManager . checkEventCountOfType ( "configFileDiag" , 1 ) ;
3103
3124
} ) ;
@@ -3116,7 +3137,10 @@ namespace ts.projectSystem {
3116
3137
} ;
3117
3138
3118
3139
const host = createServerHost ( [ file , configFile ] ) ;
3119
- const session = createSession ( host , /*typingsInstaller*/ undefined , serverEventManager . handler ) ;
3140
+ const session = createSession ( host , {
3141
+ canUseEvents : true ,
3142
+ eventHandler : serverEventManager . handler
3143
+ } ) ;
3120
3144
openFilesForSession ( [ file ] , session ) ;
3121
3145
serverEventManager . checkEventCountOfType ( "configFileDiag" , 1 ) ;
3122
3146
@@ -3505,6 +3529,93 @@ namespace ts.projectSystem {
3505
3529
checkNumberOfProjects ( projectService , { inferredProjects : 1 } ) ;
3506
3530
checkProjectActualFiles ( projectService . inferredProjects [ 0 ] , [ f . path ] ) ;
3507
3531
} ) ;
3532
+
3533
+ it ( "inferred projects per project root" , ( ) => {
3534
+ const file1 = { path : "/a/file1.ts" , content : "let x = 1;" , projectRootPath : "/a" } ;
3535
+ const file2 = { path : "/a/file2.ts" , content : "let y = 2;" , projectRootPath : "/a" } ;
3536
+ const file3 = { path : "/b/file2.ts" , content : "let x = 3;" , projectRootPath : "/b" } ;
3537
+ const file4 = { path : "/c/file3.ts" , content : "let z = 4;" } ;
3538
+ const host = createServerHost ( [ file1 , file2 , file3 , file4 ] ) ;
3539
+ const session = createSession ( host , {
3540
+ useSingleInferredProject : true ,
3541
+ useInferredProjectPerProjectRoot : true
3542
+ } ) ;
3543
+ session . executeCommand ( < server . protocol . SetCompilerOptionsForInferredProjectsRequest > {
3544
+ seq : 1 ,
3545
+ type : "request" ,
3546
+ command : CommandNames . CompilerOptionsForInferredProjects ,
3547
+ arguments : {
3548
+ options : {
3549
+ allowJs : true ,
3550
+ target : ScriptTarget . ESNext
3551
+ }
3552
+ }
3553
+ } ) ;
3554
+ session . executeCommand ( < server . protocol . SetCompilerOptionsForInferredProjectsRequest > {
3555
+ seq : 2 ,
3556
+ type : "request" ,
3557
+ command : CommandNames . CompilerOptionsForInferredProjects ,
3558
+ arguments : {
3559
+ options : {
3560
+ allowJs : true ,
3561
+ target : ScriptTarget . ES2015
3562
+ } ,
3563
+ projectRootPath : "/b"
3564
+ }
3565
+ } ) ;
3566
+ session . executeCommand ( < server . protocol . OpenRequest > {
3567
+ seq : 3 ,
3568
+ type : "request" ,
3569
+ command : CommandNames . Open ,
3570
+ arguments : {
3571
+ file : file1 . path ,
3572
+ fileContent : file1 . content ,
3573
+ scriptKindName : "JS" ,
3574
+ projectRootPath : file1 . projectRootPath
3575
+ }
3576
+ } ) ;
3577
+ session . executeCommand ( < server . protocol . OpenRequest > {
3578
+ seq : 4 ,
3579
+ type : "request" ,
3580
+ command : CommandNames . Open ,
3581
+ arguments : {
3582
+ file : file2 . path ,
3583
+ fileContent : file2 . content ,
3584
+ scriptKindName : "JS" ,
3585
+ projectRootPath : file2 . projectRootPath
3586
+ }
3587
+ } ) ;
3588
+ session . executeCommand ( < server . protocol . OpenRequest > {
3589
+ seq : 5 ,
3590
+ type : "request" ,
3591
+ command : CommandNames . Open ,
3592
+ arguments : {
3593
+ file : file3 . path ,
3594
+ fileContent : file3 . content ,
3595
+ scriptKindName : "JS" ,
3596
+ projectRootPath : file3 . projectRootPath
3597
+ }
3598
+ } ) ;
3599
+ session . executeCommand ( < server . protocol . OpenRequest > {
3600
+ seq : 6 ,
3601
+ type : "request" ,
3602
+ command : CommandNames . Open ,
3603
+ arguments : {
3604
+ file : file4 . path ,
3605
+ fileContent : file4 . content ,
3606
+ scriptKindName : "JS"
3607
+ }
3608
+ } ) ;
3609
+
3610
+ const projectService = session . getProjectService ( ) ;
3611
+ checkNumberOfProjects ( projectService , { inferredProjects : 3 } ) ;
3612
+ checkProjectActualFiles ( projectService . inferredProjects [ 0 ] , [ file4 . path ] ) ;
3613
+ checkProjectActualFiles ( projectService . inferredProjects [ 1 ] , [ file1 . path , file2 . path ] ) ;
3614
+ checkProjectActualFiles ( projectService . inferredProjects [ 2 ] , [ file3 . path ] ) ;
3615
+ assert . equal ( projectService . inferredProjects [ 0 ] . getCompilerOptions ( ) . target , ScriptTarget . ESNext ) ;
3616
+ assert . equal ( projectService . inferredProjects [ 1 ] . getCompilerOptions ( ) . target , ScriptTarget . ESNext ) ;
3617
+ assert . equal ( projectService . inferredProjects [ 2 ] . getCompilerOptions ( ) . target , ScriptTarget . ES2015 ) ;
3618
+ } ) ;
3508
3619
} ) ;
3509
3620
3510
3621
describe ( "No overwrite emit error" , ( ) => {
@@ -3698,7 +3809,7 @@ namespace ts.projectSystem {
3698
3809
resetRequest : noop
3699
3810
} ;
3700
3811
3701
- const session = createSession ( host , /*typingsInstaller*/ undefined , /*projectServiceEventHandler*/ undefined , cancellationToken ) ;
3812
+ const session = createSession ( host , { cancellationToken } ) ;
3702
3813
3703
3814
expectedRequestId = session . getNextSeq ( ) ;
3704
3815
session . executeCommandSeq ( < server . protocol . OpenRequest > {
@@ -3738,7 +3849,11 @@ namespace ts.projectSystem {
3738
3849
3739
3850
const cancellationToken = new TestServerCancellationToken ( ) ;
3740
3851
const host = createServerHost ( [ f1 , config ] ) ;
3741
- const session = createSession ( host , /*typingsInstaller*/ undefined , ( ) => { } , cancellationToken ) ;
3852
+ const session = createSession ( host , {
3853
+ canUseEvents : true ,
3854
+ eventHandler : ( ) => { } ,
3855
+ cancellationToken
3856
+ } ) ;
3742
3857
{
3743
3858
session . executeCommandSeq ( < protocol . OpenRequest > {
3744
3859
command : "open" ,
@@ -3871,7 +3986,12 @@ namespace ts.projectSystem {
3871
3986
} ;
3872
3987
const cancellationToken = new TestServerCancellationToken ( /*cancelAfterRequest*/ 3 ) ;
3873
3988
const host = createServerHost ( [ f1 , config ] ) ;
3874
- const session = createSession ( host , /*typingsInstaller*/ undefined , ( ) => { } , cancellationToken , /*throttleWaitMilliseconds*/ 0 ) ;
3989
+ const session = createSession ( host , {
3990
+ canUseEvents : true ,
3991
+ eventHandler : ( ) => { } ,
3992
+ cancellationToken,
3993
+ throttleWaitMilliseconds : 0
3994
+ } ) ;
3875
3995
{
3876
3996
session . executeCommandSeq ( < protocol . OpenRequest > {
3877
3997
command : "open" ,
0 commit comments