提交 d86955c7 编写于 作者: J Johannes Rieken

move id into ICommand

上级 78e64e72
......@@ -143,9 +143,13 @@ let showReferencesCommand: ICommandHandler = (accessor: ServicesAccessor, resour
// register commands
CommandsRegistry.registerCommand('editor.action.findReferences', findReferencesCommand);
CommandsRegistry.registerCommand({
id: 'editor.action.findReferences',
handler: findReferencesCommand
});
CommandsRegistry.registerCommand('editor.action.showReferences', {
CommandsRegistry.registerCommand({
id: 'editor.action.showReferences',
handler: showReferencesCommand,
description: {
description: 'Show references at a position in a file',
......
......@@ -285,7 +285,8 @@ export class StandaloneCommandService implements ICommandService {
this._dynamicCommands = Object.create(null);
}
public addCommand(id: string, command: ICommand): IDisposable {
public addCommand(command: ICommand): IDisposable {
const { id } = command;
this._dynamicCommands[id] = command;
return {
dispose: () => {
......@@ -360,7 +361,8 @@ export class StandaloneKeybindingService extends AbstractKeybindingService {
let commandService = this._commandService;
if (commandService instanceof StandaloneCommandService) {
toDispose.push(commandService.addCommand(commandId, {
toDispose.push(commandService.addCommand({
id: commandId,
handler: handler
}));
} else {
......
......@@ -33,6 +33,7 @@ export interface ICommandHandler {
}
export interface ICommand {
id: string;
handler: ICommandHandler;
precondition?: ContextKeyExpr;
description?: ICommandHandlerDescription;
......@@ -46,7 +47,7 @@ export interface ICommandHandlerDescription {
export interface ICommandRegistry {
registerCommand(id: string, command: ICommandHandler): IDisposable;
registerCommand(id: string, command: ICommand): IDisposable;
registerCommand(command: ICommand): IDisposable;
getCommand(id: string): ICommand;
getCommands(): ICommandsMap;
}
......@@ -62,42 +63,41 @@ export const CommandsRegistry: ICommandRegistry = new class implements ICommandR
private _commands = new Map<string, ICommand | ICommand[]>();
registerCommand(id: string, commandOrDesc: ICommandHandler | ICommand): IDisposable {
registerCommand(idOrCommand: string | ICommand, handler?: ICommandHandler): IDisposable {
if (!commandOrDesc) {
if (!idOrCommand) {
throw new Error(`invalid command`);
}
let command: ICommand;
if (!isCommand(commandOrDesc)) {
// simple handler
command = { handler: commandOrDesc };
} else {
if (commandOrDesc.description) {
// add argument validation if rich command metadata is provided
const constraints: TypeConstraint[] = [];
for (let arg of commandOrDesc.description.args) {
constraints.push(arg.constraint);
}
const actualHandler = commandOrDesc.handler;
commandOrDesc.handler = function (accessor, ...args: any[]) {
validateConstraints(args, constraints);
return actualHandler(accessor, ...args);
};
if (typeof idOrCommand === 'string') {
if (!handler) {
throw new Error(`invalid command`);
}
return this.registerCommand({ id: idOrCommand, handler });
}
command = commandOrDesc;
// add argument validation if rich command metadata is provided
if (idOrCommand.description) {
const constraints: TypeConstraint[] = [];
for (let arg of idOrCommand.description.args) {
constraints.push(arg.constraint);
}
const actualHandler = idOrCommand.handler;
idOrCommand.handler = function (accessor, ...args: any[]) {
validateConstraints(args, constraints);
return actualHandler(accessor, ...args);
};
}
// find a place to store the command
const { id } = idOrCommand;
const commandOrArray = this._commands.get(id);
if (commandOrArray === void 0) {
this._commands.set(id, command);
this._commands.set(id, idOrCommand);
} else if (Array.isArray(commandOrArray)) {
commandOrArray.unshift(command);
commandOrArray.unshift(idOrCommand);
} else {
this._commands.set(id, [command, commandOrArray]);
this._commands.set(id, [idOrCommand, commandOrArray]);
}
return {
......@@ -106,7 +106,7 @@ export const CommandsRegistry: ICommandRegistry = new class implements ICommandR
if (Array.isArray(commandOrArray)) {
// remove from array, remove array
// if last element removed
const idx = commandOrArray.indexOf(command);
const idx = commandOrArray.indexOf(idOrCommand);
if (idx >= 0) {
commandOrArray.splice(idx, 1);
if (commandOrArray.length === 0) {
......
......@@ -117,7 +117,8 @@ suite('CommandService', function () {
);
let counter = 0;
let reg = CommandsRegistry.registerCommand('bar', {
let reg = CommandsRegistry.registerCommand({
id: 'bar',
handler: () => { counter += 1; },
precondition: ContextKeyExpr.has('foocontext')
});
......
......@@ -60,7 +60,8 @@ suite('Command Tests', function () {
assert.ok(typeof args === 'string');
});
CommandsRegistry.registerCommand('test3', {
CommandsRegistry.registerCommand({
id: 'test3',
handler: function (accessor, args) {
return true;
},
......@@ -81,7 +82,8 @@ suite('Command Tests', function () {
let r1 = CommandsRegistry.registerCommand('foo', () => { });
const precondition = new RawContextKey<boolean>('ddd', false);
let r2 = CommandsRegistry.registerCommand('bar', {
let r2 = CommandsRegistry.registerCommand({
id: 'bar',
handler: () => { },
precondition
});
......
......@@ -162,7 +162,7 @@ class KeybindingsRegistryImpl implements IKeybindingsRegistry {
public registerCommandAndKeybindingRule(desc: ICommandAndKeybindingRule): void {
this.registerKeybindingRule(desc);
CommandsRegistry.registerCommand(desc.id, desc);
CommandsRegistry.registerCommand({ id: desc.id, handler: desc.handler });
}
private static _mightProduceChar(keyCode: KeyCode): boolean {
......
......@@ -53,11 +53,11 @@ quickOpenRegistry.registerQuickOpenHandler(
const quickOpenNavigateNextInTerminalPickerId = 'workbench.action.quickOpenNavigateNextInTerminalPicker';
CommandsRegistry.registerCommand(
quickOpenNavigateNextInTerminalPickerId, { handler: getQuickNavigateHandler(quickOpenNavigateNextInTerminalPickerId, true) });
{ id: quickOpenNavigateNextInTerminalPickerId, handler: getQuickNavigateHandler(quickOpenNavigateNextInTerminalPickerId, true) });
const quickOpenNavigatePreviousInTerminalPickerId = 'workbench.action.quickOpenNavigatePreviousInTerminalPicker';
CommandsRegistry.registerCommand(
quickOpenNavigatePreviousInTerminalPickerId, { handler: getQuickNavigateHandler(quickOpenNavigatePreviousInTerminalPickerId, false) });
{ id: quickOpenNavigatePreviousInTerminalPickerId, handler: getQuickNavigateHandler(quickOpenNavigatePreviousInTerminalPickerId, false) });
const registry = <IWorkbenchActionRegistry>Registry.as(ActionExtensions.WorkbenchActions);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册