From cef370d18ae2b28983799ba1e5db5f0d2407cc6b Mon Sep 17 00:00:00 2001 From: Andy Hanson Date: Mon, 10 Sep 2018 11:37:30 -0700 Subject: [PATCH 1/2] Log text of relevant file after an exception --- src/server/session.ts | 23 +++++++++++++++++-- src/server/utilities.ts | 6 +++-- .../reference/api/tsserverlibrary.d.ts | 1 + 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/server/session.ts b/src/server/session.ts index 5d364abc757a9..0a457f51fca21 100644 --- a/src/server/session.ts +++ b/src/server/session.ts @@ -607,7 +607,11 @@ namespace ts.server { } } - public logError(err: Error, cmd: string) { + public logError(err: Error, cmd: string): void { + this.logErrorWorker(err, cmd); + } + + private logErrorWorker(err: Error, cmd: string, fileRequest?: protocol.FileRequestArgs): void { let msg = "Exception on executing command " + cmd; if (err.message) { msg += ":\n" + indent(err.message); @@ -615,6 +619,19 @@ namespace ts.server { msg += "\n" + indent((err).stack!); } } + + if (fileRequest) { + try { + const { file, project } = this.getFileAndProject(fileRequest); + const scriptInfo = project.getScriptInfoForNormalizedPath(file); + if (scriptInfo) { + const text = getSnapshotText(scriptInfo.getSnapshot()); + msg += `\n\nFile text of ${fileRequest.file}:${indent(text)}\n`; + } + } + catch {} // tslint:disable-line no-empty + } + this.logger.msg(msg, Msg.Err); } @@ -2310,8 +2327,10 @@ namespace ts.server { } let request: protocol.Request | undefined; + let relevantFile: protocol.FileRequestArgs | undefined; try { request = JSON.parse(message); + relevantFile = request.arguments && (request as protocol.FileRequest).arguments.file ? (request as protocol.FileRequest).arguments : undefined; const { response, responseRequired } = this.executeCommand(request); if (this.logger.hasLevel(LogLevel.requestTime)) { @@ -2337,7 +2356,7 @@ namespace ts.server { this.doOutput({ canceled: true }, request!.command, request!.seq, /*success*/ true); return; } - this.logError(err, message); + this.logErrorWorker(err, message, relevantFile); this.doOutput( /*info*/ undefined, request ? request.command : CommandNames.Unknown, diff --git a/src/server/utilities.ts b/src/server/utilities.ts index 615361cdcd8a2..d6cfe269c8d7a 100644 --- a/src/server/utilities.ts +++ b/src/server/utilities.ts @@ -246,14 +246,16 @@ namespace ts.server { return index === 0 || value !== array[index - 1]; } + const indentStr = "\n "; + /* @internal */ export function indent(str: string): string { - return "\n " + str; + return indentStr + str.replace(/\n/g, indentStr); } /** Put stringified JSON on the next line, indented. */ /* @internal */ export function stringifyIndented(json: {}): string { - return "\n " + JSON.stringify(json); + return indentStr + JSON.stringify(json); } } diff --git a/tests/baselines/reference/api/tsserverlibrary.d.ts b/tests/baselines/reference/api/tsserverlibrary.d.ts index 2fa23f14a7bdf..ffee65b0a0968 100644 --- a/tests/baselines/reference/api/tsserverlibrary.d.ts +++ b/tests/baselines/reference/api/tsserverlibrary.d.ts @@ -8671,6 +8671,7 @@ declare namespace ts.server { private defaultEventHandler; private projectsUpdatedInBackgroundEvent; logError(err: Error, cmd: string): void; + private logErrorWorker; send(msg: protocol.Message): void; event(body: T, eventName: string): void; /** @deprecated */ From f710debb91deb68afaee216a5e2eb58ac40b7313 Mon Sep 17 00:00:00 2001 From: Andy Hanson Date: Wed, 12 Sep 2018 17:58:45 -0700 Subject: [PATCH 2/2] Require LogLevel.verbose --- src/server/session.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/session.ts b/src/server/session.ts index 0a457f51fca21..aea6d895b43c5 100644 --- a/src/server/session.ts +++ b/src/server/session.ts @@ -620,7 +620,7 @@ namespace ts.server { } } - if (fileRequest) { + if (fileRequest && this.logger.hasLevel(LogLevel.verbose)) { try { const { file, project } = this.getFileAndProject(fileRequest); const scriptInfo = project.getScriptInfoForNormalizedPath(file);