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