Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/contrib/debug/common/loadedScriptsPicker.ts
3296 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
import * as nls from '../../../../nls.js';
6
import { matchesFuzzy } from '../../../../base/common/filters.js';
7
import { Source } from './debugSource.js';
8
import { IQuickInputService, IQuickPickItem, IQuickPickSeparator } from '../../../../platform/quickinput/common/quickInput.js';
9
import { IDebugService, IDebugSession } from './debug.js';
10
import { IEditorService } from '../../../services/editor/common/editorService.js';
11
import { getIconClasses } from '../../../../editor/common/services/getIconClasses.js';
12
import { IModelService } from '../../../../editor/common/services/model.js';
13
import { ILanguageService } from '../../../../editor/common/languages/language.js';
14
import { DisposableStore } from '../../../../base/common/lifecycle.js';
15
16
import { dirname } from '../../../../base/common/resources.js';
17
import { ServicesAccessor } from '../../../../platform/instantiation/common/instantiation.js';
18
import { ILabelService } from '../../../../platform/label/common/label.js';
19
20
export interface IPickerDebugItem extends IQuickPickItem {
21
accept(): void;
22
}
23
24
/**
25
* This function takes a regular quickpick and makes one for loaded scripts that has persistent headers
26
* e.g. when some picks are filtered out, the ones that are visible still have its header.
27
*/
28
export async function showLoadedScriptMenu(accessor: ServicesAccessor) {
29
const quickInputService = accessor.get(IQuickInputService);
30
const debugService = accessor.get(IDebugService);
31
const editorService = accessor.get(IEditorService);
32
const sessions = debugService.getModel().getSessions(false);
33
const modelService = accessor.get(IModelService);
34
const languageService = accessor.get(ILanguageService);
35
const labelService = accessor.get(ILabelService);
36
37
const localDisposableStore = new DisposableStore();
38
const quickPick = quickInputService.createQuickPick<IPickerDebugItem>({ useSeparators: true });
39
localDisposableStore.add(quickPick);
40
quickPick.matchOnLabel = quickPick.matchOnDescription = quickPick.matchOnDetail = quickPick.sortByLabel = false;
41
quickPick.placeholder = nls.localize('moveFocusedView.selectView', "Search loaded scripts by name");
42
quickPick.items = await _getPicks(quickPick.value, sessions, editorService, modelService, languageService, labelService);
43
44
localDisposableStore.add(quickPick.onDidChangeValue(async () => {
45
quickPick.items = await _getPicks(quickPick.value, sessions, editorService, modelService, languageService, labelService);
46
}));
47
localDisposableStore.add(quickPick.onDidAccept(() => {
48
const selectedItem = quickPick.selectedItems[0];
49
selectedItem.accept();
50
quickPick.hide();
51
localDisposableStore.dispose();
52
}));
53
quickPick.show();
54
}
55
56
async function _getPicksFromSession(session: IDebugSession, filter: string, editorService: IEditorService, modelService: IModelService, languageService: ILanguageService, labelService: ILabelService): Promise<Array<IPickerDebugItem | IQuickPickSeparator>> {
57
const items: Array<IPickerDebugItem | IQuickPickSeparator> = [];
58
items.push({ type: 'separator', label: session.name });
59
const sources = await session.getLoadedSources();
60
61
sources.forEach((element: Source) => {
62
const pick = _createPick(element, filter, editorService, modelService, languageService, labelService);
63
if (pick) {
64
items.push(pick);
65
}
66
67
});
68
return items;
69
}
70
async function _getPicks(filter: string, sessions: IDebugSession[], editorService: IEditorService, modelService: IModelService, languageService: ILanguageService, labelService: ILabelService): Promise<Array<IPickerDebugItem | IQuickPickSeparator>> {
71
const loadedScriptPicks: Array<IPickerDebugItem | IQuickPickSeparator> = [];
72
73
74
const picks = await Promise.all(
75
sessions.map((session) => _getPicksFromSession(session, filter, editorService, modelService, languageService, labelService))
76
);
77
78
for (const row of picks) {
79
for (const elem of row) {
80
loadedScriptPicks.push(elem);
81
}
82
}
83
return loadedScriptPicks;
84
}
85
86
function _createPick(source: Source, filter: string, editorService: IEditorService, modelService: IModelService, languageService: ILanguageService, labelService: ILabelService): IPickerDebugItem | undefined {
87
88
const label = labelService.getUriBasenameLabel(source.uri);
89
const desc = labelService.getUriLabel(dirname(source.uri));
90
91
// manually filter so that headers don't get filtered out
92
const labelHighlights = matchesFuzzy(filter, label, true);
93
const descHighlights = matchesFuzzy(filter, desc, true);
94
if (labelHighlights || descHighlights) {
95
return {
96
label,
97
description: desc === '.' ? undefined : desc,
98
highlights: { label: labelHighlights ?? undefined, description: descHighlights ?? undefined },
99
iconClasses: getIconClasses(modelService, languageService, source.uri),
100
accept: () => {
101
if (source.available) {
102
source.openInEditor(editorService, { startLineNumber: 0, startColumn: 0, endLineNumber: 0, endColumn: 0 });
103
}
104
}
105
};
106
}
107
return undefined;
108
}
109
110