From f793a7c5fc667b8a97870e5fca1b903dc5e373a0 Mon Sep 17 00:00:00 2001 From: isidor Date: Mon, 9 May 2016 15:23:16 +0200 Subject: [PATCH] debug: display call stack error from adapter fixes #6100 --- .../parts/debug/browser/debugViewer.ts | 27 +++++++++++++++++++ .../debug/browser/media/debugViewlet.css | 6 +++++ src/vs/workbench/parts/debug/common/debug.ts | 1 + .../parts/debug/common/debugModel.ts | 3 +++ 4 files changed, 37 insertions(+) diff --git a/src/vs/workbench/parts/debug/browser/debugViewer.ts b/src/vs/workbench/parts/debug/browser/debugViewer.ts index ac626c494ee..087e70fcbbc 100644 --- a/src/vs/workbench/parts/debug/browser/debugViewer.ts +++ b/src/vs/workbench/parts/debug/browser/debugViewer.ts @@ -241,6 +241,9 @@ export class CallStackDataSource implements tree.IDataSource { if (typeof element === 'number') { return element.toString(); } + if (typeof element === 'string') { + return element; + } return element.getId(); } @@ -260,6 +263,9 @@ export class CallStackDataSource implements tree.IDataSource { private getThreadChildren(thread: debug.IThread): TPromise { return thread.getCallStack(this.debugService).then((callStack: any[]) => { + if (thread.stoppedDetails.framesErrorMessage) { + return callStack.concat([thread.stoppedDetails.framesErrorMessage]); + } if (thread.stoppedDetails && thread.stoppedDetails.totalFrames > callStack.length) { return callStack.concat([thread.threadId]); } @@ -280,6 +286,10 @@ interface IThreadTemplateData { stateLabel: HTMLSpanElement; } +interface IErrorTemplateData { + label: HTMLElement; +} + interface ILoadMoreTemplateData { label: HTMLElement; } @@ -296,6 +306,7 @@ export class CallStackRenderer implements tree.IRenderer { private static THREAD_TEMPLATE_ID = 'thread'; private static STACK_FRAME_TEMPLATE_ID = 'stackFrame'; + private static ERROR_TEMPLATE_ID = 'error'; private static LOAD_MORE_TEMPLATE_ID = 'loadMore'; constructor( @IWorkspaceContextService private contextService: IWorkspaceContextService) { @@ -313,6 +324,9 @@ export class CallStackRenderer implements tree.IRenderer { if (element instanceof model.StackFrame) { return CallStackRenderer.STACK_FRAME_TEMPLATE_ID; } + if (typeof element === 'string') { + return CallStackRenderer.ERROR_TEMPLATE_ID; + } return CallStackRenderer.LOAD_MORE_TEMPLATE_ID; } @@ -324,6 +338,12 @@ export class CallStackRenderer implements tree.IRenderer { return data; } + if (templateId === CallStackRenderer.ERROR_TEMPLATE_ID) { + let data: ILoadMoreTemplateData = Object.create(null); + data.label = dom.append(container, $('.error')); + + return data; + } if (templateId === CallStackRenderer.THREAD_TEMPLATE_ID) { let data: IThreadTemplateData = Object.create(null); data.thread = dom.append(container, $('.thread')); @@ -349,6 +369,8 @@ export class CallStackRenderer implements tree.IRenderer { this.renderThread(element, templateData); } else if (templateId === CallStackRenderer.STACK_FRAME_TEMPLATE_ID) { this.renderStackFrame(element, templateData); + } else if (templateId === CallStackRenderer.ERROR_TEMPLATE_ID) { + this.renderError(element, templateData); } else { this.renderLoadMore(element, templateData); } @@ -360,6 +382,11 @@ export class CallStackRenderer implements tree.IRenderer { data.stateLabel.textContent = thread.stopped ? nls.localize('paused', "paused") : nls.localize('running', "running"); } + private renderError(element: string, data: IErrorTemplateData) { + data.label.textContent = element; + data.label.title = nls.localize('stackFrameError', "An error occurred while requesting the stack trace"); + } + private renderLoadMore(element: any, data: ILoadMoreTemplateData): void { data.label.textContent = nls.localize('loadMoreStackFrames', "Load More Stack Frames"); } diff --git a/src/vs/workbench/parts/debug/browser/media/debugViewlet.css b/src/vs/workbench/parts/debug/browser/media/debugViewlet.css index 07bfec9ba4c..ce7e59d2a64 100644 --- a/src/vs/workbench/parts/debug/browser/media/debugViewlet.css +++ b/src/vs/workbench/parts/debug/browser/media/debugViewlet.css @@ -187,6 +187,12 @@ text-align: center; } +.debug-viewlet .debug-call-stack .error { + font-style: italic; + text-overflow: ellipsis; + overflow: hidden; +} + /* Variables & Expression view */ .debug-viewlet .scope { diff --git a/src/vs/workbench/parts/debug/common/debug.ts b/src/vs/workbench/parts/debug/common/debug.ts index aba1e3081bf..77597af6779 100644 --- a/src/vs/workbench/parts/debug/common/debug.ts +++ b/src/vs/workbench/parts/debug/common/debug.ts @@ -34,6 +34,7 @@ export interface IRawStoppedDetails { threadId?: number; text?: string; totalFrames?: number; + framesErrorMessage?: string; } // model diff --git a/src/vs/workbench/parts/debug/common/debugModel.ts b/src/vs/workbench/parts/debug/common/debugModel.ts index 138c1f53f42..ae8095d401b 100644 --- a/src/vs/workbench/parts/debug/common/debugModel.ts +++ b/src/vs/workbench/parts/debug/common/debugModel.ts @@ -150,6 +150,9 @@ export class Thread implements debug.IThread { return new StackFrame(this.threadId, rsf.id, rsf.source ? new Source(rsf.source) : new Source({ name: UNKNOWN_SOURCE_LABEL }, false), rsf.name, rsf.line, rsf.column); }); + }, (err: Error) => { + this.stoppedDetails.framesErrorMessage = err.message; + return []; }); } } -- GitLab