Path: blob/main/src/vs/editor/browser/services/bulkEditService.ts
3294 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 { ICodeEditor } from '../editorBrowser.js';6import { TextEdit, WorkspaceEdit, WorkspaceEditMetadata, IWorkspaceFileEdit, WorkspaceFileEditOptions, IWorkspaceTextEdit } from '../../common/languages.js';7import { createDecorator } from '../../../platform/instantiation/common/instantiation.js';8import { IProgress, IProgressStep } from '../../../platform/progress/common/progress.js';9import { IDisposable } from '../../../base/common/lifecycle.js';10import { URI } from '../../../base/common/uri.js';11import { isObject } from '../../../base/common/types.js';12import { UndoRedoSource } from '../../../platform/undoRedo/common/undoRedo.js';13import { CancellationToken } from '../../../base/common/cancellation.js';14import { TextModelEditSource } from '../../common/textModelEditSource.js';1516export const IBulkEditService = createDecorator<IBulkEditService>('IWorkspaceEditService');1718export class ResourceEdit {1920protected constructor(readonly metadata?: WorkspaceEditMetadata) { }2122static convert(edit: WorkspaceEdit): ResourceEdit[] {2324return edit.edits.map(edit => {25if (ResourceTextEdit.is(edit)) {26return ResourceTextEdit.lift(edit);27}2829if (ResourceFileEdit.is(edit)) {30return ResourceFileEdit.lift(edit);31}32throw new Error('Unsupported edit');33});34}35}3637export class ResourceTextEdit extends ResourceEdit implements IWorkspaceTextEdit {3839static is(candidate: any): candidate is IWorkspaceTextEdit {40if (candidate instanceof ResourceTextEdit) {41return true;42}43return isObject(candidate)44&& URI.isUri((<IWorkspaceTextEdit>candidate).resource)45&& isObject((<IWorkspaceTextEdit>candidate).textEdit);46}4748static lift(edit: IWorkspaceTextEdit): ResourceTextEdit {49if (edit instanceof ResourceTextEdit) {50return edit;51} else {52return new ResourceTextEdit(edit.resource, edit.textEdit, edit.versionId, edit.metadata);53}54}5556constructor(57readonly resource: URI,58readonly textEdit: TextEdit & { insertAsSnippet?: boolean; keepWhitespace?: boolean },59readonly versionId: number | undefined = undefined,60metadata?: WorkspaceEditMetadata,61) {62super(metadata);63}64}6566export class ResourceFileEdit extends ResourceEdit implements IWorkspaceFileEdit {6768static is(candidate: any): candidate is IWorkspaceFileEdit {69if (candidate instanceof ResourceFileEdit) {70return true;71} else {72return isObject(candidate)73&& (Boolean((<IWorkspaceFileEdit>candidate).newResource) || Boolean((<IWorkspaceFileEdit>candidate).oldResource));74}75}7677static lift(edit: IWorkspaceFileEdit): ResourceFileEdit {78if (edit instanceof ResourceFileEdit) {79return edit;80} else {81return new ResourceFileEdit(edit.oldResource, edit.newResource, edit.options, edit.metadata);82}83}8485constructor(86readonly oldResource: URI | undefined,87readonly newResource: URI | undefined,88readonly options: WorkspaceFileEditOptions = {},89metadata?: WorkspaceEditMetadata90) {91super(metadata);92}93}9495export interface IBulkEditOptions {96editor?: ICodeEditor;97progress?: IProgress<IProgressStep>;98token?: CancellationToken;99showPreview?: boolean;100label?: string;101code?: string;102quotableLabel?: string;103undoRedoSource?: UndoRedoSource;104undoRedoGroupId?: number;105confirmBeforeUndo?: boolean;106respectAutoSaveConfig?: boolean;107reason?: TextModelEditSource;108}109110export interface IBulkEditResult {111ariaSummary: string;112isApplied: boolean;113}114115export type IBulkEditPreviewHandler = (edits: ResourceEdit[], options?: IBulkEditOptions) => Promise<ResourceEdit[]>;116117export interface IBulkEditService {118readonly _serviceBrand: undefined;119120hasPreviewHandler(): boolean;121122setPreviewHandler(handler: IBulkEditPreviewHandler): IDisposable;123124apply(edit: ResourceEdit[] | WorkspaceEdit, options?: IBulkEditOptions): Promise<IBulkEditResult>;125}126127128