Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We鈥檒l occasionally send you account related emails.

Already on GitHub? Sign in to your account

debug: show errros from scopes request #92375

Merged
merged 3 commits into from Mar 12, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Expand Up @@ -125,7 +125,8 @@
font-style: italic;
}

.monaco-workbench .monaco-list-row .expression .error {
.monaco-workbench .monaco-list-row .expression .error,
.monaco-workbench .debug-pane .debug-variables .scope .error {
color: #e51400;
}

Expand All @@ -145,7 +146,8 @@
color: rgba(204, 204, 204, 0.6);
}

.vs-dark .monaco-workbench .monaco-list-row .expression .error {
.vs-dark .monaco-workbench .monaco-list-row .expression .error,
.vs-dark .monaco-workbench .debug-pane .debug-variables .scope .error {
color: #f48771;
}

Expand Down Expand Up @@ -173,7 +175,8 @@
color: #ce9178;
}

.hc-black .monaco-workbench .monaco-list-row .expression .error {
.hc-black .monaco-workbench .monaco-list-row .expression .error,
.hc-black .monaco-workbench .debug-pane .debug-variables .scope .error {
color: #f48771;
}

Expand Down
8 changes: 8 additions & 0 deletions src/vs/workbench/contrib/debug/browser/media/debugViewlet.css
Expand Up @@ -316,6 +316,14 @@
animation-name: debugViewletValueChanged;
}

.debug-pane .debug-variables .scope .error {
font-style: italic;
text-overflow: ellipsis;
overflow: hidden;
font-family: var(--monaco-monospace-font);
font-weight: normal;
}

/* Breakpoints */

.debug-pane .monaco-list-row {
Expand Down
37 changes: 34 additions & 3 deletions src/vs/workbench/contrib/debug/browser/variablesView.ts
Expand Up @@ -9,7 +9,7 @@ import * as dom from 'vs/base/browser/dom';
import { CollapseAction } from 'vs/workbench/browser/viewlet';
import { IViewletViewOptions } from 'vs/workbench/browser/parts/views/viewsViewlet';
import { IDebugService, IExpression, IScope, CONTEXT_VARIABLES_FOCUSED, IViewModel } from 'vs/workbench/contrib/debug/common/debug';
import { Variable, Scope } from 'vs/workbench/contrib/debug/common/debugModel';
import { Variable, Scope, ErrorScope } from 'vs/workbench/contrib/debug/common/debugModel';
import { IContextMenuService } from 'vs/platform/contextview/browser/contextView';
import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding';
import { renderViewTree, renderVariable, IInputBoxOptions, AbstractExpressionsRenderer, IExpressionTemplateData } from 'vs/workbench/contrib/debug/browser/baseDebugView';
Expand Down Expand Up @@ -97,7 +97,7 @@ export class VariablesView extends ViewPane {
const treeContainer = renderViewTree(container);

this.tree = <WorkbenchAsyncDataTree<IViewModel | IExpression | IScope, IExpression | IScope, FuzzyScore>>this.instantiationService.createInstance(WorkbenchAsyncDataTree, 'VariablesView', treeContainer, new VariablesDelegate(),
[this.instantiationService.createInstance(VariablesRenderer), new ScopesRenderer()],
[this.instantiationService.createInstance(VariablesRenderer), new ScopesRenderer(), new ScopeErrorRenderer()],
new VariablesDataSource(), {
ariaLabel: nls.localize('variablesAriaTreeLabel', "Debug Variables"),
accessibilityProvider: new VariablesAccessibilityProvider(),
Expand Down Expand Up @@ -217,7 +217,7 @@ function isViewModel(obj: any): obj is IViewModel {
export class VariablesDataSource implements IAsyncDataSource<IViewModel, IExpression | IScope> {

hasChildren(element: IViewModel | IExpression | IScope): boolean {
if (isViewModel(element) || element instanceof Scope) {
if (isViewModel(element)) {
return true;
}

Expand Down Expand Up @@ -246,6 +246,10 @@ class VariablesDelegate implements IListVirtualDelegate<IExpression | IScope> {
}

getTemplateId(element: IExpression | IScope): string {
if (element instanceof ErrorScope) {
return ScopeErrorRenderer.ID;
}

if (element instanceof Scope) {
return ScopesRenderer.ID;
}
Expand Down Expand Up @@ -278,6 +282,33 @@ class ScopesRenderer implements ITreeRenderer<IScope, FuzzyScore, IScopeTemplate
}
}

interface IScopeErrorTemplateData {
error: HTMLElement;
}

class ScopeErrorRenderer implements ITreeRenderer<IScope, FuzzyScore, IScopeErrorTemplateData> {

static readonly ID = 'scopeError';

get templateId(): string {
return ScopeErrorRenderer.ID;
}

renderTemplate(container: HTMLElement): IScopeErrorTemplateData {
const wrapper = dom.append(container, $('.scope'));
const error = dom.append(wrapper, $('.error'));
return { error };
}

renderElement(element: ITreeNode<IScope, FuzzyScore>, index: number, templateData: IScopeErrorTemplateData): void {
templateData.error.innerText = element.element.name;
}

disposeTemplate(): void {
// noop
}
}

export class VariablesRenderer extends AbstractExpressionsRenderer {

static readonly ID = 'variable';
Expand Down
1 change: 1 addition & 0 deletions src/vs/workbench/contrib/debug/common/debug.ts
Expand Up @@ -301,6 +301,7 @@ export interface IScope extends IExpressionContainer {
readonly name: string;
readonly expensive: boolean;
readonly range?: IRange;
readonly hasChildren: boolean;
}

export interface IStackFrame extends ITreeElement {
Expand Down
17 changes: 16 additions & 1 deletion src/vs/workbench/contrib/debug/common/debugModel.ts
Expand Up @@ -269,6 +269,21 @@ export class Scope extends ExpressionContainer implements IScope {
}
}

export class ErrorScope extends Scope {

constructor(
stackFrame: IStackFrame,
index: number,
message: string,
) {
super(stackFrame, index, message, 0, false);
}

toString(): string {
return this.name;
}
}

export class StackFrame implements IStackFrame {

private scopes: Promise<Scope[]> | undefined;
Expand All @@ -293,7 +308,7 @@ export class StackFrame implements IStackFrame {
return response && response.body && response.body.scopes ?
response.body.scopes.map((rs, index) => new Scope(this, index, rs.name, rs.variablesReference, rs.expensive, rs.namedVariables, rs.indexedVariables,
rs.line && rs.column && rs.endLine && rs.endColumn ? new Range(rs.line, rs.column, rs.endLine, rs.endColumn) : undefined)) : [];
}, err => []);
}, err => [new ErrorScope(this, 0, err.message)]);
}

return this.scopes;
Expand Down