perf - use bulk function to add command and menu items, fixes #96693

This commit is contained in:
Johannes Rieken
2020-05-01 11:00:06 +02:00
parent b19b7a7f41
commit 2bac47762d
4 changed files with 83 additions and 34 deletions

View File

@@ -10,7 +10,7 @@ import { IJSONSchema } from 'vs/base/common/jsonSchema';
import { forEach } from 'vs/base/common/collections';
import { IExtensionPointUser, ExtensionMessageCollector, ExtensionsRegistry } from 'vs/workbench/services/extensions/common/extensionsRegistry';
import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey';
import { MenuId, MenuRegistry, ILocalizedString, IMenuItem } from 'vs/platform/actions/common/actions';
import { MenuId, MenuRegistry, ILocalizedString, IMenuItem, ICommandAction } from 'vs/platform/actions/common/actions';
import { URI } from 'vs/base/common/uri';
import { DisposableStore } from 'vs/base/common/lifecycle';
import { ThemeIcon } from 'vs/platform/theme/common/themeService';
@@ -381,7 +381,7 @@ export const commandsExtensionPoint = ExtensionsRegistry.registerExtensionPoint<
commandsExtensionPoint.setHandler(extensions => {
function handleCommand(userFriendlyCommand: schema.IUserFriendlyCommand, extension: IExtensionPointUser<any>) {
function handleCommand(userFriendlyCommand: schema.IUserFriendlyCommand, extension: IExtensionPointUser<any>, bucket: ICommandAction[]) {
if (!schema.isValidCommand(userFriendlyCommand, extension.collector)) {
return;
@@ -405,29 +405,30 @@ commandsExtensionPoint.setHandler(extensions => {
if (MenuRegistry.getCommand(command)) {
extension.collector.info(localize('dup', "Command `{0}` appears multiple times in the `commands` section.", userFriendlyCommand.command));
}
const registration = MenuRegistry.addCommand({
bucket.push({
id: command,
title,
category,
precondition: ContextKeyExpr.deserialize(enablement),
icon: absoluteIcon
});
_commandRegistrations.add(registration);
}
// remove all previous command registrations
_commandRegistrations.clear();
const newCommands: ICommandAction[] = [];
for (const extension of extensions) {
const { value } = extension;
if (Array.isArray(value)) {
for (const command of value) {
handleCommand(command, extension);
handleCommand(command, extension, newCommands);
}
} else {
handleCommand(value, extension);
handleCommand(value, extension, newCommands);
}
}
_commandRegistrations.add(MenuRegistry.addCommands(newCommands));
});
const _menuRegistrations = new DisposableStore();
@@ -440,6 +441,8 @@ ExtensionsRegistry.registerExtensionPoint<{ [loc: string]: schema.IUserFriendlyM
// remove all previous menu registrations
_menuRegistrations.clear();
const items: { id: MenuId, item: IMenuItem }[] = [];
for (let extension of extensions) {
const { value, collector } = extension;
@@ -461,7 +464,7 @@ ExtensionsRegistry.registerExtensionPoint<{ [loc: string]: schema.IUserFriendlyM
for (let item of entry.value) {
let command = MenuRegistry.getCommand(item.command);
let alt = item.alt && MenuRegistry.getCommand(item.alt);
let alt = item.alt && MenuRegistry.getCommand(item.alt) || undefined;
if (!command) {
collector.error(localize('missing.command', "Menu item references a command `{0}` which is not defined in the 'commands' section.", item.command));
@@ -486,15 +489,19 @@ ExtensionsRegistry.registerExtensionPoint<{ [loc: string]: schema.IUserFriendlyM
}
}
const registration = MenuRegistry.appendMenuItem(menu, {
command,
alt,
group,
order,
when: ContextKeyExpr.deserialize(item.when)
} as IMenuItem);
_menuRegistrations.add(registration);
items.push({
id: menu,
item: {
command,
alt,
group,
order,
when: ContextKeyExpr.deserialize(item.when)
}
});
}
});
}
_menuRegistrations.add(MenuRegistry.appendMenuItems(items));
});