Path: blob/main/src/vs/workbench/api/browser/mainThreadBulkEdits.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, decodeBase64 } from '../../../base/common/buffer.js';6import { revive } from '../../../base/common/marshalling.js';7import { IBulkEditService, ResourceFileEdit, ResourceTextEdit } from '../../../editor/browser/services/bulkEditService.js';8import { WorkspaceEdit } from '../../../editor/common/languages.js';9import { ILogService } from '../../../platform/log/common/log.js';10import { IUriIdentityService } from '../../../platform/uriIdentity/common/uriIdentity.js';11import { IWorkspaceCellEditDto, IWorkspaceEditDto, IWorkspaceFileEditDto, MainContext, MainThreadBulkEditsShape } from '../common/extHost.protocol.js';12import { ResourceNotebookCellEdit } from '../../contrib/bulkEdit/browser/bulkCellEdits.js';13import { CellEditType } from '../../contrib/notebook/common/notebookCommon.js';14import { IExtHostContext, extHostNamedCustomer } from '../../services/extensions/common/extHostCustomers.js';15import { SerializableObjectWithBuffers } from '../../services/extensions/common/proxyIdentifier.js';161718@extHostNamedCustomer(MainContext.MainThreadBulkEdits)19export class MainThreadBulkEdits implements MainThreadBulkEditsShape {2021constructor(22_extHostContext: IExtHostContext,23@IBulkEditService private readonly _bulkEditService: IBulkEditService,24@ILogService private readonly _logService: ILogService,25@IUriIdentityService private readonly _uriIdentService: IUriIdentityService26) { }2728dispose(): void { }2930$tryApplyWorkspaceEdit(dto: SerializableObjectWithBuffers<IWorkspaceEditDto>, undoRedoGroupId?: number, isRefactoring?: boolean): Promise<boolean> {31const edits = reviveWorkspaceEditDto(dto.value, this._uriIdentService);32return this._bulkEditService.apply(edits, { undoRedoGroupId, respectAutoSaveConfig: isRefactoring }).then((res) => res.isApplied, err => {33this._logService.warn(`IGNORING workspace edit: ${err}`);34return false;35});36}37}3839export function reviveWorkspaceEditDto(data: IWorkspaceEditDto, uriIdentityService: IUriIdentityService, resolveDataTransferFile?: (id: string) => Promise<VSBuffer>): WorkspaceEdit;40export function reviveWorkspaceEditDto(data: IWorkspaceEditDto | undefined, uriIdentityService: IUriIdentityService, resolveDataTransferFile?: (id: string) => Promise<VSBuffer>): WorkspaceEdit | undefined;41export function reviveWorkspaceEditDto(data: IWorkspaceEditDto | undefined, uriIdentityService: IUriIdentityService, resolveDataTransferFile?: (id: string) => Promise<VSBuffer>): WorkspaceEdit | undefined {42if (!data || !data.edits) {43return <WorkspaceEdit>data;44}45const result = revive<WorkspaceEdit>(data);46for (const edit of result.edits) {47if (ResourceTextEdit.is(edit)) {48edit.resource = uriIdentityService.asCanonicalUri(edit.resource);49}50if (ResourceFileEdit.is(edit)) {51if (edit.options) {52const inContents = (edit as IWorkspaceFileEditDto).options?.contents;53if (inContents) {54if (inContents.type === 'base64') {55edit.options.contents = Promise.resolve(decodeBase64(inContents.value));56} else {57if (resolveDataTransferFile) {58edit.options.contents = resolveDataTransferFile(inContents.id);59} else {60throw new Error('Could not revive data transfer file');61}62}63}64}65edit.newResource = edit.newResource && uriIdentityService.asCanonicalUri(edit.newResource);66edit.oldResource = edit.oldResource && uriIdentityService.asCanonicalUri(edit.oldResource);67}68if (ResourceNotebookCellEdit.is(edit)) {69edit.resource = uriIdentityService.asCanonicalUri(edit.resource);70const cellEdit = (edit as IWorkspaceCellEditDto).cellEdit;71if (cellEdit.editType === CellEditType.Replace) {72edit.cellEdit = {73...cellEdit,74cells: cellEdit.cells.map(cell => ({75...cell,76outputs: cell.outputs.map(output => ({77...output,78outputs: output.items.map(item => {79return {80mime: item.mime,81data: item.valueBytes82};83})84}))85}))86};87}88}89}90return <WorkspaceEdit>data;91}929394