Path: blob/main/src/vs/editor/contrib/codeAction/browser/codeActionMenu.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*--------------------------------------------------------------------------------------------*/45import '../../../../base/browser/ui/codicons/codiconStyles.js'; // The codicon symbol styles are defined here and must be loaded6import { Codicon } from '../../../../base/common/codicons.js';7import { ThemeIcon } from '../../../../base/common/themables.js';8import { ResolvedKeybinding } from '../../../../base/common/keybindings.js';9import { CodeAction } from '../../../common/languages.js';10import { CodeActionItem, CodeActionKind } from '../common/types.js';11import '../../symbolIcons/browser/symbolIcons.js'; // The codicon symbol colors are defined here and must be loaded to get colors12import { localize } from '../../../../nls.js';13import { ActionListItemKind, IActionListItem } from '../../../../platform/actionWidget/browser/actionList.js';14import { HierarchicalKind } from '../../../../base/common/hierarchicalKind.js';1516interface ActionGroup {17readonly kind: HierarchicalKind;18readonly title: string;19readonly icon?: ThemeIcon;20}2122const uncategorizedCodeActionGroup = Object.freeze<ActionGroup>({ kind: HierarchicalKind.Empty, title: localize('codeAction.widget.id.more', 'More Actions...') });2324const codeActionGroups = Object.freeze<ActionGroup[]>([25{ kind: CodeActionKind.QuickFix, title: localize('codeAction.widget.id.quickfix', 'Quick Fix') },26{ kind: CodeActionKind.RefactorExtract, title: localize('codeAction.widget.id.extract', 'Extract'), icon: Codicon.wrench },27{ kind: CodeActionKind.RefactorInline, title: localize('codeAction.widget.id.inline', 'Inline'), icon: Codicon.wrench },28{ kind: CodeActionKind.RefactorRewrite, title: localize('codeAction.widget.id.convert', 'Rewrite'), icon: Codicon.wrench },29{ kind: CodeActionKind.RefactorMove, title: localize('codeAction.widget.id.move', 'Move'), icon: Codicon.wrench },30{ kind: CodeActionKind.SurroundWith, title: localize('codeAction.widget.id.surround', 'Surround With'), icon: Codicon.surroundWith },31{ kind: CodeActionKind.Source, title: localize('codeAction.widget.id.source', 'Source Action'), icon: Codicon.symbolFile },32uncategorizedCodeActionGroup,33]);3435export function toMenuItems(36inputCodeActions: readonly CodeActionItem[],37showHeaders: boolean,38keybindingResolver: (action: CodeAction) => ResolvedKeybinding | undefined39): IActionListItem<CodeActionItem>[] {40if (!showHeaders) {41return inputCodeActions.map((action): IActionListItem<CodeActionItem> => {42return {43kind: ActionListItemKind.Action,44item: action,45group: uncategorizedCodeActionGroup,46disabled: !!action.action.disabled,47label: action.action.disabled || action.action.title,48canPreview: !!action.action.edit?.edits.length,49};50});51}5253// Group code actions54const menuEntries = codeActionGroups.map(group => ({ group, actions: [] as CodeActionItem[] }));5556for (const action of inputCodeActions) {57const kind = action.action.kind ? new HierarchicalKind(action.action.kind) : HierarchicalKind.None;58for (const menuEntry of menuEntries) {59if (menuEntry.group.kind.contains(kind)) {60menuEntry.actions.push(action);61break;62}63}64}6566const allMenuItems: IActionListItem<CodeActionItem>[] = [];67for (const menuEntry of menuEntries) {68if (menuEntry.actions.length) {69allMenuItems.push({ kind: ActionListItemKind.Header, group: menuEntry.group });70for (const action of menuEntry.actions) {71const group = menuEntry.group;72allMenuItems.push({73kind: ActionListItemKind.Action,74item: action,75group: action.action.isAI ? { title: group.title, kind: group.kind, icon: Codicon.sparkle } : group,76label: action.action.title,77disabled: !!action.action.disabled,78keybinding: keybindingResolver(action.action),79});80}81}82}83return allMenuItems;84}858687