From d9780cd7ba3db3fe4be26ff9cc645200d933eed7 Mon Sep 17 00:00:00 2001 From: Andrew Casey Date: Fri, 9 Aug 2019 10:27:02 -0700 Subject: [PATCH 1/3] Include fewer paths in exception It's sufficient to append them to the log. --- src/services/services.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/services.ts b/src/services/services.ts index 42b3ac3b31..b769ee2da3 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -1158,7 +1158,7 @@ namespace ts { function getValidSourceFile(fileName: string): SourceFile { const sourceFile = program.getSourceFile(fileName); if (!sourceFile) { - throw new Error(`Could not find sourceFile: '${fileName}' in ${program && JSON.stringify(program.getSourceFiles().map(f => f.fileName))}.`); + throw new Error(`Could not find sourceFile: '${fileName}'.`); } return sourceFile; } From 6122e92802c5c69275904d674167275c3df080a1 Mon Sep 17 00:00:00 2001 From: Andrew Casey Date: Fri, 9 Aug 2019 12:34:40 -0700 Subject: [PATCH 2/3] Restore logging of the program file list --- src/server/session.ts | 3 ++- src/services/services.ts | 7 ++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/server/session.ts b/src/server/session.ts index 7e6bca66c0..52bf905ded 100644 --- a/src/server/session.ts +++ b/src/server/session.ts @@ -711,7 +711,8 @@ namespace ts.server { catch { } // tslint:disable-line no-empty } - if (err.message && err.message.indexOf(`Could not find sourceFile:`) !== -1) { + if (err.hasOwnProperty("ProgramFiles")) { + msg += `\n\nProgram files: {(err as any)["ProgramFiles"]}\n`; msg += `\n\nProjects::\n`; let counter = 0; const addProjectInfo = (project: Project) => { diff --git a/src/services/services.ts b/src/services/services.ts index b769ee2da3..51987c2688 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -1158,7 +1158,12 @@ namespace ts { function getValidSourceFile(fileName: string): SourceFile { const sourceFile = program.getSourceFile(fileName); if (!sourceFile) { - throw new Error(`Could not find sourceFile: '${fileName}'.`); + let error = new Error(`Could not find sourceFile: '${fileName}'.`); + + // Attach sidecar data for the server log + (error as any)["ProgramFiles"] = program && JSON.stringify(program.getSourceFiles().map(f => f.fileName)); + + throw error; } return sourceFile; } From 6c19c13094703fe00996e978dceb087e751c19f3 Mon Sep 17 00:00:00 2001 From: Andrew Casey Date: Fri, 9 Aug 2019 14:04:04 -0700 Subject: [PATCH 3/3] Use an explicit type --- src/server/session.ts | 7 ++++--- src/services/services.ts | 7 ++++--- src/services/utilities.ts | 5 +++++ .../unittests/tsserver/cachingFileSystemInformation.ts | 2 +- 4 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/server/session.ts b/src/server/session.ts index 52bf905ded..12d3ba4747 100644 --- a/src/server/session.ts +++ b/src/server/session.ts @@ -689,7 +689,7 @@ namespace ts.server { this.logErrorWorker(err, cmd); } - private logErrorWorker(err: Error, cmd: string, fileRequest?: protocol.FileRequestArgs): void { + private logErrorWorker(err: Error & PossibleProgramFileInfo, cmd: string, fileRequest?: protocol.FileRequestArgs): void { let msg = "Exception on executing command " + cmd; if (err.message) { msg += ":\n" + indent(err.message); @@ -711,8 +711,9 @@ namespace ts.server { catch { } // tslint:disable-line no-empty } - if (err.hasOwnProperty("ProgramFiles")) { - msg += `\n\nProgram files: {(err as any)["ProgramFiles"]}\n`; + + if (err.ProgramFiles) { + msg += `\n\nProgram files: {JSON.stringify(error.ProgramFiles}}\n`; msg += `\n\nProjects::\n`; let counter = 0; const addProjectInfo = (project: Project) => { diff --git a/src/services/services.ts b/src/services/services.ts index 51987c2688..93145e0122 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -1158,10 +1158,11 @@ namespace ts { function getValidSourceFile(fileName: string): SourceFile { const sourceFile = program.getSourceFile(fileName); if (!sourceFile) { - let error = new Error(`Could not find sourceFile: '${fileName}'.`); + const error: Error & PossibleProgramFileInfo = new Error(`Could not find sourceFile: '${fileName}'.`); - // Attach sidecar data for the server log - (error as any)["ProgramFiles"] = program && JSON.stringify(program.getSourceFiles().map(f => f.fileName)); + // We've been having trouble debugging this, so attach sidecar data for the tsserver log. + // See https://github.com/microsoft/TypeScript/issues/30180. + error.ProgramFiles = program.getSourceFiles().map(f => f.fileName); throw error; } diff --git a/src/services/utilities.ts b/src/services/utilities.ts index 852d22106a..2e6e6875a8 100644 --- a/src/services/utilities.ts +++ b/src/services/utilities.ts @@ -967,6 +967,11 @@ namespace ts { readonly called: Identifier; readonly nTypeArguments: number; } + + export interface PossibleProgramFileInfo { + ProgramFiles?: string[]; + } + // Get info for an expression like `f <` that may be the start of type arguments. export function getPossibleTypeArgumentsInfo(tokenIn: Node, sourceFile: SourceFile): PossibleTypeArgumentInfo | undefined { let token: Node | undefined = tokenIn; diff --git a/src/testRunner/unittests/tsserver/cachingFileSystemInformation.ts b/src/testRunner/unittests/tsserver/cachingFileSystemInformation.ts index 688c8c49eb..468ad35155 100644 --- a/src/testRunner/unittests/tsserver/cachingFileSystemInformation.ts +++ b/src/testRunner/unittests/tsserver/cachingFileSystemInformation.ts @@ -139,7 +139,7 @@ namespace ts.projectSystem { assert.isTrue(false, `should not find file '${imported.path}'`); } catch (e) { - assert.isTrue(e.message.indexOf(`Could not find sourceFile: '${imported.path}' in ["${root.path}"].`) === 0, `Actual: ${e.message}`); + assert.isTrue(e.message.indexOf(`Could not find sourceFile: '${imported.path}'.`) === 0, `Actual: ${e.message}`); } const f2Lookups = getLocationsForModuleLookup("f2"); callsTrackingHost.verifyCalledOnEachEntryNTimes(CalledMapsWithSingleArg.fileExists, f2Lookups, 1);