diff --git a/src/vs/editor/browser/services/bulkEditService.ts b/src/vs/editor/browser/services/bulkEditService.ts index 1fa168aedb1..56500981829 100644 --- a/src/vs/editor/browser/services/bulkEditService.ts +++ b/src/vs/editor/browser/services/bulkEditService.ts @@ -76,6 +76,7 @@ export interface IBulkEditOptions { undoRedoGroupId?: number; confirmBeforeUndo?: boolean; respectAutoSaveConfig?: boolean; + minResourcesToAutosave?: number; } export interface IBulkEditResult { diff --git a/src/vs/workbench/api/browser/mainThreadBulkEdits.ts b/src/vs/workbench/api/browser/mainThreadBulkEdits.ts index e3e5d652a16..7fa845c5976 100644 --- a/src/vs/workbench/api/browser/mainThreadBulkEdits.ts +++ b/src/vs/workbench/api/browser/mainThreadBulkEdits.ts @@ -40,9 +40,9 @@ export class MainThreadBulkEdits implements MainThreadBulkEditsShape { dispose(): void { } - $tryApplyWorkspaceEdit(dto: IWorkspaceEditDto, undoRedoGroupId?: number): Promise { + $tryApplyWorkspaceEdit(dto: IWorkspaceEditDto, undoRedoGroupId?: number, respectAutoSaveConfig?: boolean): Promise { const edits = reviveWorkspaceEditDto2(dto); - return this._bulkEditService.apply(edits, { undoRedoGroupId }).then(() => true, err => { + return this._bulkEditService.apply(edits, { undoRedoGroupId, respectAutoSaveConfig, minResourcesToAutosave: 0 }).then(() => true, err => { this._logService.warn('IGNORING workspace edit', err); return false; }); diff --git a/src/vs/workbench/api/common/extHost.api.impl.ts b/src/vs/workbench/api/common/extHost.api.impl.ts index cd38535f5f6..90b671a89b7 100644 --- a/src/vs/workbench/api/common/extHost.api.impl.ts +++ b/src/vs/workbench/api/common/extHost.api.impl.ts @@ -860,8 +860,8 @@ export function createApiFactoryAndRegisterActors(accessor: ServicesAccessor): I saveAll: (includeUntitled?) => { return extHostWorkspace.saveAll(includeUntitled); }, - applyEdit(edit: vscode.WorkspaceEdit): Thenable { - return extHostBulkEdits.applyWorkspaceEdit(edit, extension); + applyEdit(edit: vscode.WorkspaceEdit, respectAutoSaveConfig?: boolean): Thenable { + return extHostBulkEdits.applyWorkspaceEdit(edit, extension, respectAutoSaveConfig); }, createFileSystemWatcher: (pattern, ignoreCreate, ignoreChange, ignoreDelete): vscode.FileSystemWatcher => { return extHostFileSystemEvent.createFileSystemWatcher(extHostWorkspace, extension, pattern, ignoreCreate, ignoreChange, ignoreDelete); diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index a7b203695df..eaab02f42f0 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -239,7 +239,7 @@ export interface ITextDocumentShowOptions { } export interface MainThreadBulkEditsShape extends IDisposable { - $tryApplyWorkspaceEdit(workspaceEditDto: IWorkspaceEditDto, undoRedoGroupId?: number): Promise; + $tryApplyWorkspaceEdit(workspaceEditDto: IWorkspaceEditDto, undoRedoGroupId?: number, respectAutoSaveConfig?: boolean): Promise; } export interface MainThreadTextEditorsShape extends IDisposable { diff --git a/src/vs/workbench/api/common/extHostBulkEdits.ts b/src/vs/workbench/api/common/extHostBulkEdits.ts index 2126d41724e..71df755c6e8 100644 --- a/src/vs/workbench/api/common/extHostBulkEdits.ts +++ b/src/vs/workbench/api/common/extHostBulkEdits.ts @@ -28,9 +28,9 @@ export class ExtHostBulkEdits { }; } - applyWorkspaceEdit(edit: vscode.WorkspaceEdit, extension: IExtensionDescription): Promise { + applyWorkspaceEdit(edit: vscode.WorkspaceEdit, extension: IExtensionDescription, respectAutoSaveConfig?: boolean): Promise { const allowSnippetTextEdit = isProposedApiEnabled(extension, 'snippetWorkspaceEdit'); const dto = WorkspaceEdit.from(edit, this._versionInformationProvider, allowSnippetTextEdit); - return this._proxy.$tryApplyWorkspaceEdit(dto); + return this._proxy.$tryApplyWorkspaceEdit(dto, undefined, respectAutoSaveConfig); } } diff --git a/src/vs/workbench/contrib/bulkEdit/browser/bulkEditService.ts b/src/vs/workbench/contrib/bulkEdit/browser/bulkEditService.ts index e4dd996202c..31a7be4c15d 100644 --- a/src/vs/workbench/contrib/bulkEdit/browser/bulkEditService.ts +++ b/src/vs/workbench/contrib/bulkEdit/browser/bulkEditService.ts @@ -227,7 +227,7 @@ export class BulkEditService implements IBulkEditService { // when enabled (option AND setting) loop over all dirty working copies and trigger save // for those that were involved in this bulk edit operation. - if (options?.respectAutoSaveConfig && this._configService.getValue(autoSaveSetting) === true && resources.length > 1) { + if (options?.respectAutoSaveConfig && this._configService.getValue(autoSaveSetting) === true && resources.length > (options?.minResourcesToAutosave ?? 1)) { await this._saveAll(resources); } diff --git a/src/vs/workbench/services/extensions/common/extensionsApiProposals.ts b/src/vs/workbench/services/extensions/common/extensionsApiProposals.ts index f735af27335..a389ad13708 100644 --- a/src/vs/workbench/services/extensions/common/extensionsApiProposals.ts +++ b/src/vs/workbench/services/extensions/common/extensionsApiProposals.ts @@ -6,6 +6,7 @@ // THIS IS A GENERATED FILE. DO NOT EDIT DIRECTLY. export const allApiProposals = Object.freeze({ + applyEditAutoSave: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.applyEditAutoSave.d.ts', authSession: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.authSession.d.ts', badges: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.badges.d.ts', commentsResolvedState: 'https://raw.githubusercontent.com/microsoft/vscode/main/src/vscode-dts/vscode.proposed.commentsResolvedState.d.ts', diff --git a/src/vscode-dts/vscode.proposed.applyEditAutoSave.d.ts b/src/vscode-dts/vscode.proposed.applyEditAutoSave.d.ts new file mode 100644 index 00000000000..6218157338d --- /dev/null +++ b/src/vscode-dts/vscode.proposed.applyEditAutoSave.d.ts @@ -0,0 +1,31 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +declare module 'vscode' { + + // https://github.com/microsoft/vscode/issues/112109 + + export namespace workspace { + + /** + * Make changes to one or many resources or create, delete, and rename resources as defined by the given + * {@link WorkspaceEdit workspace edit}. + * + * All changes of a workspace edit are applied in the same order in which they have been added. If + * multiple textual inserts are made at the same position, these strings appear in the resulting text + * in the order the 'inserts' were made, unless that are interleaved with resource edits. Invalid sequences + * like 'delete file a' -> 'insert text in file a' cause failure of the operation. + * + * When applying a workspace edit that consists only of text edits an 'all-or-nothing'-strategy is used. + * A workspace edit with resource creations or deletions aborts the operation, e.g. consecutive edits will + * not be attempted, when a single edit fails. + * + * @param edit A workspace edit. + * @param respectAutoSaveConfig Automatically save changes based on the `files.refactoring.autoSave` config. + * @return A thenable that resolves when the edit could be applied. + */ + export function applyEdit(edit: WorkspaceEdit, respectAutoSaveConfig?: boolean): Thenable; + } +}