🎨 unhook scm from marshalling

This commit is contained in:
Joao Moreno
2017-03-30 10:27:14 +02:00
parent bc9a7bb1f9
commit ae46d50241
3 changed files with 25 additions and 20 deletions

View File

@@ -23,11 +23,16 @@ interface CommandHandler {
description: ICommandHandlerDescription;
}
export interface ArgumentProcessor {
processArgument(arg: any): any;
}
export class ExtHostCommands extends ExtHostCommandsShape {
private _commands = new Map<string, CommandHandler>();
private _proxy: MainThreadCommandsShape;
private _converter: CommandsConverter;
private _argumentProcessors: ArgumentProcessor[] = [];
constructor(
threadService: IThreadService,
@@ -42,6 +47,10 @@ export class ExtHostCommands extends ExtHostCommandsShape {
return this._converter;
}
registerArgumentProcessor(processor: ArgumentProcessor): void {
this._argumentProcessors.push(processor);
}
registerCommand(id: string, callback: <T>(...args: any[]) => T | Thenable<T>, thisArg?: any, description?: ICommandHandlerDescription): extHostTypes.Disposable {
if (!id.trim().length) {
@@ -110,6 +119,8 @@ export class ExtHostCommands extends ExtHostCommandsShape {
}
}
args = args.map(arg => this._argumentProcessors.reduce((r, p) => p.processArgument(r), arg));
try {
let result = callback.apply(thisArg, args);
return TPromise.as(result);

View File

@@ -12,7 +12,6 @@ import { IThreadService } from 'vs/workbench/services/thread/common/threadServic
import { ExtHostCommands, CommandsConverter } from 'vs/workbench/api/node/extHostCommands';
import { MainContext, MainThreadSCMShape, SCMRawResource } from './extHost.protocol';
import * as vscode from 'vscode';
import * as marshalling from 'vs/base/common/marshalling';
function getIconPath(decorations: vscode.SourceControlResourceThemableDecorations) {
if (!decorations) {
@@ -241,16 +240,21 @@ export class ExtHostSCM {
this._proxy = threadService.get(MainContext.MainThreadSCM);
this._inputBox = new ExtHostSCMInputBox(this._proxy);
// TODO@joao HACK
marshalling.ResolverRegistry[3] = value => {
const sourceControl = this._sourceControls.get(value.sourceControlHandle);
_commands.registerArgumentProcessor({
processArgument: arg => {
if (arg && arg.$mid === 3) {
const sourceControl = this._sourceControls.get(arg.sourceControlHandle);
if (!sourceControl) {
return value;
if (!sourceControl) {
return arg;
}
return sourceControl.getResourceState(arg.groupHandle, arg.handle);
}
return arg;
}
return sourceControl.getResourceState(value.groupHandle, value.handle);
};
});
}
createSourceControl(id: string, label: string): vscode.SourceControl {