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