@@ -281,11 +281,11 @@ namespace ts.projectSystem {
281
281
checkNumberOfProjects ( this , count ) ;
282
282
}
283
283
}
284
- export function createProjectService ( host : server . ServerHost , parameters : CreateProjectServiceParameters = { } ) {
284
+ export function createProjectService ( host : server . ServerHost , parameters : CreateProjectServiceParameters = { } , options ?: Partial < server . ProjectServiceOptions > ) {
285
285
const cancellationToken = parameters . cancellationToken || server . nullCancellationToken ;
286
286
const logger = parameters . logger || nullLogger ;
287
287
const useSingleInferredProject = parameters . useSingleInferredProject !== undefined ? parameters . useSingleInferredProject : false ;
288
- return new TestProjectService ( host , logger , cancellationToken , useSingleInferredProject , parameters . typingsInstaller , parameters . eventHandler ) ;
288
+ return new TestProjectService ( host , logger , cancellationToken , useSingleInferredProject , parameters . typingsInstaller , parameters . eventHandler , options ) ;
289
289
}
290
290
291
291
export function checkNumberOfConfiguredProjects ( projectService : server . ProjectService , expected : number ) {
@@ -3784,6 +3784,113 @@ namespace ts.projectSystem {
3784
3784
assert . equal ( projectService . inferredProjects [ 1 ] . getCompilationSettings ( ) . target , ScriptTarget . ESNext ) ;
3785
3785
assert . equal ( projectService . inferredProjects [ 2 ] . getCompilationSettings ( ) . target , ScriptTarget . ES2015 ) ;
3786
3786
} ) ;
3787
+
3788
+ function checkInferredProject ( inferredProject : server . InferredProject , actualFiles : FileOrFolder [ ] , target : ScriptTarget ) {
3789
+ checkProjectActualFiles ( inferredProject , actualFiles . map ( f => f . path ) ) ;
3790
+ assert . equal ( inferredProject . getCompilationSettings ( ) . target , target ) ;
3791
+ }
3792
+
3793
+ function verifyProjectRootWithCaseSensitivity ( useCaseSensitiveFileNames : boolean ) {
3794
+ const files : [ FileOrFolder , FileOrFolder , FileOrFolder , FileOrFolder ] = [
3795
+ { path : "/a/file1.ts" , content : "let x = 1;" } ,
3796
+ { path : "/A/file2.ts" , content : "let y = 2;" } ,
3797
+ { path : "/b/file2.ts" , content : "let x = 3;" } ,
3798
+ { path : "/c/file3.ts" , content : "let z = 4;" }
3799
+ ] ;
3800
+ const host = createServerHost ( files , { useCaseSensitiveFileNames } ) ;
3801
+ const projectService = createProjectService ( host , { useSingleInferredProject : true , } , { useInferredProjectPerProjectRoot : true } ) ;
3802
+ projectService . setCompilerOptionsForInferredProjects ( {
3803
+ allowJs : true ,
3804
+ target : ScriptTarget . ESNext
3805
+ } ) ;
3806
+ projectService . setCompilerOptionsForInferredProjects ( {
3807
+ allowJs : true ,
3808
+ target : ScriptTarget . ES2015
3809
+ } , "/a" ) ;
3810
+
3811
+ openClientFiles ( [ "/a" , "/a" , "/b" , undefined ] ) ;
3812
+ verifyInferredProjectsState ( [
3813
+ [ [ files [ 3 ] ] , ScriptTarget . ESNext ] ,
3814
+ [ [ files [ 0 ] , files [ 1 ] ] , ScriptTarget . ES2015 ] ,
3815
+ [ [ files [ 2 ] ] , ScriptTarget . ESNext ]
3816
+ ] ) ;
3817
+ closeClientFiles ( ) ;
3818
+
3819
+ openClientFiles ( [ "/a" , "/A" , "/b" , undefined ] ) ;
3820
+ if ( useCaseSensitiveFileNames ) {
3821
+ verifyInferredProjectsState ( [
3822
+ [ [ files [ 3 ] ] , ScriptTarget . ESNext ] ,
3823
+ [ [ files [ 0 ] ] , ScriptTarget . ES2015 ] ,
3824
+ [ [ files [ 1 ] ] , ScriptTarget . ESNext ] ,
3825
+ [ [ files [ 2 ] ] , ScriptTarget . ESNext ]
3826
+ ] ) ;
3827
+ }
3828
+ else {
3829
+ verifyInferredProjectsState ( [
3830
+ [ [ files [ 3 ] ] , ScriptTarget . ESNext ] ,
3831
+ [ [ files [ 0 ] , files [ 1 ] ] , ScriptTarget . ES2015 ] ,
3832
+ [ [ files [ 2 ] ] , ScriptTarget . ESNext ]
3833
+ ] ) ;
3834
+ }
3835
+ closeClientFiles ( ) ;
3836
+
3837
+ projectService . setCompilerOptionsForInferredProjects ( {
3838
+ allowJs : true ,
3839
+ target : ScriptTarget . ES2017
3840
+ } , "/A" ) ;
3841
+
3842
+ openClientFiles ( [ "/a" , "/a" , "/b" , undefined ] ) ;
3843
+ verifyInferredProjectsState ( [
3844
+ [ [ files [ 3 ] ] , ScriptTarget . ESNext ] ,
3845
+ [ [ files [ 0 ] , files [ 1 ] ] , useCaseSensitiveFileNames ? ScriptTarget . ES2015 : ScriptTarget . ES2017 ] ,
3846
+ [ [ files [ 2 ] ] , ScriptTarget . ESNext ]
3847
+ ] ) ;
3848
+ closeClientFiles ( ) ;
3849
+
3850
+ openClientFiles ( [ "/a" , "/A" , "/b" , undefined ] ) ;
3851
+ if ( useCaseSensitiveFileNames ) {
3852
+ verifyInferredProjectsState ( [
3853
+ [ [ files [ 3 ] ] , ScriptTarget . ESNext ] ,
3854
+ [ [ files [ 0 ] ] , ScriptTarget . ES2015 ] ,
3855
+ [ [ files [ 1 ] ] , ScriptTarget . ES2017 ] ,
3856
+ [ [ files [ 2 ] ] , ScriptTarget . ESNext ]
3857
+ ] ) ;
3858
+ }
3859
+ else {
3860
+ verifyInferredProjectsState ( [
3861
+ [ [ files [ 3 ] ] , ScriptTarget . ESNext ] ,
3862
+ [ [ files [ 0 ] , files [ 1 ] ] , ScriptTarget . ES2017 ] ,
3863
+ [ [ files [ 2 ] ] , ScriptTarget . ESNext ]
3864
+ ] ) ;
3865
+ }
3866
+ closeClientFiles ( ) ;
3867
+
3868
+ function openClientFiles ( projectRoots : [ string | undefined , string | undefined , string | undefined , string | undefined ] ) {
3869
+ files . forEach ( ( file , index ) => {
3870
+ projectService . openClientFile ( file . path , file . content , ScriptKind . JS , projectRoots [ index ] ) ;
3871
+ } ) ;
3872
+ }
3873
+
3874
+ function closeClientFiles ( ) {
3875
+ files . forEach ( file => projectService . closeClientFile ( file . path ) ) ;
3876
+ }
3877
+
3878
+ function verifyInferredProjectsState ( expected : [ FileOrFolder [ ] , ScriptTarget ] [ ] ) {
3879
+ checkNumberOfProjects ( projectService , { inferredProjects : expected . length } ) ;
3880
+ projectService . inferredProjects . forEach ( ( p , index ) => {
3881
+ const [ actualFiles , target ] = expected [ index ] ;
3882
+ checkInferredProject ( p , actualFiles , target ) ;
3883
+ } ) ;
3884
+ }
3885
+ }
3886
+
3887
+ it ( "inferred projects per project root with case sensitive system" , ( ) => {
3888
+ verifyProjectRootWithCaseSensitivity ( /*useCaseSensitiveFileNames*/ true ) ;
3889
+ } ) ;
3890
+
3891
+ it ( "inferred projects per project root with case insensitive system" , ( ) => {
3892
+ verifyProjectRootWithCaseSensitivity ( /*useCaseSensitiveFileNames*/ false ) ;
3893
+ } ) ;
3787
3894
} ) ;
3788
3895
3789
3896
describe ( "No overwrite emit error" , ( ) => {
0 commit comments