diff --git a/src/server/editorServices.ts b/src/server/editorServices.ts index 24f311d20bf72..7ea137c3d1b07 100644 --- a/src/server/editorServices.ts +++ b/src/server/editorServices.ts @@ -3017,6 +3017,13 @@ namespace ts.server { // At this point if file is part of any any configured or external project, then it would be present in the containing projects // So if it still doesnt have any containing projects, it needs to be part of inferred project if (info.isOrphan()) { + // Even though this info did not belong to any of the configured projects, send the config file diag + if (isArray(retainProjects)) { + retainProjects.forEach(project => this.sendConfigFileDiagEvent(project, info.fileName)); + } + else if (retainProjects) { + this.sendConfigFileDiagEvent(retainProjects, info.fileName); + } Debug.assert(this.openFiles.has(info.path)); this.assignOrphanScriptInfoToInferredProject(info, this.openFiles.get(info.path)); } diff --git a/src/testRunner/unittests/tsserver/projectErrors.ts b/src/testRunner/unittests/tsserver/projectErrors.ts index 53b86448dae39..e074a8836497d 100644 --- a/src/testRunner/unittests/tsserver/projectErrors.ts +++ b/src/testRunner/unittests/tsserver/projectErrors.ts @@ -608,6 +608,10 @@ declare module '@custom/plugin' { path: "/a/b/test.ts", content: "let x = 10" }; + const file3: File = { + path: "/a/b/test2.ts", + content: "let xy = 10" + }; const configFile: File = { path: "/a/b/tsconfig.json", content: `{ @@ -618,9 +622,20 @@ declare module '@custom/plugin' { "files": ["app.ts"] }` }; - const serverEventManager = new TestServerEventManager([file, file2, libFile, configFile]); + const serverEventManager = new TestServerEventManager([file, file2, file3, libFile, configFile]); openFilesForSession([file2], serverEventManager.session); + serverEventManager.checkSingleConfigFileDiagEvent(configFile.path, file2.path, [ + getUnknownCompilerOptionDiagnostic(configFile, "foo"), + getUnknownCompilerOptionDiagnostic(configFile, "allowJS", "allowJs") + ]); + openFilesForSession([file], serverEventManager.session); + // We generate only if project is created when opening file from the project serverEventManager.hasZeroEvent("configFileDiag"); + openFilesForSession([file3], serverEventManager.session); + serverEventManager.checkSingleConfigFileDiagEvent(configFile.path, file3.path, [ + getUnknownCompilerOptionDiagnostic(configFile, "foo"), + getUnknownCompilerOptionDiagnostic(configFile, "allowJS", "allowJs") + ]); }); it("are not generated when the config file has errors but suppressDiagnosticEvents is true", () => { @@ -651,6 +666,10 @@ declare module '@custom/plugin' { path: "/a/b/test.ts", content: "let x = 10" }; + const file3: File = { + path: "/a/b/test2.ts", + content: "let xy = 10" + }; const configFile: File = { path: "/a/b/tsconfig.json", content: `{ @@ -658,9 +677,14 @@ declare module '@custom/plugin' { }` }; - const serverEventManager = new TestServerEventManager([file, file2, libFile, configFile]); + const serverEventManager = new TestServerEventManager([file, file2, file3, libFile, configFile]); openFilesForSession([file2], serverEventManager.session); + serverEventManager.checkSingleConfigFileDiagEvent(configFile.path, file2.path, emptyArray); + openFilesForSession([file], serverEventManager.session); + // We generate only if project is created when opening file from the project serverEventManager.hasZeroEvent("configFileDiag"); + openFilesForSession([file3], serverEventManager.session); + serverEventManager.checkSingleConfigFileDiagEvent(configFile.path, file3.path, emptyArray); }); it("contains the project reference errors", () => {