Skip to content

Commit e0d1731

Browse files
committed
Debug Console: Suggest old expressions from history across sessions
fixes #87129
1 parent d506ebe commit e0d1731

4 files changed

Lines changed: 35 additions & 29 deletions

File tree

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

Lines changed: 2 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import * as nls from 'vs/nls';
99
import * as platform from 'vs/base/common/platform';
1010
import severity from 'vs/base/common/severity';
1111
import { Event, Emitter } from 'vs/base/common/event';
12-
import { CompletionItem, completionKindFromString } from 'vs/editor/common/modes';
1312
import { Position, IPosition } from 'vs/editor/common/core/position';
1413
import * as aria from 'vs/base/browser/ui/aria/aria';
1514
import { IDebugSession, IConfig, IThread, IRawModelUpdate, IDebugService, IRawStoppedDetails, State, LoadedSourceEvent, IFunctionBreakpoint, IExceptionBreakpoint, IBreakpoint, IExceptionInfo, AdapterEndEvent, IDebugger, VIEWLET_ID, IDebugConfiguration, IReplElement, IStackFrame, IExpression, IReplElementSource, IDataBreakpoint, IDebugSessionOptions } from 'vs/workbench/contrib/debug/common/debug';
@@ -26,7 +25,6 @@ import { IHostService } from 'vs/workbench/services/host/browser/host';
2625
import { IExtensionHostDebugService } from 'vs/platform/debug/common/extensionHostDebug';
2726
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
2827
import { normalizeDriveLetter } from 'vs/base/common/labels';
29-
import { Range } from 'vs/editor/common/core/range';
3028
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
3129
import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet';
3230
import { ReplModel } from 'vs/workbench/contrib/debug/common/replModel';
@@ -567,35 +565,17 @@ export class DebugSession implements IDebugSession {
567565
}
568566
}
569567

570-
async completions(frameId: number | undefined, text: string, position: Position, overwriteBefore: number, token: CancellationToken): Promise<CompletionItem[]> {
568+
async completions(frameId: number | undefined, text: string, position: Position, overwriteBefore: number, token: CancellationToken): Promise<DebugProtocol.CompletionsResponse> {
571569
if (!this.raw) {
572570
return Promise.reject(new Error('no debug adapter'));
573571
}
574572

575-
const response = await this.raw.completions({
573+
return this.raw.completions({
576574
frameId,
577575
text,
578576
column: position.column,
579577
line: position.lineNumber,
580578
}, token);
581-
582-
const result: CompletionItem[] = [];
583-
if (response && response.body && response.body.targets) {
584-
response.body.targets.forEach(item => {
585-
if (item && item.label) {
586-
result.push({
587-
label: item.label,
588-
insertText: item.text || item.label,
589-
kind: completionKindFromString(item.type || 'property'),
590-
filterText: (item.start && item.length) ? text.substr(item.start, item.length).concat(item.label) : undefined,
591-
range: Range.fromPositions(position.delta(0, -(item.length || overwriteBefore)), position),
592-
sortText: item.sortText
593-
});
594-
}
595-
});
596-
}
597-
598-
return result;
599579
}
600580

601581
//---- threads

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

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { CancellationToken } from 'vs/base/common/cancellation';
1212
import { KeyCode, KeyMod } from 'vs/base/common/keyCodes';
1313
import { SuggestController } from 'vs/editor/contrib/suggest/suggestController';
1414
import { ITextModel } from 'vs/editor/common/model';
15+
import { Range } from 'vs/editor/common/core/range';
1516
import { Position } from 'vs/editor/common/core/position';
1617
import { registerEditorAction, ServicesAccessor, EditorAction } from 'vs/editor/browser/editorExtensions';
1718
import { IModelService } from 'vs/editor/common/services/modelService';
@@ -37,7 +38,7 @@ import { IDecorationOptions } from 'vs/editor/common/editorCommon';
3738
import { transparent, editorForeground } from 'vs/platform/theme/common/colorRegistry';
3839
import { ICodeEditorService } from 'vs/editor/browser/services/codeEditorService';
3940
import { FocusSessionActionViewItem } from 'vs/workbench/contrib/debug/browser/debugActionViewItems';
40-
import { CompletionContext, CompletionList, CompletionProviderRegistry } from 'vs/editor/common/modes';
41+
import { CompletionContext, CompletionList, CompletionProviderRegistry, CompletionItem, completionKindFromString, CompletionItemKind } from 'vs/editor/common/modes';
4142
import { first } from 'vs/base/common/arrays';
4243
import { IPanelService } from 'vs/workbench/services/panel/common/panelService';
4344
import { ITreeNode, ITreeContextMenuEvent, IAsyncDataSource } from 'vs/base/browser/ui/tree/tree';
@@ -141,7 +142,34 @@ export class Repl extends Panel implements IPrivateReplService, IHistoryNavigati
141142
const text = model.getValue();
142143
const focusedStackFrame = this.debugService.getViewModel().focusedStackFrame;
143144
const frameId = focusedStackFrame ? focusedStackFrame.frameId : undefined;
144-
const suggestions = await session.completions(frameId, text, position, overwriteBefore, token);
145+
const response = await session.completions(frameId, text, position, overwriteBefore, token);
146+
147+
const suggestions: CompletionItem[] = [];
148+
const computeRange = (length: number) => Range.fromPositions(position.delta(0, -length), position);
149+
if (response && response.body && response.body.targets) {
150+
response.body.targets.forEach(item => {
151+
if (item && item.label) {
152+
suggestions.push({
153+
label: item.label,
154+
insertText: item.text || item.label,
155+
kind: completionKindFromString(item.type || 'property'),
156+
filterText: (item.start && item.length) ? text.substr(item.start, item.length).concat(item.label) : undefined,
157+
range: computeRange(item.length || overwriteBefore),
158+
sortText: item.sortText
159+
});
160+
}
161+
});
162+
}
163+
164+
const history = this.history.getHistory();
165+
history.forEach(h => suggestions.push({
166+
label: h,
167+
insertText: h,
168+
kind: CompletionItemKind.Text,
169+
range: computeRange(h.length),
170+
sortText: 'ZZZ'
171+
}));
172+
145173
return { suggestions };
146174
}
147175

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import * as editorCommon from 'vs/editor/common/editorCommon';
1313
import { ITextModel as EditorIModel } from 'vs/editor/common/model';
1414
import { IEditor, ITextEditor } from 'vs/workbench/common/editor';
1515
import { Position, IPosition } from 'vs/editor/common/core/position';
16-
import { CompletionItem } from 'vs/editor/common/modes';
1716
import { Source } from 'vs/workbench/contrib/debug/common/debugSource';
1817
import { Range, IRange } from 'vs/editor/common/core/range';
1918
import { RawContextKey } from 'vs/platform/contextkey/common/contextkey';
@@ -234,7 +233,7 @@ export interface IDebugSession extends ITreeElement {
234233
pause(threadId: number): Promise<void>;
235234
terminateThreads(threadIds: number[]): Promise<void>;
236235

237-
completions(frameId: number | undefined, text: string, position: Position, overwriteBefore: number, token: CancellationToken): Promise<CompletionItem[]>;
236+
completions(frameId: number | undefined, text: string, position: Position, overwriteBefore: number, token: CancellationToken): Promise<DebugProtocol.CompletionsResponse>;
238237
setVariable(variablesReference: number | undefined, name: string, value: string): Promise<DebugProtocol.SetVariableResponse>;
239238
loadSource(resource: uri): Promise<DebugProtocol.SourceResponse>;
240239
getLoadedSources(): Promise<Source[]>;

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import { IWorkspaceFolder } from 'vs/platform/workspace/common/workspace';
99
import { Position, IPosition } from 'vs/editor/common/core/position';
1010
import { ILaunch, IDebugService, State, IDebugSession, IConfigurationManager, IStackFrame, IBreakpointData, IBreakpointUpdateData, IConfig, IDebugModel, IViewModel, IBreakpoint, LoadedSourceEvent, IThread, IRawModelUpdate, IFunctionBreakpoint, IExceptionBreakpoint, IDebugger, IExceptionInfo, AdapterEndEvent, IReplElement, IExpression, IReplElementSource, IDataBreakpoint, IDebugSessionOptions } from 'vs/workbench/contrib/debug/common/debug';
1111
import { Source } from 'vs/workbench/contrib/debug/common/debugSource';
12-
import { CompletionItem } from 'vs/editor/common/modes';
1312
import Severity from 'vs/base/common/severity';
1413
import { AbstractDebugAdapter } from 'vs/workbench/contrib/debug/common/abstractDebugAdapter';
1514

@@ -237,8 +236,8 @@ export class MockSession implements IDebugSession {
237236
return Promise.resolve([]);
238237
}
239238

240-
completions(frameId: number, text: string, position: Position, overwriteBefore: number): Promise<CompletionItem[]> {
241-
return Promise.resolve([]);
239+
completions(frameId: number, text: string, position: Position, overwriteBefore: number): Promise<DebugProtocol.CompletionsResponse> {
240+
throw new Error('not implemented');
242241
}
243242

244243
clearThreads(removeThreads: boolean, reference?: number): void { }

0 commit comments

Comments
 (0)