Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/workbench/api/browser/mainThreadBulkEdits.ts
3296 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import { VSBuffer, decodeBase64 } from '../../../base/common/buffer.js';
7
import { revive } from '../../../base/common/marshalling.js';
8
import { IBulkEditService, ResourceFileEdit, ResourceTextEdit } from '../../../editor/browser/services/bulkEditService.js';
9
import { WorkspaceEdit } from '../../../editor/common/languages.js';
10
import { ILogService } from '../../../platform/log/common/log.js';
11
import { IUriIdentityService } from '../../../platform/uriIdentity/common/uriIdentity.js';
12
import { IWorkspaceCellEditDto, IWorkspaceEditDto, IWorkspaceFileEditDto, MainContext, MainThreadBulkEditsShape } from '../common/extHost.protocol.js';
13
import { ResourceNotebookCellEdit } from '../../contrib/bulkEdit/browser/bulkCellEdits.js';
14
import { CellEditType } from '../../contrib/notebook/common/notebookCommon.js';
15
import { IExtHostContext, extHostNamedCustomer } from '../../services/extensions/common/extHostCustomers.js';
16
import { SerializableObjectWithBuffers } from '../../services/extensions/common/proxyIdentifier.js';
17
18
19
@extHostNamedCustomer(MainContext.MainThreadBulkEdits)
20
export class MainThreadBulkEdits implements MainThreadBulkEditsShape {
21
22
constructor(
23
_extHostContext: IExtHostContext,
24
@IBulkEditService private readonly _bulkEditService: IBulkEditService,
25
@ILogService private readonly _logService: ILogService,
26
@IUriIdentityService private readonly _uriIdentService: IUriIdentityService
27
) { }
28
29
dispose(): void { }
30
31
$tryApplyWorkspaceEdit(dto: SerializableObjectWithBuffers<IWorkspaceEditDto>, undoRedoGroupId?: number, isRefactoring?: boolean): Promise<boolean> {
32
const edits = reviveWorkspaceEditDto(dto.value, this._uriIdentService);
33
return this._bulkEditService.apply(edits, { undoRedoGroupId, respectAutoSaveConfig: isRefactoring }).then((res) => res.isApplied, err => {
34
this._logService.warn(`IGNORING workspace edit: ${err}`);
35
return false;
36
});
37
}
38
}
39
40
export function reviveWorkspaceEditDto(data: IWorkspaceEditDto, uriIdentityService: IUriIdentityService, resolveDataTransferFile?: (id: string) => Promise<VSBuffer>): WorkspaceEdit;
41
export function reviveWorkspaceEditDto(data: IWorkspaceEditDto | undefined, uriIdentityService: IUriIdentityService, resolveDataTransferFile?: (id: string) => Promise<VSBuffer>): WorkspaceEdit | undefined;
42
export function reviveWorkspaceEditDto(data: IWorkspaceEditDto | undefined, uriIdentityService: IUriIdentityService, resolveDataTransferFile?: (id: string) => Promise<VSBuffer>): WorkspaceEdit | undefined {
43
if (!data || !data.edits) {
44
return <WorkspaceEdit>data;
45
}
46
const result = revive<WorkspaceEdit>(data);
47
for (const edit of result.edits) {
48
if (ResourceTextEdit.is(edit)) {
49
edit.resource = uriIdentityService.asCanonicalUri(edit.resource);
50
}
51
if (ResourceFileEdit.is(edit)) {
52
if (edit.options) {
53
const inContents = (edit as IWorkspaceFileEditDto).options?.contents;
54
if (inContents) {
55
if (inContents.type === 'base64') {
56
edit.options.contents = Promise.resolve(decodeBase64(inContents.value));
57
} else {
58
if (resolveDataTransferFile) {
59
edit.options.contents = resolveDataTransferFile(inContents.id);
60
} else {
61
throw new Error('Could not revive data transfer file');
62
}
63
}
64
}
65
}
66
edit.newResource = edit.newResource && uriIdentityService.asCanonicalUri(edit.newResource);
67
edit.oldResource = edit.oldResource && uriIdentityService.asCanonicalUri(edit.oldResource);
68
}
69
if (ResourceNotebookCellEdit.is(edit)) {
70
edit.resource = uriIdentityService.asCanonicalUri(edit.resource);
71
const cellEdit = (edit as IWorkspaceCellEditDto).cellEdit;
72
if (cellEdit.editType === CellEditType.Replace) {
73
edit.cellEdit = {
74
...cellEdit,
75
cells: cellEdit.cells.map(cell => ({
76
...cell,
77
outputs: cell.outputs.map(output => ({
78
...output,
79
outputs: output.items.map(item => {
80
return {
81
mime: item.mime,
82
data: item.valueBytes
83
};
84
})
85
}))
86
}))
87
};
88
}
89
}
90
}
91
return <WorkspaceEdit>data;
92
}
93
94