Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/editor/browser/services/bulkEditService.ts
3294 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 { ICodeEditor } from '../editorBrowser.js';
7
import { TextEdit, WorkspaceEdit, WorkspaceEditMetadata, IWorkspaceFileEdit, WorkspaceFileEditOptions, IWorkspaceTextEdit } from '../../common/languages.js';
8
import { createDecorator } from '../../../platform/instantiation/common/instantiation.js';
9
import { IProgress, IProgressStep } from '../../../platform/progress/common/progress.js';
10
import { IDisposable } from '../../../base/common/lifecycle.js';
11
import { URI } from '../../../base/common/uri.js';
12
import { isObject } from '../../../base/common/types.js';
13
import { UndoRedoSource } from '../../../platform/undoRedo/common/undoRedo.js';
14
import { CancellationToken } from '../../../base/common/cancellation.js';
15
import { TextModelEditSource } from '../../common/textModelEditSource.js';
16
17
export const IBulkEditService = createDecorator<IBulkEditService>('IWorkspaceEditService');
18
19
export class ResourceEdit {
20
21
protected constructor(readonly metadata?: WorkspaceEditMetadata) { }
22
23
static convert(edit: WorkspaceEdit): ResourceEdit[] {
24
25
return edit.edits.map(edit => {
26
if (ResourceTextEdit.is(edit)) {
27
return ResourceTextEdit.lift(edit);
28
}
29
30
if (ResourceFileEdit.is(edit)) {
31
return ResourceFileEdit.lift(edit);
32
}
33
throw new Error('Unsupported edit');
34
});
35
}
36
}
37
38
export class ResourceTextEdit extends ResourceEdit implements IWorkspaceTextEdit {
39
40
static is(candidate: any): candidate is IWorkspaceTextEdit {
41
if (candidate instanceof ResourceTextEdit) {
42
return true;
43
}
44
return isObject(candidate)
45
&& URI.isUri((<IWorkspaceTextEdit>candidate).resource)
46
&& isObject((<IWorkspaceTextEdit>candidate).textEdit);
47
}
48
49
static lift(edit: IWorkspaceTextEdit): ResourceTextEdit {
50
if (edit instanceof ResourceTextEdit) {
51
return edit;
52
} else {
53
return new ResourceTextEdit(edit.resource, edit.textEdit, edit.versionId, edit.metadata);
54
}
55
}
56
57
constructor(
58
readonly resource: URI,
59
readonly textEdit: TextEdit & { insertAsSnippet?: boolean; keepWhitespace?: boolean },
60
readonly versionId: number | undefined = undefined,
61
metadata?: WorkspaceEditMetadata,
62
) {
63
super(metadata);
64
}
65
}
66
67
export class ResourceFileEdit extends ResourceEdit implements IWorkspaceFileEdit {
68
69
static is(candidate: any): candidate is IWorkspaceFileEdit {
70
if (candidate instanceof ResourceFileEdit) {
71
return true;
72
} else {
73
return isObject(candidate)
74
&& (Boolean((<IWorkspaceFileEdit>candidate).newResource) || Boolean((<IWorkspaceFileEdit>candidate).oldResource));
75
}
76
}
77
78
static lift(edit: IWorkspaceFileEdit): ResourceFileEdit {
79
if (edit instanceof ResourceFileEdit) {
80
return edit;
81
} else {
82
return new ResourceFileEdit(edit.oldResource, edit.newResource, edit.options, edit.metadata);
83
}
84
}
85
86
constructor(
87
readonly oldResource: URI | undefined,
88
readonly newResource: URI | undefined,
89
readonly options: WorkspaceFileEditOptions = {},
90
metadata?: WorkspaceEditMetadata
91
) {
92
super(metadata);
93
}
94
}
95
96
export interface IBulkEditOptions {
97
editor?: ICodeEditor;
98
progress?: IProgress<IProgressStep>;
99
token?: CancellationToken;
100
showPreview?: boolean;
101
label?: string;
102
code?: string;
103
quotableLabel?: string;
104
undoRedoSource?: UndoRedoSource;
105
undoRedoGroupId?: number;
106
confirmBeforeUndo?: boolean;
107
respectAutoSaveConfig?: boolean;
108
reason?: TextModelEditSource;
109
}
110
111
export interface IBulkEditResult {
112
ariaSummary: string;
113
isApplied: boolean;
114
}
115
116
export type IBulkEditPreviewHandler = (edits: ResourceEdit[], options?: IBulkEditOptions) => Promise<ResourceEdit[]>;
117
118
export interface IBulkEditService {
119
readonly _serviceBrand: undefined;
120
121
hasPreviewHandler(): boolean;
122
123
setPreviewHandler(handler: IBulkEditPreviewHandler): IDisposable;
124
125
apply(edit: ResourceEdit[] | WorkspaceEdit, options?: IBulkEditOptions): Promise<IBulkEditResult>;
126
}
127
128