From 104434182b6bf0922920b935ad8a083201fd8ed7 Mon Sep 17 00:00:00 2001 From: Andrew Casey Date: Mon, 14 Jan 2019 17:01:46 -0800 Subject: [PATCH 1/3] Harden telemetryOnOpenFile against disabled projects As for syntax-only servers, we can't meaningfully report open-file telemetry for projects with disabled language services. Hopefully, a deeper fix will follow, but this solves the immediate problem that VS disables the LS for all projects when it sees a failure in applyChangedToOpenFiles (because it assumes the server state is corrupt). --- src/server/editorServices.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/server/editorServices.ts b/src/server/editorServices.ts index cd1c69a2d67..3e062efc272 100644 --- a/src/server/editorServices.ts +++ b/src/server/editorServices.ts @@ -2777,7 +2777,12 @@ namespace ts.server { return; } - const info: OpenFileInfo = { checkJs: !!scriptInfo.getDefaultProject().getSourceFile(scriptInfo.path)!.checkJsDirective }; + const project = scriptInfo.getDefaultProject(); + if (!project.languageServiceEnabled) { + return; + } + + const info: OpenFileInfo = { checkJs: !!project.getSourceFile(scriptInfo.path)!.checkJsDirective }; this.eventHandler({ eventName: OpenFileInfoTelemetryEvent, data: { info } }); } From b86cb27d0b222f1cadb00e391928923c26244257 Mon Sep 17 00:00:00 2001 From: Andrew Casey Date: Mon, 14 Jan 2019 18:13:13 -0800 Subject: [PATCH 2/3] Fix trailing whitespace --- src/server/editorServices.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/editorServices.ts b/src/server/editorServices.ts index 3e062efc272..bc8197f9354 100644 --- a/src/server/editorServices.ts +++ b/src/server/editorServices.ts @@ -2780,7 +2780,7 @@ namespace ts.server { const project = scriptInfo.getDefaultProject(); if (!project.languageServiceEnabled) { return; - } + } const info: OpenFileInfo = { checkJs: !!project.getSourceFile(scriptInfo.path)!.checkJsDirective }; this.eventHandler({ eventName: OpenFileInfoTelemetryEvent, data: { info } }); From 3fb09630a82c3f94e47ec37515cb0733b6cfcdb5 Mon Sep 17 00:00:00 2001 From: Andrew Casey Date: Tue, 15 Jan 2019 10:55:15 -0800 Subject: [PATCH 3/3] Add regression test --- src/testRunner/unittests/tsserver/projects.ts | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/testRunner/unittests/tsserver/projects.ts b/src/testRunner/unittests/tsserver/projects.ts index 00941a1d3c9..3a648c9189e 100644 --- a/src/testRunner/unittests/tsserver/projects.ts +++ b/src/testRunner/unittests/tsserver/projects.ts @@ -103,6 +103,30 @@ namespace ts.projectSystem { assert.isFalse(proj3.languageServiceEnabled); }); + it("should not crash when opening a file in a project with a disabled language service", () => { + const file1 = { + path: "/a/b/f1.js", + content: "let x =1;", + fileSize: 50 * 1024 * 1024 + }; + const file2 = { + path: "/a/b/f2.js", + content: "let x =1;", + fileSize: 100 + }; + + const projName = "proj1"; + + const host = createServerHost([file1, file2]); + const projectService = createProjectService(host, { useSingleInferredProject: true }, { eventHandler: noop }); + + projectService.openExternalProject({ rootFiles: toExternalFiles([file1.path, file2.path]), options: {}, projectFileName: projName }); + const proj1 = projectService.findProject(projName)!; + assert.isFalse(proj1.languageServiceEnabled); + + assert.doesNotThrow(() => projectService.openClientFile(file2.path)); + }); + describe("ignoreConfigFiles", () => { it("external project including config file", () => { const file1 = {