Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support multiple partial registrations to resolver #156672

Merged
merged 9 commits into from
Aug 2, 2022
6 changes: 6 additions & 0 deletions src/vs/base/common/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -275,3 +275,9 @@ export type UriDto<T> = { [K in keyof T]: T[K] extends URI
export function assertNever(value: never, message = 'Unreachable'): never {
throw new Error(message);
}

/**
* Given an object with all optional properties, requires at least one to be defined.
* i.e. AtLeastOne<MyObject>;
*/
export type AtLeastOne<T, U = { [K in keyof T]: Pick<T, K> }> = Partial<T> & U[keyof U];
2 changes: 1 addition & 1 deletion src/vs/workbench/browser/layout.ts
Original file line number Diff line number Diff line change
Expand Up @@ -578,7 +578,7 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi
input2: { resource: filesToMerge[1].resource },
base: { resource: filesToMerge[2].resource },
result: { resource: filesToMerge[3].resource },
options: { pinned: true, override: 'mergeEditor.Input' } // TODO@bpasero remove the override once the resolver is ready
options: { pinned: true }
}];
}

Expand Down
6 changes: 4 additions & 2 deletions src/vs/workbench/common/editor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -484,6 +484,8 @@ export interface IResourceDiffEditorInput extends IBaseUntypedEditorInput {
readonly modified: IResourceEditorInput | ITextResourceEditorInput | IUntitledTextResourceEditorInput;
}

export type IResourceMergeEditorInputSide = (IResourceEditorInput | ITextResourceEditorInput) & { detail?: string };

/**
* A resource merge editor input compares multiple editors
* highlighting the differences for merging.
Expand All @@ -496,12 +498,12 @@ export interface IResourceMergeEditorInput extends IBaseUntypedEditorInput {
/**
* The one changed version of the file.
*/
readonly input1: IResourceEditorInput | ITextResourceEditorInput;
readonly input1: IResourceMergeEditorInputSide;

/**
* The second changed version of the file.
*/
readonly input2: IResourceEditorInput | ITextResourceEditorInput;
readonly input2: IResourceMergeEditorInputSide;

/**
* The base common ancestor of the file to merge.
Expand Down
23 changes: 11 additions & 12 deletions src/vs/workbench/contrib/mergeEditor/browser/commands/commands.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,11 @@ import { localize } from 'vs/nls';
import { ILocalizedString } from 'vs/platform/action/common/action';
import { Action2, IAction2Options, MenuId } from 'vs/platform/actions/common/actions';
import { ICommandService } from 'vs/platform/commands/common/commands';
import { EditorResolution } from 'vs/platform/editor/common/editor';
import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation';
import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation';
import { IOpenerService } from 'vs/platform/opener/common/opener';
import { API_OPEN_DIFF_EDITOR_COMMAND_ID } from 'vs/workbench/browser/parts/editor/editorCommands';
import { MergeEditorInput, MergeEditorInputData } from 'vs/workbench/contrib/mergeEditor/browser/mergeEditorInput';
import { IResourceMergeEditorInput } from 'vs/workbench/common/editor';
import { MergeEditorInputData } from 'vs/workbench/contrib/mergeEditor/browser/mergeEditorInput';
import { MergeEditor } from 'vs/workbench/contrib/mergeEditor/browser/view/mergeEditor';
import { MergeEditorViewModel } from 'vs/workbench/contrib/mergeEditor/browser/view/viewModel';
import { ctxIsMergeEditor, ctxMergeEditorLayout } from 'vs/workbench/contrib/mergeEditor/common/mergeEditor';
Expand Down Expand Up @@ -48,15 +48,14 @@ export class OpenMergeEditor extends Action2 {
run(accessor: ServicesAccessor, ...args: unknown[]): void {
const validatedArgs = IRelaxedOpenArgs.validate(args[0]);

const instaService = accessor.get(IInstantiationService);
const input = instaService.createInstance(
MergeEditorInput,
validatedArgs.base,
validatedArgs.input1,
validatedArgs.input2,
validatedArgs.output,
);
accessor.get(IEditorService).openEditor(input, { preserveFocus: true, override: EditorResolution.DISABLED });
const input: IResourceMergeEditorInput = {
base: { resource: validatedArgs.base },
input1: { resource: validatedArgs.input1.uri, label: validatedArgs.input1.title, description: validatedArgs.input1.description, detail: validatedArgs.input1.detail },
input2: { resource: validatedArgs.input2.uri, label: validatedArgs.input2.title, description: validatedArgs.input2.description, detail: validatedArgs.input2.detail },
result: { resource: validatedArgs.output },
options: { preserveFocus: true }
};
accessor.get(IEditorService).openEditor(input);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,16 +10,15 @@ import { localize } from 'vs/nls';
import { Action2 } from 'vs/platform/actions/common/actions';
import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService';
import { InMemoryFileSystemProvider } from 'vs/platform/files/common/inMemoryFilesystemProvider';
import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation';
import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation';
import { INotificationService } from 'vs/platform/notification/common/notification';
import { IQuickInputService } from 'vs/platform/quickinput/common/quickInput';
import { MergeEditor } from 'vs/workbench/contrib/mergeEditor/browser/view/mergeEditor';
import { IEditorService } from 'vs/workbench/services/editor/common/editorService';
import { IWorkbenchFileService } from 'vs/workbench/services/files/common/files';
import { URI } from 'vs/base/common/uri';
import { MergeEditorInput } from 'vs/workbench/contrib/mergeEditor/browser/mergeEditorInput';
import { IResourceMergeEditorInput } from 'vs/workbench/common/editor';
import { ctxIsMergeEditor } from 'vs/workbench/contrib/mergeEditor/common/mergeEditor';
import { EditorResolution } from 'vs/platform/editor/common/editor';

interface MergeEditorContents {
languageId: string;
Expand Down Expand Up @@ -99,11 +98,10 @@ export class MergeEditorOpenContents extends Action2 {

async run(accessor: ServicesAccessor): Promise<void> {
const service = accessor.get(IWorkbenchFileService);
const instaService = accessor.get(IInstantiationService);
const editorService = accessor.get(IEditorService);
const inputService = accessor.get(IQuickInputService);
const clipboardService = accessor.get(IClipboardService);
const textModelService = accessor.get(ITextModelService);
const editorService = accessor.get(IEditorService);

const result = await inputService.input({
prompt: localize('mergeEditor.enterJSON', 'Enter JSON'),
Expand Down Expand Up @@ -154,13 +152,12 @@ export class MergeEditorOpenContents extends Action2 {
setLanguageId(resultUri, content.languageId),
]);

const input = instaService.createInstance(
MergeEditorInput,
baseUri,
{ uri: input1Uri, title: 'Input 1', description: 'Input 1', detail: '(from JSON)' },
{ uri: input2Uri, title: 'Input 2', description: 'Input 2', detail: '(from JSON)' },
resultUri,
);
editorService.openEditor(input, { override: EditorResolution.DISABLED });
const input: IResourceMergeEditorInput = {
base: { resource: baseUri },
input1: { resource: input1Uri, label: 'Input 1', description: 'Input 1', detail: '(from JSON)' },
input2: { resource: input2Uri, label: 'Input 2', description: 'Input 2', detail: '(from JSON)' },
result: { resource: resultUri },
};
editorService.openEditor(input);
}
}
10 changes: 7 additions & 3 deletions src/vs/workbench/contrib/mergeEditor/browser/mergeEditorInput.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import { ConfirmResult, IDialogService } from 'vs/platform/dialogs/common/dialog
import { IFileService } from 'vs/platform/files/common/files';
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
import { ILabelService } from 'vs/platform/label/common/label';
import { EditorInputCapabilities, IEditorIdentifier, IResourceMergeEditorInput, isResourceMergeEditorInput, IUntypedEditorInput } from 'vs/workbench/common/editor';
import { DEFAULT_EDITOR_ASSOCIATION, EditorInputCapabilities, IEditorIdentifier, IResourceMergeEditorInput, isResourceMergeEditorInput, IUntypedEditorInput } from 'vs/workbench/common/editor';
import { EditorInput, IEditorCloseHandler } from 'vs/workbench/common/editor/editorInput';
import { AbstractTextResourceEditorInput } from 'vs/workbench/common/editor/textResourceEditorInput';
import { EditorWorkerServiceDiffComputer } from 'vs/workbench/contrib/mergeEditor/browser/model/diffComputer';
Expand Down Expand Up @@ -84,6 +84,10 @@ export class MergeEditorInput extends AbstractTextResourceEditorInput implements
return MergeEditorInput.ID;
}

override get editorId(): string {
return DEFAULT_EDITOR_ASSOCIATION.id;
}

override get capabilities(): EditorInputCapabilities {
return super.capabilities | EditorInputCapabilities.MultipleEditors;
}
Expand Down Expand Up @@ -140,8 +144,8 @@ export class MergeEditorInput extends AbstractTextResourceEditorInput implements

override toUntyped(): IResourceMergeEditorInput {
return {
input1: { resource: this.input1.uri, label: this.input1.title, description: this.input1.description },
input2: { resource: this.input2.uri, label: this.input2.title, description: this.input2.description },
input1: { resource: this.input1.uri, label: this.input1.title, description: this.input1.description, detail: this.input1.detail },
input2: { resource: this.input2.uri, label: this.input2.title, description: this.input2.description, detail: this.input2.detail },
base: { resource: this.base },
result: { resource: this.result },
options: {
Expand Down
43 changes: 10 additions & 33 deletions src/vs/workbench/contrib/mergeEditor/browser/view/mergeEditor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ import { MergeEditorViewModel } from 'vs/workbench/contrib/mergeEditor/browser/v
import { ctxMergeBaseUri, ctxIsMergeEditor, ctxMergeEditorLayout, ctxMergeResultUri, MergeEditorLayoutTypes } from 'vs/workbench/contrib/mergeEditor/common/mergeEditor';
import { settingsSashBorder } from 'vs/workbench/contrib/preferences/common/settingsEditorColorRegistry';
import { IEditorGroup, IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService';
import { EditorInputFactoryFunction, IEditorResolverService, MergeEditorInputFactoryFunction, RegisteredEditorPriority } from 'vs/workbench/services/editor/common/editorResolverService';
import { IEditorResolverService, MergeEditorInputFactoryFunction, RegisteredEditorPriority } from 'vs/workbench/services/editor/common/editorResolverService';
import { IEditorService } from 'vs/workbench/services/editor/common/editorService';
import './colors';
import { InputCodeEditorView } from './editors/inputCodeEditorView';
Expand Down Expand Up @@ -559,44 +559,22 @@ export class MergeEditorResolverContribution extends Disposable {
) {
super();

const editorInputFactory: EditorInputFactoryFunction = (editor) => {
return {
editor: instantiationService.createInstance(
MergeEditorInput,
editor.resource,
{
uri: editor.resource,
title: '',
description: '',
detail: ''
},
{
uri: editor.resource,
title: '',
description: '',
detail: ''
},
editor.resource
)
};
};

const mergeEditorInputFactory: MergeEditorInputFactoryFunction = (mergeEditor: IResourceMergeEditorInput): EditorInputWithOptions => {
return {
editor: instantiationService.createInstance(
MergeEditorInput,
mergeEditor.base.resource,
{
uri: mergeEditor.input1.resource,
title: basename(mergeEditor.input1.resource),
description: '',
detail: ''
title: mergeEditor.input1.label ?? basename(mergeEditor.input1.resource),
description: mergeEditor.input1.description ?? '',
detail: mergeEditor.input1.detail
},
{
uri: mergeEditor.input2.resource,
title: basename(mergeEditor.input2.resource),
description: '',
detail: ''
title: mergeEditor.input2.label ?? basename(mergeEditor.input2.resource),
description: mergeEditor.input2.description ?? '',
detail: mergeEditor.input2.detail
},
mergeEditor.result.resource
)
Expand All @@ -606,14 +584,13 @@ export class MergeEditorResolverContribution extends Disposable {
this._register(editorResolverService.registerEditor(
`*`,
{
id: MergeEditorInput.ID,
label: localize('editor.mergeEditor.label', "Merge Editor"),
id: DEFAULT_EDITOR_ASSOCIATION.id,
label: DEFAULT_EDITOR_ASSOCIATION.displayName,
detail: DEFAULT_EDITOR_ASSOCIATION.providerDisplayName,
priority: RegisteredEditorPriority.option
priority: RegisteredEditorPriority.builtin
},
{},
{
createEditorInput: editorInputFactory,
createMergeEditorInput: mergeEditorInputFactory
}
));
Expand Down
16 changes: 6 additions & 10 deletions src/vs/workbench/contrib/userDataSync/browser/userDataSync.ts
Original file line number Diff line number Diff line change
Expand Up @@ -57,10 +57,8 @@ import { IUserDataInitializationService } from 'vs/workbench/services/userData/b
import { MarkdownString } from 'vs/base/common/htmlContent';
import { IHostService } from 'vs/workbench/services/host/browser/host';
import { IUserDataProfilesService } from 'vs/platform/userDataProfile/common/userDataProfile';
import { MergeEditorInput } from 'vs/workbench/contrib/mergeEditor/browser/mergeEditorInput';
import { ITextFileService } from 'vs/workbench/services/textfile/common/textfiles';
import { ctxIsMergeEditor, ctxMergeBaseUri } from 'vs/workbench/contrib/mergeEditor/common/mergeEditor';
import { EditorResolution } from 'vs/platform/editor/common/editor';

const CONTEXT_CONFLICTS_SOURCES = new RawContextKey<string>('conflictsSources', '');

Expand Down Expand Up @@ -730,14 +728,12 @@ export class UserDataSyncWorkbenchContribution extends Disposable implements IWo
for (const conflict of conflicts) {
const remoteResourceName = localize({ key: 'remoteResourceName', comment: ['remote as in file in cloud'] }, "{0} (Remote)", basename(conflict.remoteResource));
const localResourceName = localize('localResourceName', "{0} (Local)", basename(conflict.remoteResource));
const input = this.instantiationService.createInstance(
MergeEditorInput,
conflict.baseResource,
{ title: localize('Yours', 'Yours'), description: localResourceName, detail: undefined, uri: conflict.localResource },
{ title: localize('Theirs', 'Theirs'), description: remoteResourceName, detail: undefined, uri: conflict.remoteResource },
conflict.previewResource,
);
await this.editorService.openEditor(input, { override: EditorResolution.DISABLED });
await this.editorService.openEditor({
input1: { resource: conflict.remoteResource, label: localize('Theirs', 'Theirs'), description: remoteResourceName },
input2: { resource: conflict.localResource, label: localize('Yours', 'Yours'), description: localResourceName },
base: { resource: conflict.baseResource },
result: { resource: conflict.previewResource }
});
}
}

Expand Down
2 changes: 1 addition & 1 deletion src/vs/workbench/electron-sandbox/window.ts
Original file line number Diff line number Diff line change
Expand Up @@ -862,7 +862,7 @@ export class NativeWindow extends Disposable {
input2: { resource: resources[1].resource },
base: { resource: resources[2].resource },
result: { resource: resources[3].resource },
options: { pinned: true, override: 'mergeEditor.Input' } // TODO@bpasero remove the override once the resolver is ready
options: { pinned: true }
};
editors.push(mergeEditor);
} else if (diffMode && isResourceEditorInput(resources[0]) && isResourceEditorInput(resources[1])) {
Expand Down
Loading