mirror of
https://github.com/coder/code-server.git
synced 2026-05-09 13:57:26 +02:00
Merge commit 'be3e8236086165e5e45a5a10783823874b3f3ebd' as 'lib/vscode'
This commit is contained in:
87
lib/vscode/src/vs/editor/browser/services/bulkEditService.ts
Normal file
87
lib/vscode/src/vs/editor/browser/services/bulkEditService.ts
Normal file
@@ -0,0 +1,87 @@
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
import { ICodeEditor } from 'vs/editor/browser/editorBrowser';
|
||||
import { TextEdit, WorkspaceEdit, WorkspaceEditMetadata, WorkspaceFileEdit, WorkspaceFileEditOptions, WorkspaceTextEdit } from 'vs/editor/common/modes';
|
||||
import { createDecorator } from 'vs/platform/instantiation/common/instantiation';
|
||||
import { IProgress, IProgressStep } from 'vs/platform/progress/common/progress';
|
||||
import { IDisposable } from 'vs/base/common/lifecycle';
|
||||
import { URI } from 'vs/base/common/uri';
|
||||
import { isObject } from 'vs/base/common/types';
|
||||
|
||||
export const IBulkEditService = createDecorator<IBulkEditService>('IWorkspaceEditService');
|
||||
|
||||
function isWorkspaceFileEdit(thing: any): thing is WorkspaceFileEdit {
|
||||
return isObject(thing) && (Boolean((<WorkspaceFileEdit>thing).newUri) || Boolean((<WorkspaceFileEdit>thing).oldUri));
|
||||
}
|
||||
|
||||
function isWorkspaceTextEdit(thing: any): thing is WorkspaceTextEdit {
|
||||
return isObject(thing) && URI.isUri((<WorkspaceTextEdit>thing).resource) && isObject((<WorkspaceTextEdit>thing).edit);
|
||||
}
|
||||
|
||||
export class ResourceEdit {
|
||||
|
||||
protected constructor(readonly metadata?: WorkspaceEditMetadata) { }
|
||||
|
||||
static convert(edit: WorkspaceEdit): ResourceEdit[] {
|
||||
|
||||
|
||||
return edit.edits.map(edit => {
|
||||
if (isWorkspaceTextEdit(edit)) {
|
||||
return new ResourceTextEdit(edit.resource, edit.edit, edit.modelVersionId, edit.metadata);
|
||||
}
|
||||
if (isWorkspaceFileEdit(edit)) {
|
||||
return new ResourceFileEdit(edit.oldUri, edit.newUri, edit.options, edit.metadata);
|
||||
}
|
||||
throw new Error('Unsupported edit');
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
export class ResourceTextEdit extends ResourceEdit {
|
||||
constructor(
|
||||
readonly resource: URI,
|
||||
readonly textEdit: TextEdit,
|
||||
readonly versionId?: number,
|
||||
readonly metadata?: WorkspaceEditMetadata
|
||||
) {
|
||||
super(metadata);
|
||||
}
|
||||
}
|
||||
|
||||
export class ResourceFileEdit extends ResourceEdit {
|
||||
constructor(
|
||||
readonly oldResource: URI | undefined,
|
||||
readonly newResource: URI | undefined,
|
||||
readonly options?: WorkspaceFileEditOptions,
|
||||
readonly metadata?: WorkspaceEditMetadata
|
||||
) {
|
||||
super(metadata);
|
||||
}
|
||||
}
|
||||
|
||||
export interface IBulkEditOptions {
|
||||
editor?: ICodeEditor;
|
||||
progress?: IProgress<IProgressStep>;
|
||||
showPreview?: boolean;
|
||||
label?: string;
|
||||
quotableLabel?: string;
|
||||
}
|
||||
|
||||
export interface IBulkEditResult {
|
||||
ariaSummary: string;
|
||||
}
|
||||
|
||||
export type IBulkEditPreviewHandler = (edits: ResourceEdit[], options?: IBulkEditOptions) => Promise<ResourceEdit[]>;
|
||||
|
||||
export interface IBulkEditService {
|
||||
readonly _serviceBrand: undefined;
|
||||
|
||||
hasPreviewHandler(): boolean;
|
||||
|
||||
setPreviewHandler(handler: IBulkEditPreviewHandler): IDisposable;
|
||||
|
||||
apply(edit: ResourceEdit[], options?: IBulkEditOptions): Promise<IBulkEditResult>;
|
||||
}
|
||||
Reference in New Issue
Block a user