Path: blob/main/src/vs/workbench/contrib/mergeEditor/electron-browser/devCommands.ts
3296 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import { VSBuffer } from '../../../../base/common/buffer.js';6import { Codicon } from '../../../../base/common/codicons.js';7import { randomPath } from '../../../../base/common/extpath.js';8import { URI } from '../../../../base/common/uri.js';9import { ILanguageService } from '../../../../editor/common/languages/language.js';10import { localize, localize2 } from '../../../../nls.js';11import { ILocalizedString } from '../../../../platform/action/common/action.js';12import { Action2, IAction2Options } from '../../../../platform/actions/common/actions.js';13import { IClipboardService } from '../../../../platform/clipboard/common/clipboardService.js';14import { INativeEnvironmentService } from '../../../../platform/environment/common/environment.js';15import { IFileService } from '../../../../platform/files/common/files.js';16import { ServicesAccessor } from '../../../../platform/instantiation/common/instantiation.js';17import { IQuickInputService } from '../../../../platform/quickinput/common/quickInput.js';18import { IResourceMergeEditorInput } from '../../../common/editor.js';19import { MergeEditor } from '../browser/view/mergeEditor.js';20import { MergeEditorViewModel } from '../browser/view/viewModel.js';21import { MergeEditorContents } from '../common/mergeEditor.js';22import { IEditorService } from '../../../services/editor/common/editorService.js';2324const MERGE_EDITOR_CATEGORY: ILocalizedString = localize2('mergeEditor', 'Merge Editor (Dev)');2526export class MergeEditorOpenContentsFromJSON extends Action2 {27constructor() {28super({29id: 'merge.dev.openContentsJson',30category: MERGE_EDITOR_CATEGORY,31title: localize2('merge.dev.openState', "Open Merge Editor State from JSON"),32icon: Codicon.layoutCentered,33f1: true,34});35}3637async run(accessor: ServicesAccessor, args?: { data?: MergeEditorContents; resultState?: 'initial' | 'current' }): Promise<void> {38const quickInputService = accessor.get(IQuickInputService);39const clipboardService = accessor.get(IClipboardService);40const editorService = accessor.get(IEditorService);41const languageService = accessor.get(ILanguageService);42const env = accessor.get(INativeEnvironmentService);43const fileService = accessor.get(IFileService);4445if (!args) {46args = {};47}4849let content: MergeEditorContents;50if (!args.data) {51const result = await quickInputService.input({52prompt: localize('mergeEditor.enterJSON', 'Enter JSON'),53value: await clipboardService.readText(),54});55if (result === undefined) {56return;57}58content =59result !== ''60? JSON.parse(result)61: { base: '', input1: '', input2: '', result: '', languageId: 'plaintext' };62} else {63content = args.data;64}6566const targetDir = URI.joinPath(env.tmpDir, randomPath());6768const extension = languageService.getExtensions(content.languageId)[0] || '';6970const baseUri = URI.joinPath(targetDir, `/base${extension}`);71const input1Uri = URI.joinPath(targetDir, `/input1${extension}`);72const input2Uri = URI.joinPath(targetDir, `/input2${extension}`);73const resultUri = URI.joinPath(targetDir, `/result${extension}`);74const initialResultUri = URI.joinPath(targetDir, `/initialResult${extension}`);7576async function writeFile(uri: URI, content: string): Promise<void> {77await fileService.writeFile(uri, VSBuffer.fromString(content));78}7980const shouldOpenInitial = await promptOpenInitial(quickInputService, args.resultState);8182await Promise.all([83writeFile(baseUri, content.base),84writeFile(input1Uri, content.input1),85writeFile(input2Uri, content.input2),86writeFile(resultUri, shouldOpenInitial ? (content.initialResult || '') : content.result),87writeFile(initialResultUri, content.initialResult || ''),88]);8990const input: IResourceMergeEditorInput = {91base: { resource: baseUri },92input1: { resource: input1Uri, label: 'Input 1', description: 'Input 1', detail: '(from JSON)' },93input2: { resource: input2Uri, label: 'Input 2', description: 'Input 2', detail: '(from JSON)' },94result: { resource: resultUri },95};96editorService.openEditor(input);97}98}99100async function promptOpenInitial(quickInputService: IQuickInputService, resultStateOverride?: 'initial' | 'current') {101if (resultStateOverride) {102return resultStateOverride === 'initial';103}104const result = await quickInputService.pick([{ label: 'result', result: false }, { label: 'initial result', result: true }], { canPickMany: false });105return result?.result;106}107108abstract class MergeEditorAction extends Action2 {109constructor(desc: Readonly<IAction2Options>) {110super(desc);111}112113run(accessor: ServicesAccessor): void {114const { activeEditorPane } = accessor.get(IEditorService);115if (activeEditorPane instanceof MergeEditor) {116const vm = activeEditorPane.viewModel.get();117if (!vm) {118return;119}120this.runWithViewModel(vm, accessor);121}122}123124abstract runWithViewModel(viewModel: MergeEditorViewModel, accessor: ServicesAccessor): void;125}126127export class OpenSelectionInTemporaryMergeEditor extends MergeEditorAction {128constructor() {129super({130id: 'merge.dev.openSelectionInTemporaryMergeEditor',131category: MERGE_EDITOR_CATEGORY,132title: localize2('merge.dev.openSelectionInTemporaryMergeEditor', "Open Selection In Temporary Merge Editor"),133icon: Codicon.layoutCentered,134f1: true,135});136}137138override async runWithViewModel(viewModel: MergeEditorViewModel, accessor: ServicesAccessor) {139const rangesInBase = viewModel.selectionInBase.get()?.rangesInBase;140if (!rangesInBase || rangesInBase.length === 0) {141return;142}143144const base = rangesInBase145.map((r) =>146viewModel.model.base.getValueInRange(147r148)149)150.join('\n');151152const input1 = rangesInBase153.map((r) =>154viewModel.inputCodeEditorView1.editor.getModel()!.getValueInRange(155viewModel.model.translateBaseRangeToInput(1, r)156)157)158.join('\n');159160const input2 = rangesInBase161.map((r) =>162viewModel.inputCodeEditorView2.editor.getModel()!.getValueInRange(163viewModel.model.translateBaseRangeToInput(2, r)164)165)166.join('\n');167168const result = rangesInBase169.map((r) =>170viewModel.resultCodeEditorView.editor.getModel()!.getValueInRange(171viewModel.model.translateBaseRangeToResult(r)172)173)174.join('\n');175176new MergeEditorOpenContentsFromJSON().run(accessor, {177data: {178base,179input1,180input2,181result,182languageId: viewModel.resultCodeEditorView.editor.getModel()!.getLanguageId()183}184});185}186}187188189