Skip to content

Commit cda1568

Browse files
committed
debug: variables actions transition to commands
fixes microsoft#105830
1 parent 17c1929 commit cda1568

5 files changed

Lines changed: 110 additions & 48 deletions

File tree

src/vs/workbench/contrib/debug/browser/debug.contribution.ts

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import { CallStackView } from 'vs/workbench/contrib/debug/browser/callStackView'
1717
import { Extensions as WorkbenchExtensions, IWorkbenchContributionsRegistry } from 'vs/workbench/common/contributions';
1818
import {
1919
IDebugService, VIEWLET_ID, DEBUG_PANEL_ID, CONTEXT_IN_DEBUG_MODE, INTERNAL_CONSOLE_OPTIONS_SCHEMA,
20-
CONTEXT_DEBUG_STATE, VARIABLES_VIEW_ID, CALLSTACK_VIEW_ID, WATCH_VIEW_ID, BREAKPOINTS_VIEW_ID, LOADED_SCRIPTS_VIEW_ID, CONTEXT_LOADED_SCRIPTS_SUPPORTED, CONTEXT_FOCUSED_SESSION_IS_ATTACH, CONTEXT_STEP_BACK_SUPPORTED, CONTEXT_CALLSTACK_ITEM_TYPE, CONTEXT_RESTART_FRAME_SUPPORTED, CONTEXT_JUMP_TO_CURSOR_SUPPORTED, CONTEXT_DEBUG_UX, BREAKPOINT_EDITOR_CONTRIBUTION_ID, REPL_VIEW_ID, CONTEXT_BREAKPOINTS_EXIST, EDITOR_CONTRIBUTION_ID, CONTEXT_DEBUGGERS_AVAILABLE,
20+
CONTEXT_DEBUG_STATE, VARIABLES_VIEW_ID, CALLSTACK_VIEW_ID, WATCH_VIEW_ID, BREAKPOINTS_VIEW_ID, LOADED_SCRIPTS_VIEW_ID, CONTEXT_LOADED_SCRIPTS_SUPPORTED, CONTEXT_FOCUSED_SESSION_IS_ATTACH, CONTEXT_STEP_BACK_SUPPORTED, CONTEXT_CALLSTACK_ITEM_TYPE, CONTEXT_RESTART_FRAME_SUPPORTED, CONTEXT_JUMP_TO_CURSOR_SUPPORTED, CONTEXT_DEBUG_UX, BREAKPOINT_EDITOR_CONTRIBUTION_ID, REPL_VIEW_ID, CONTEXT_BREAKPOINTS_EXIST, EDITOR_CONTRIBUTION_ID, CONTEXT_DEBUGGERS_AVAILABLE, CONTEXT_SET_VARIABLE_SUPPORTED, CONTEXT_BREAK_WHEN_VALUE_CHANGES_SUPPORTED, CONTEXT_VARIABLE_EVALUATE_NAME_PRESENT,
2121
} from 'vs/workbench/contrib/debug/common/debug';
2222
import { StartAction, AddFunctionBreakpointAction, ConfigureAction, DisableAllBreakpointsAction, EnableAllBreakpointsAction, RemoveAllBreakpointsAction, RunAction, ReapplyBreakpointsAction, SelectAndStartAction } from 'vs/workbench/contrib/debug/browser/debugActions';
2323
import { DebugToolBar } from 'vs/workbench/contrib/debug/browser/debugToolBar';
@@ -34,7 +34,7 @@ import { launchSchemaId } from 'vs/workbench/services/configuration/common/confi
3434
import { LoadedScriptsView } from 'vs/workbench/contrib/debug/browser/loadedScriptsView';
3535
import { ADD_LOG_POINT_ID, TOGGLE_CONDITIONAL_BREAKPOINT_ID, TOGGLE_BREAKPOINT_ID, RunToCursorAction, registerEditorActions } from 'vs/workbench/contrib/debug/browser/debugEditorActions';
3636
import { WatchExpressionsView } from 'vs/workbench/contrib/debug/browser/watchExpressionsView';
37-
import { VariablesView } from 'vs/workbench/contrib/debug/browser/variablesView';
37+
import { VariablesView, SET_VARIABLE_ID, COPY_VALUE_ID, BREAK_WHEN_VALUE_CHANGES_ID, COPY_EVALUATE_PATH_ID, ADD_TO_WATCH_ID } from 'vs/workbench/contrib/debug/browser/variablesView';
3838
import { ClearReplAction, Repl } from 'vs/workbench/contrib/debug/browser/repl';
3939
import { DebugContentProvider } from 'vs/workbench/contrib/debug/common/debugContentProvider';
4040
import { WelcomeView } from 'vs/workbench/contrib/debug/browser/welcomeView';
@@ -164,8 +164,8 @@ function registerCommandsAndActions(): void {
164164
registerDebugToolBarItem(REVERSE_CONTINUE_ID, nls.localize('reverseContinue', "Reverse"), 60, { id: 'codicon/debug-reverse-continue' }, CONTEXT_STEP_BACK_SUPPORTED, CONTEXT_DEBUG_STATE.isEqualTo('stopped'));
165165

166166
// Debug callstack context menu
167-
const registerDebugCallstackItem = (id: string, title: string, order: number, when?: ContextKeyExpression, precondition?: ContextKeyExpression, group = 'navigation') => {
168-
MenuRegistry.appendMenuItem(MenuId.DebugCallStackContext, {
167+
const registerDebugViewMenuItem = (menuId: MenuId, id: string, title: string, order: number, when?: ContextKeyExpression, precondition?: ContextKeyExpression, group = 'navigation') => {
168+
MenuRegistry.appendMenuItem(menuId, {
169169
group,
170170
when,
171171
order,
@@ -176,16 +176,22 @@ function registerCommandsAndActions(): void {
176176
}
177177
});
178178
};
179-
registerDebugCallstackItem(RESTART_SESSION_ID, RESTART_LABEL, 10, CONTEXT_CALLSTACK_ITEM_TYPE.isEqualTo('session'));
180-
registerDebugCallstackItem(STOP_ID, STOP_LABEL, 20, CONTEXT_CALLSTACK_ITEM_TYPE.isEqualTo('session'));
181-
registerDebugCallstackItem(PAUSE_ID, PAUSE_LABEL, 10, ContextKeyExpr.and(CONTEXT_CALLSTACK_ITEM_TYPE.isEqualTo('thread'), CONTEXT_DEBUG_STATE.isEqualTo('running')));
182-
registerDebugCallstackItem(CONTINUE_ID, CONTINUE_LABEL, 10, ContextKeyExpr.and(CONTEXT_CALLSTACK_ITEM_TYPE.isEqualTo('thread'), CONTEXT_DEBUG_STATE.isEqualTo('stopped')));
183-
registerDebugCallstackItem(STEP_OVER_ID, STEP_OVER_LABEL, 20, CONTEXT_CALLSTACK_ITEM_TYPE.isEqualTo('thread'), CONTEXT_DEBUG_STATE.isEqualTo('stopped'));
184-
registerDebugCallstackItem(STEP_INTO_ID, STEP_INTO_LABEL, 30, CONTEXT_CALLSTACK_ITEM_TYPE.isEqualTo('thread'), CONTEXT_DEBUG_STATE.isEqualTo('stopped'));
185-
registerDebugCallstackItem(STEP_OUT_ID, STEP_OUT_LABEL, 40, CONTEXT_CALLSTACK_ITEM_TYPE.isEqualTo('thread'), CONTEXT_DEBUG_STATE.isEqualTo('stopped'));
186-
registerDebugCallstackItem(TERMINATE_THREAD_ID, nls.localize('terminateThread', "Terminate Thread"), 10, CONTEXT_CALLSTACK_ITEM_TYPE.isEqualTo('thread'), undefined, 'termination');
187-
registerDebugCallstackItem(RESTART_FRAME_ID, nls.localize('restartFrame', "Restart Frame"), 10, ContextKeyExpr.and(CONTEXT_CALLSTACK_ITEM_TYPE.isEqualTo('stackFrame'), CONTEXT_RESTART_FRAME_SUPPORTED));
188-
registerDebugCallstackItem(COPY_STACK_TRACE_ID, nls.localize('copyStackTrace', "Copy Call Stack"), 20, CONTEXT_CALLSTACK_ITEM_TYPE.isEqualTo('stackFrame'));
179+
registerDebugViewMenuItem(MenuId.DebugCallStackContext, RESTART_SESSION_ID, RESTART_LABEL, 10, CONTEXT_CALLSTACK_ITEM_TYPE.isEqualTo('session'));
180+
registerDebugViewMenuItem(MenuId.DebugCallStackContext, STOP_ID, STOP_LABEL, 20, CONTEXT_CALLSTACK_ITEM_TYPE.isEqualTo('session'));
181+
registerDebugViewMenuItem(MenuId.DebugCallStackContext, PAUSE_ID, PAUSE_LABEL, 10, ContextKeyExpr.and(CONTEXT_CALLSTACK_ITEM_TYPE.isEqualTo('thread'), CONTEXT_DEBUG_STATE.isEqualTo('running')));
182+
registerDebugViewMenuItem(MenuId.DebugCallStackContext, CONTINUE_ID, CONTINUE_LABEL, 10, ContextKeyExpr.and(CONTEXT_CALLSTACK_ITEM_TYPE.isEqualTo('thread'), CONTEXT_DEBUG_STATE.isEqualTo('stopped')));
183+
registerDebugViewMenuItem(MenuId.DebugCallStackContext, STEP_OVER_ID, STEP_OVER_LABEL, 20, CONTEXT_CALLSTACK_ITEM_TYPE.isEqualTo('thread'), CONTEXT_DEBUG_STATE.isEqualTo('stopped'));
184+
registerDebugViewMenuItem(MenuId.DebugCallStackContext, STEP_INTO_ID, STEP_INTO_LABEL, 30, CONTEXT_CALLSTACK_ITEM_TYPE.isEqualTo('thread'), CONTEXT_DEBUG_STATE.isEqualTo('stopped'));
185+
registerDebugViewMenuItem(MenuId.DebugCallStackContext, STEP_OUT_ID, STEP_OUT_LABEL, 40, CONTEXT_CALLSTACK_ITEM_TYPE.isEqualTo('thread'), CONTEXT_DEBUG_STATE.isEqualTo('stopped'));
186+
registerDebugViewMenuItem(MenuId.DebugCallStackContext, TERMINATE_THREAD_ID, nls.localize('terminateThread', "Terminate Thread"), 10, CONTEXT_CALLSTACK_ITEM_TYPE.isEqualTo('thread'), undefined, 'termination');
187+
registerDebugViewMenuItem(MenuId.DebugCallStackContext, RESTART_FRAME_ID, nls.localize('restartFrame', "Restart Frame"), 10, ContextKeyExpr.and(CONTEXT_CALLSTACK_ITEM_TYPE.isEqualTo('stackFrame'), CONTEXT_RESTART_FRAME_SUPPORTED));
188+
registerDebugViewMenuItem(MenuId.DebugCallStackContext, COPY_STACK_TRACE_ID, nls.localize('copyStackTrace', "Copy Call Stack"), 20, CONTEXT_CALLSTACK_ITEM_TYPE.isEqualTo('stackFrame'));
189+
190+
registerDebugViewMenuItem(MenuId.DebugVariablesContext, SET_VARIABLE_ID, nls.localize('setValue', "Set Value"), 10, CONTEXT_SET_VARIABLE_SUPPORTED);
191+
registerDebugViewMenuItem(MenuId.DebugVariablesContext, COPY_VALUE_ID, nls.localize('copyValue', "Copy Value"), 20);
192+
registerDebugViewMenuItem(MenuId.DebugVariablesContext, COPY_EVALUATE_PATH_ID, nls.localize('copyAsExpression', "Copy as Expression"), 30, CONTEXT_VARIABLE_EVALUATE_NAME_PRESENT);
193+
registerDebugViewMenuItem(MenuId.DebugVariablesContext, ADD_TO_WATCH_ID, nls.localize('addToWatchExpressions', "Add to Watch"), 10, CONTEXT_VARIABLE_EVALUATE_NAME_PRESENT, undefined, '3_watch');
194+
registerDebugViewMenuItem(MenuId.DebugVariablesContext, BREAK_WHEN_VALUE_CHANGES_ID, nls.localize('breakWhenValueChanges', "Break When Value Changes"), 20, CONTEXT_BREAK_WHEN_VALUE_CHANGES_SUPPORTED, undefined, '5_breakpoint');
189195

190196
// Touch Bar
191197
if (isMacintosh) {

src/vs/workbench/contrib/debug/browser/variablesView.ts

Lines changed: 73 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,19 @@ import { RunOnceScheduler } from 'vs/base/common/async';
88
import * as dom from 'vs/base/browser/dom';
99
import { CollapseAction } from 'vs/workbench/browser/viewlet';
1010
import { IViewletViewOptions } from 'vs/workbench/browser/parts/views/viewsViewlet';
11-
import { IDebugService, IExpression, IScope, CONTEXT_VARIABLES_FOCUSED, IStackFrame, CONTEXT_DEBUG_PROTOCOL_VARIABLE_MENU_CONTEXT } from 'vs/workbench/contrib/debug/common/debug';
11+
import { IDebugService, IExpression, IScope, CONTEXT_VARIABLES_FOCUSED, IStackFrame, CONTEXT_DEBUG_PROTOCOL_VARIABLE_MENU_CONTEXT, IDataBreakpointInfoResponse, CONTEXT_BREAK_WHEN_VALUE_CHANGES_SUPPORTED, CONTEXT_VARIABLE_EVALUATE_NAME_PRESENT } from 'vs/workbench/contrib/debug/common/debug';
1212
import { Variable, Scope, ErrorScope, StackFrame } from 'vs/workbench/contrib/debug/common/debugModel';
1313
import { IContextMenuService } from 'vs/platform/contextview/browser/contextView';
1414
import { IKeybindingService } from 'vs/platform/keybinding/common/keybinding';
1515
import { renderViewTree, renderVariable, IInputBoxOptions, AbstractExpressionsRenderer, IExpressionTemplateData } from 'vs/workbench/contrib/debug/browser/baseDebugView';
16-
import { IAction, Action, Separator } from 'vs/base/common/actions';
16+
import { IAction } from 'vs/base/common/actions';
1717
import { CopyValueAction } from 'vs/workbench/contrib/debug/browser/debugActions';
1818
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
1919
import { ViewPane } from 'vs/workbench/browser/parts/views/viewPaneContainer';
2020
import { IListAccessibilityProvider } from 'vs/base/browser/ui/list/listWidget';
2121
import { IListVirtualDelegate } from 'vs/base/browser/ui/list/list';
2222
import { ITreeRenderer, ITreeNode, ITreeMouseEvent, ITreeContextMenuEvent, IAsyncDataSource } from 'vs/base/browser/ui/tree/tree';
23-
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
23+
import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation';
2424
import { Emitter } from 'vs/base/common/event';
2525
import { WorkbenchAsyncDataTree } from 'vs/platform/list/browser/listService';
2626
import { IAsyncDataTreeViewState } from 'vs/base/browser/ui/tree/asyncDataTree';
@@ -36,11 +36,19 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
3636
import { withUndefinedAsNull } from 'vs/base/common/types';
3737
import { IMenuService, IMenu, MenuId } from 'vs/platform/actions/common/actions';
3838
import { createAndFillInContextMenuActions } from 'vs/platform/actions/browser/menuEntryActionViewItem';
39+
import { CommandsRegistry } from 'vs/platform/commands/common/commands';
3940

4041
const $ = dom.$;
4142
let forgetScopes = true;
4243

4344
export const variableSetEmitter = new Emitter<void>();
45+
let variableInternalContext: Variable | undefined;
46+
let dataBreakpointInfoResponse: IDataBreakpointInfoResponse | undefined;
47+
48+
interface IVariablesContext {
49+
container: DebugProtocol.Variable | DebugProtocol.Scope;
50+
variable: DebugProtocol.Variable;
51+
}
4452

4553
export class VariablesView extends ViewPane {
4654

@@ -51,6 +59,8 @@ export class VariablesView extends ViewPane {
5159
private autoExpandedScopes = new Set<string>();
5260
private menu: IMenu;
5361
private debugProtocolVariableMenuContext: IContextKey<string>;
62+
private breakWhenValueChangesSupported: IContextKey<boolean>;
63+
private variableEvaluateName: IContextKey<boolean>;
5464

5565
constructor(
5666
options: IViewletViewOptions,
@@ -60,7 +70,6 @@ export class VariablesView extends ViewPane {
6070
@IConfigurationService configurationService: IConfigurationService,
6171
@IInstantiationService instantiationService: IInstantiationService,
6272
@IViewDescriptorService viewDescriptorService: IViewDescriptorService,
63-
@IClipboardService private readonly clipboardService: IClipboardService,
6473
@IContextKeyService contextKeyService: IContextKeyService,
6574
@IOpenerService openerService: IOpenerService,
6675
@IThemeService themeService: IThemeService,
@@ -72,6 +81,8 @@ export class VariablesView extends ViewPane {
7281
this.menu = menuService.createMenu(MenuId.DebugVariablesContext, contextKeyService);
7382
this._register(this.menu);
7483
this.debugProtocolVariableMenuContext = CONTEXT_DEBUG_PROTOCOL_VARIABLE_MENU_CONTEXT.bindTo(contextKeyService);
84+
this.breakWhenValueChangesSupported = CONTEXT_BREAK_WHEN_VALUE_CHANGES_SUPPORTED.bindTo(contextKeyService);
85+
this.variableEvaluateName = CONTEXT_VARIABLE_EVALUATE_NAME_PRESENT.bindTo(contextKeyService);
7586

7687
// Use scheduler to prevent unnecessary flashing
7788
this.onFocusStackFrameScheduler = new RunOnceScheduler(async () => {
@@ -193,45 +204,25 @@ export class VariablesView extends ViewPane {
193204
const variable = e.element;
194205
if (variable instanceof Variable && !!variable.value) {
195206
this.debugProtocolVariableMenuContext.set(variable.variableMenuContext || '');
196-
197-
const actions: IAction[] = [];
207+
variableInternalContext = variable;
198208
const session = this.debugService.getViewModel().focusedSession;
199-
if (session && session.capabilities.supportsSetVariable) {
200-
actions.push(new Action('workbench.setValue', nls.localize('setValue', "Set Value"), undefined, true, async () => {
201-
this.debugService.getViewModel().setSelectedExpression(variable);
202-
}));
203-
}
204-
actions.push(this.instantiationService.createInstance(CopyValueAction, CopyValueAction.ID, CopyValueAction.LABEL, variable, 'variables'));
205-
if (variable.evaluateName) {
206-
actions.push(new Action('debug.copyEvaluatePath', nls.localize('copyAsExpression', "Copy as Expression"), undefined, true, async () => {
207-
await this.clipboardService.writeText(variable.evaluateName!);
208-
}));
209-
actions.push(new Separator());
210-
actions.push(new Action('debug.addToWatchExpressions', nls.localize('addToWatchExpressions', "Add to Watch"), undefined, true, async () => {
211-
this.debugService.addWatchExpression(variable.evaluateName);
212-
}));
213-
}
209+
this.variableEvaluateName.set(!!variable.evaluateName);
210+
this.breakWhenValueChangesSupported.reset();
214211
if (session && session.capabilities.supportsDataBreakpoints) {
215212
const response = await session.dataBreakpointInfo(variable.name, variable.parent.reference);
216-
const dataid = response?.dataId;
217-
if (response && dataid) {
218-
actions.push(new Separator());
219-
actions.push(new Action('debug.breakWhenValueChanges', nls.localize('breakWhenValueChanges', "Break When Value Changes"), undefined, true, async () => {
220-
await this.debugService.addDataBreakpoint(response.description, dataid, !!response.canPersist, response.accessTypes);
221-
}));
222-
}
213+
const dataBreakpointId = response?.dataId;
214+
this.breakWhenValueChangesSupported.set(!!dataBreakpointId);
223215
}
224216

225-
const context = {
217+
const context: IVariablesContext = {
226218
container: (variable.parent as (Variable | Scope)).toDebugProtocolObject(),
227219
variable: variable.toDebugProtocolObject()
228220
};
221+
const actions: IAction[] = [];
229222
const actionsDisposable = createAndFillInContextMenuActions(this.menu, { arg: context, shouldForwardArgs: false }, actions, this.contextMenuService);
230-
231223
this.contextMenuService.showContextMenu({
232224
getAnchor: () => e.anchor,
233225
getActions: () => actions,
234-
getActionsContext: () => variable,
235226
onHide: () => dispose(actionsDisposable)
236227
});
237228
}
@@ -392,3 +383,54 @@ class VariablesAccessibilityProvider implements IListAccessibilityProvider<IExpr
392383
return null;
393384
}
394385
}
386+
387+
export const SET_VARIABLE_ID = 'debug.setVariable';
388+
CommandsRegistry.registerCommand({
389+
id: SET_VARIABLE_ID,
390+
handler: (accessor: ServicesAccessor) => {
391+
const debugService = accessor.get(IDebugService);
392+
debugService.getViewModel().setSelectedExpression(variableInternalContext);
393+
}
394+
});
395+
396+
export const COPY_VALUE_ID = 'debug.copyValue';
397+
CommandsRegistry.registerCommand({
398+
id: COPY_VALUE_ID,
399+
handler: async (accessor: ServicesAccessor) => {
400+
const instantiationService = accessor.get(IInstantiationService);
401+
if (variableInternalContext) {
402+
const action = instantiationService.createInstance(CopyValueAction, CopyValueAction.ID, CopyValueAction.LABEL, variableInternalContext, 'variables');
403+
await action.run();
404+
}
405+
}
406+
});
407+
408+
export const BREAK_WHEN_VALUE_CHANGES_ID = 'debug.breakWhenValueChanges';
409+
CommandsRegistry.registerCommand({
410+
id: BREAK_WHEN_VALUE_CHANGES_ID,
411+
handler: async (accessor: ServicesAccessor) => {
412+
const debugService = accessor.get(IDebugService);
413+
if (dataBreakpointInfoResponse) {
414+
await debugService.addDataBreakpoint(dataBreakpointInfoResponse.description, dataBreakpointInfoResponse.dataId!, !!dataBreakpointInfoResponse.canPersist, dataBreakpointInfoResponse.accessTypes);
415+
}
416+
}
417+
});
418+
419+
export const COPY_EVALUATE_PATH_ID = 'debug.copyEvaluatePath';
420+
CommandsRegistry.registerCommand({
421+
id: COPY_EVALUATE_PATH_ID,
422+
handler: async (accessor: ServicesAccessor, context: IVariablesContext) => {
423+
const clipboardService = accessor.get(IClipboardService);
424+
await clipboardService.writeText(context.variable.evaluateName!);
425+
}
426+
});
427+
428+
export const ADD_TO_WATCH_ID = 'debug.addToWatchExpressions';
429+
CommandsRegistry.registerCommand({
430+
id: ADD_TO_WATCH_ID,
431+
handler: async (accessor: ServicesAccessor, context: IVariablesContext) => {
432+
const debugService = accessor.get(IDebugService);
433+
debugService.addWatchExpression(context.variable.evaluateName);
434+
}
435+
});
436+

src/vs/workbench/contrib/debug/common/debug.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,9 @@ export const CONTEXT_STEP_INTO_TARGETS_SUPPORTED = new RawContextKey<boolean>('s
6161
export const CONTEXT_BREAKPOINTS_EXIST = new RawContextKey<boolean>('breakpointsExist', false);
6262
export const CONTEXT_DEBUGGERS_AVAILABLE = new RawContextKey<boolean>('debuggersAvailable', false);
6363
export const CONTEXT_DEBUG_PROTOCOL_VARIABLE_MENU_CONTEXT = new RawContextKey<string>('debugProtocolVariableMenuContext', undefined);
64+
export const CONTEXT_SET_VARIABLE_SUPPORTED = new RawContextKey<boolean>('debugSetVariableSupported', false);
65+
export const CONTEXT_BREAK_WHEN_VALUE_CHANGES_SUPPORTED = new RawContextKey<boolean>('breakWhenValueChangesSupported', false);
66+
export const CONTEXT_VARIABLE_EVALUATE_NAME_PRESENT = new RawContextKey<boolean>('variableEvaluateNamePresent', false);
6467

6568
export const EDITOR_CONTRIBUTION_ID = 'editor.contrib.debug';
6669
export const BREAKPOINT_EDITOR_CONTRIBUTION_ID = 'editor.contrib.breakpoint';
@@ -162,6 +165,13 @@ export interface IDebugSessionOptions {
162165
compact?: boolean;
163166
}
164167

168+
export interface IDataBreakpointInfoResponse {
169+
dataId: string | null;
170+
description: string;
171+
canPersist?: boolean,
172+
accessTypes?: DebugProtocol.DataBreakpointAccessType[];
173+
}
174+
165175
export interface IDebugSession extends ITreeElement {
166176

167177
readonly configuration: IConfig;
@@ -222,7 +232,7 @@ export interface IDebugSession extends ITreeElement {
222232

223233
sendBreakpoints(modelUri: uri, bpts: IBreakpoint[], sourceModified: boolean): Promise<void>;
224234
sendFunctionBreakpoints(fbps: IFunctionBreakpoint[]): Promise<void>;
225-
dataBreakpointInfo(name: string, variablesReference?: number): Promise<{ dataId: string | null, description: string, canPersist?: boolean, accessTypes?: DebugProtocol.DataBreakpointAccessType[] } | undefined>;
235+
dataBreakpointInfo(name: string, variablesReference?: number): Promise<IDataBreakpointInfoResponse | undefined>;
226236
sendDataBreakpoints(dbps: IDataBreakpoint[]): Promise<void>;
227237
sendExceptionBreakpoints(exbpts: IExceptionBreakpoint[]): Promise<void>;
228238
breakpointsLocations(uri: uri, lineNumber: number): Promise<IPosition[]>;

src/vs/workbench/contrib/debug/common/debugModel.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,8 @@ export class Variable extends ExpressionContainer implements IExpression {
257257
return {
258258
name: this.name,
259259
variablesReference: this.reference || 0,
260-
value: this.value
260+
value: this.value,
261+
evaluateName: this.evaluateName
261262
};
262263
}
263264
}

0 commit comments

Comments
 (0)