@@ -176,6 +176,18 @@ namespace ts.projectSystem {
176
176
return { ts : 0 , tsx : 0 , dts : 0 , js : 0 , jsx : 0 , deferred : 0 , ...nonZeroStats } ;
177
177
}
178
178
179
+ export interface ConfigFileDiagnostic {
180
+ fileName : string | undefined ;
181
+ start : number | undefined ;
182
+ length : number | undefined ;
183
+ messageText : string ;
184
+ category : DiagnosticCategory ;
185
+ code : number ;
186
+ reportsUnnecessary ?: { } ;
187
+ source ?: string ;
188
+ relatedInformation ?: DiagnosticRelatedInformation [ ] ;
189
+ }
190
+
179
191
export class TestServerEventManager {
180
192
private events : server . ProjectServiceEvent [ ] = [ ] ;
181
193
readonly session : TestSession ;
@@ -216,10 +228,14 @@ namespace ts.projectSystem {
216
228
this . events . forEach ( event => assert . notEqual ( event . eventName , eventName ) ) ;
217
229
}
218
230
219
- checkSingleConfigFileDiagEvent ( configFileName : string , triggerFile : string ) {
231
+ checkSingleConfigFileDiagEvent ( configFileName : string , triggerFile : string , errors : ReadonlyArray < ConfigFileDiagnostic > ) {
220
232
const eventData = this . getEvent < server . ConfigFileDiagEvent > ( server . ConfigFileDiagEvent ) ;
221
233
assert . equal ( eventData . configFileName , configFileName ) ;
222
234
assert . equal ( eventData . triggerFile , triggerFile ) ;
235
+ const actual = eventData . diagnostics . map ( ( { file, messageText, ...rest } ) => ( { fileName : file && file . fileName , messageText : isString ( messageText ) ? messageText : "" , ...rest } ) ) ;
236
+ if ( errors ) {
237
+ assert . deepEqual ( actual , errors ) ;
238
+ }
223
239
}
224
240
225
241
assertProjectInfoTelemetryEvent ( partial : Partial < server . ProjectInfoTelemetryEventData > , configFile = "/tsconfig.json" ) : void {
@@ -4698,13 +4714,41 @@ namespace ts.projectSystem {
4698
4714
} ) ;
4699
4715
4700
4716
describe ( "tsserverProjectSystem Configure file diagnostics events" , ( ) => {
4717
+ function getUnknownCompilerOptionDiagnostic ( configFile : File , prop : string ) : ConfigFileDiagnostic {
4718
+ const d = Diagnostics . Unknown_compiler_option_0 ;
4719
+ const start = configFile . content . indexOf ( prop ) - 1 ; // start at "prop"
4720
+ return {
4721
+ fileName : configFile . path ,
4722
+ start,
4723
+ length : prop . length + 2 ,
4724
+ messageText : formatStringFromArgs ( d . message , [ prop ] ) ,
4725
+ category : d . category ,
4726
+ code : d . code ,
4727
+ reportsUnnecessary : undefined
4728
+ } ;
4729
+ }
4730
+
4731
+ function getFileNotFoundDiagnostic ( configFile : File , relativeFileName : string ) : ConfigFileDiagnostic {
4732
+ const findString = `{"path":"./${ relativeFileName } "}` ;
4733
+ const d = Diagnostics . File_0_does_not_exist ;
4734
+ const start = configFile . content . indexOf ( findString ) ;
4735
+ return {
4736
+ fileName : configFile . path ,
4737
+ start,
4738
+ length : findString . length ,
4739
+ messageText : formatStringFromArgs ( d . message , [ `${ getDirectoryPath ( configFile . path ) } /${ relativeFileName } ` ] ) ,
4740
+ category : d . category ,
4741
+ code : d . code ,
4742
+ reportsUnnecessary : undefined
4743
+ } ;
4744
+ }
4701
4745
4702
4746
it ( "are generated when the config file has errors" , ( ) => {
4703
- const file = {
4747
+ const file : File = {
4704
4748
path : "/a/b/app.ts" ,
4705
4749
content : "let x = 10"
4706
4750
} ;
4707
- const configFile = {
4751
+ const configFile : File = {
4708
4752
path : "/a/b/tsconfig.json" ,
4709
4753
content : `{
4710
4754
"compilerOptions": {
@@ -4713,29 +4757,32 @@ namespace ts.projectSystem {
4713
4757
}
4714
4758
}`
4715
4759
} ;
4716
- const serverEventManager = new TestServerEventManager ( [ file , configFile ] ) ;
4760
+ const serverEventManager = new TestServerEventManager ( [ file , libFile , configFile ] ) ;
4717
4761
openFilesForSession ( [ file ] , serverEventManager . session ) ;
4718
- serverEventManager . checkSingleConfigFileDiagEvent ( configFile . path , file . path ) ;
4762
+ serverEventManager . checkSingleConfigFileDiagEvent ( configFile . path , file . path , [
4763
+ getUnknownCompilerOptionDiagnostic ( configFile , "foo" ) ,
4764
+ getUnknownCompilerOptionDiagnostic ( configFile , "allowJS" )
4765
+ ] ) ;
4719
4766
} ) ;
4720
4767
4721
4768
it ( "are generated when the config file doesn't have errors" , ( ) => {
4722
- const file = {
4769
+ const file : File = {
4723
4770
path : "/a/b/app.ts" ,
4724
4771
content : "let x = 10"
4725
4772
} ;
4726
- const configFile = {
4773
+ const configFile : File = {
4727
4774
path : "/a/b/tsconfig.json" ,
4728
4775
content : `{
4729
4776
"compilerOptions": {}
4730
4777
}`
4731
4778
} ;
4732
- const serverEventManager = new TestServerEventManager ( [ file , configFile ] ) ;
4779
+ const serverEventManager = new TestServerEventManager ( [ file , libFile , configFile ] ) ;
4733
4780
openFilesForSession ( [ file ] , serverEventManager . session ) ;
4734
- serverEventManager . checkSingleConfigFileDiagEvent ( configFile . path , file . path ) ;
4781
+ serverEventManager . checkSingleConfigFileDiagEvent ( configFile . path , file . path , emptyArray ) ;
4735
4782
} ) ;
4736
4783
4737
4784
it ( "are generated when the config file changes" , ( ) => {
4738
- const file = {
4785
+ const file : File = {
4739
4786
path : "/a/b/app.ts" ,
4740
4787
content : "let x = 10"
4741
4788
} ;
@@ -4746,37 +4793,40 @@ namespace ts.projectSystem {
4746
4793
}`
4747
4794
} ;
4748
4795
4749
- const serverEventManager = new TestServerEventManager ( [ file , configFile ] ) ;
4796
+ const files = [ file , libFile , configFile ] ;
4797
+ const serverEventManager = new TestServerEventManager ( files ) ;
4750
4798
openFilesForSession ( [ file ] , serverEventManager . session ) ;
4751
- serverEventManager . checkSingleConfigFileDiagEvent ( configFile . path , file . path ) ;
4799
+ serverEventManager . checkSingleConfigFileDiagEvent ( configFile . path , file . path , emptyArray ) ;
4752
4800
4753
4801
configFile . content = `{
4754
4802
"compilerOptions": {
4755
4803
"haha": 123
4756
4804
}
4757
4805
}` ;
4758
- serverEventManager . host . reloadFS ( [ file , configFile ] ) ;
4806
+ serverEventManager . host . reloadFS ( files ) ;
4759
4807
serverEventManager . host . runQueuedTimeoutCallbacks ( ) ;
4760
- serverEventManager . checkSingleConfigFileDiagEvent ( configFile . path , configFile . path ) ;
4808
+ serverEventManager . checkSingleConfigFileDiagEvent ( configFile . path , configFile . path , [
4809
+ getUnknownCompilerOptionDiagnostic ( configFile , "haha" )
4810
+ ] ) ;
4761
4811
4762
4812
configFile . content = `{
4763
4813
"compilerOptions": {}
4764
4814
}` ;
4765
- serverEventManager . host . reloadFS ( [ file , configFile ] ) ;
4815
+ serverEventManager . host . reloadFS ( files ) ;
4766
4816
serverEventManager . host . runQueuedTimeoutCallbacks ( ) ;
4767
- serverEventManager . checkSingleConfigFileDiagEvent ( configFile . path , configFile . path ) ;
4817
+ serverEventManager . checkSingleConfigFileDiagEvent ( configFile . path , configFile . path , emptyArray ) ;
4768
4818
} ) ;
4769
4819
4770
4820
it ( "are not generated when the config file does not include file opened and config file has errors" , ( ) => {
4771
- const file = {
4821
+ const file : File = {
4772
4822
path : "/a/b/app.ts" ,
4773
4823
content : "let x = 10"
4774
4824
} ;
4775
- const file2 = {
4825
+ const file2 : File = {
4776
4826
path : "/a/b/test.ts" ,
4777
4827
content : "let x = 10"
4778
4828
} ;
4779
- const configFile = {
4829
+ const configFile : File = {
4780
4830
path : "/a/b/tsconfig.json" ,
4781
4831
content : `{
4782
4832
"compilerOptions": {
@@ -4792,11 +4842,11 @@ namespace ts.projectSystem {
4792
4842
} ) ;
4793
4843
4794
4844
it ( "are not generated when the config file has errors but suppressDiagnosticEvents is true" , ( ) => {
4795
- const file = {
4845
+ const file : File = {
4796
4846
path : "/a/b/app.ts" ,
4797
4847
content : "let x = 10"
4798
4848
} ;
4799
- const configFile = {
4849
+ const configFile : File = {
4800
4850
path : "/a/b/tsconfig.json" ,
4801
4851
content : `{
4802
4852
"compilerOptions": {
@@ -4805,21 +4855,21 @@ namespace ts.projectSystem {
4805
4855
}
4806
4856
}`
4807
4857
} ;
4808
- const serverEventManager = new TestServerEventManager ( [ file , configFile ] , /*suppressDiagnosticEvents*/ true ) ;
4858
+ const serverEventManager = new TestServerEventManager ( [ file , libFile , configFile ] , /*suppressDiagnosticEvents*/ true ) ;
4809
4859
openFilesForSession ( [ file ] , serverEventManager . session ) ;
4810
4860
serverEventManager . hasZeroEvent ( "configFileDiag" ) ;
4811
4861
} ) ;
4812
4862
4813
4863
it ( "are not generated when the config file does not include file opened and doesnt contain any errors" , ( ) => {
4814
- const file = {
4864
+ const file : File = {
4815
4865
path : "/a/b/app.ts" ,
4816
4866
content : "let x = 10"
4817
4867
} ;
4818
- const file2 = {
4868
+ const file2 : File = {
4819
4869
path : "/a/b/test.ts" ,
4820
4870
content : "let x = 10"
4821
4871
} ;
4822
- const configFile = {
4872
+ const configFile : File = {
4823
4873
path : "/a/b/tsconfig.json" ,
4824
4874
content : `{
4825
4875
"files": ["app.ts"]
@@ -4830,6 +4880,27 @@ namespace ts.projectSystem {
4830
4880
openFilesForSession ( [ file2 ] , serverEventManager . session ) ;
4831
4881
serverEventManager . hasZeroEvent ( "configFileDiag" ) ;
4832
4882
} ) ;
4883
+
4884
+ it ( "contains the project reference errors" , ( ) => {
4885
+ const file : File = {
4886
+ path : "/a/b/app.ts" ,
4887
+ content : "let x = 10"
4888
+ } ;
4889
+ const noSuchTsconfig = "no-such-tsconfig.json" ;
4890
+ const configFile : File = {
4891
+ path : "/a/b/tsconfig.json" ,
4892
+ content : `{
4893
+ "files": ["app.ts"],
4894
+ "references": [{"path":"./${ noSuchTsconfig } "}]
4895
+ }`
4896
+ } ;
4897
+
4898
+ const serverEventManager = new TestServerEventManager ( [ file , libFile , configFile ] ) ;
4899
+ openFilesForSession ( [ file ] , serverEventManager . session ) ;
4900
+ serverEventManager . checkSingleConfigFileDiagEvent ( configFile . path , file . path , [
4901
+ getFileNotFoundDiagnostic ( configFile , noSuchTsconfig )
4902
+ ] ) ;
4903
+ } ) ;
4833
4904
} ) ;
4834
4905
4835
4906
describe ( "tsserverProjectSystem skipLibCheck" , ( ) => {
0 commit comments