From b18f83021692f6a354387d4e2668284c20c98338 Mon Sep 17 00:00:00 2001 From: Sheetal Nandi Date: Wed, 7 Feb 2018 14:35:43 -0800 Subject: [PATCH] Fix getDefaultProjectForFile check Fixes #21738 --- .../unittests/tsserverProjectSystem.ts | 71 ++++++++++++++----- src/server/editorServices.ts | 2 +- 2 files changed, 53 insertions(+), 20 deletions(-) diff --git a/src/harness/unittests/tsserverProjectSystem.ts b/src/harness/unittests/tsserverProjectSystem.ts index 42199c895b1..33b268ccb9c 100644 --- a/src/harness/unittests/tsserverProjectSystem.ts +++ b/src/harness/unittests/tsserverProjectSystem.ts @@ -2888,6 +2888,29 @@ namespace ts.projectSystem { }); describe("tsserverProjectSystem Proper errors", () => { + function createErrorLogger() { + let hasError = false; + const errorLogger: server.Logger = { + close: noop, + hasLevel: () => true, + loggingEnabled: () => true, + perftrc: noop, + info: noop, + msg: (_s, type) => { + if (type === server.Msg.Err) { + hasError = true; + } + }, + startGroup: noop, + endGroup: noop, + getLogFileName: (): string => undefined + }; + return { + errorLogger, + hasError: () => hasError + }; + } + it("document is not contained in project", () => { const file1 = { path: "/a/b/app.ts", @@ -2910,23 +2933,8 @@ namespace ts.projectSystem { describe("when opening new file that doesnt exist on disk yet", () => { function verifyNonExistentFile(useProjectRoot: boolean) { const host = createServerHost([libFile]); - let hasError = false; - const errLogger: server.Logger = { - close: noop, - hasLevel: () => true, - loggingEnabled: () => true, - perftrc: noop, - info: noop, - msg: (_s, type) => { - if (type === server.Msg.Err) { - hasError = true; - } - }, - startGroup: noop, - endGroup: noop, - getLogFileName: (): string => undefined - }; - const session = createSession(host, { canUseEvents: true, logger: errLogger, useInferredProjectPerProjectRoot: true }); + const { hasError, errorLogger } = createErrorLogger(); + const session = createSession(host, { canUseEvents: true, logger: errorLogger, useInferredProjectPerProjectRoot: true }); const folderPath = "/user/someuser/projects/someFolder"; const projectService = session.getProjectService(); @@ -2967,13 +2975,13 @@ namespace ts.projectSystem { // Run the last one = get error request host.runQueuedTimeoutCallbacks(newTimeoutId); - assert.isFalse(hasError); + assert.isFalse(hasError()); host.checkTimeoutQueueLength(2); checkErrorMessage(session, "syntaxDiag", { file: untitledFile, diagnostics: [] }); session.clearMessages(); host.runQueuedImmediateCallbacks(); - assert.isFalse(hasError); + assert.isFalse(hasError()); checkErrorMessage(session, "semanticDiag", { file: untitledFile, diagnostics: [] }); checkCompleteEvent(session, 2, expectedSequenceId); @@ -3039,6 +3047,31 @@ namespace ts.projectSystem { session.clearMessages(); } }); + + it("Getting errors before opening file", () => { + const file: FileOrFolder = { + path: "/a/b/project/file.ts", + content: "let x: number = false;" + }; + const host = createServerHost([file, libFile]); + const { hasError, errorLogger } = createErrorLogger(); + const session = createSession(host, { canUseEvents: true, logger: errorLogger }); + + session.clearMessages(); + const expectedSequenceId = session.getNextSeq(); + session.executeCommandSeq({ + command: server.CommandNames.Geterr, + arguments: { + delay: 0, + files: [file.path] + } + }); + + host.runQueuedImmediateCallbacks(); + assert.isFalse(hasError()); + checkCompleteEvent(session, 1, expectedSequenceId); + session.clearMessages(); + }); }); describe("tsserverProjectSystem autoDiscovery", () => { diff --git a/src/server/editorServices.ts b/src/server/editorServices.ts index 5d71ff4c2d3..094366905a8 100644 --- a/src/server/editorServices.ts +++ b/src/server/editorServices.ts @@ -668,7 +668,7 @@ namespace ts.server { getDefaultProjectForFile(fileName: NormalizedPath, ensureProject: boolean) { let scriptInfo = this.getScriptInfoForNormalizedPath(fileName); - if (ensureProject && !scriptInfo || scriptInfo.isOrphan()) { + if (ensureProject && (!scriptInfo || scriptInfo.isOrphan())) { this.ensureProjectStructuresUptoDate(); scriptInfo = this.getScriptInfoForNormalizedPath(fileName); if (!scriptInfo) {