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