Skip to content

Commit 6536592

Browse files
committed
allow workspace edit in all will-events, #43768
1 parent 876bf13 commit 6536592

File tree

2 files changed

+27
-24
lines changed

2 files changed

+27
-24
lines changed

src/vs/vscode.proposed.d.ts

+4-1
Original file line numberDiff line numberDiff line change
@@ -831,6 +831,7 @@ declare module 'vscode' {
831831
export interface FileWillCreateEvent {
832832
readonly creating: ReadonlyArray<Uri>;
833833
waitUntil(thenable: Thenable<any>): void;
834+
waitUntil(thenable: Thenable<WorkspaceEdit>): void;
834835
}
835836

836837
export interface FileDeleteEvent {
@@ -840,6 +841,7 @@ declare module 'vscode' {
840841
export interface FileWillDeleteEvent {
841842
readonly deleting: ReadonlyArray<Uri>;
842843
waitUntil(thenable: Thenable<any>): void;
844+
waitUntil(thenable: Thenable<WorkspaceEdit>): void;
843845
}
844846

845847
export interface FileRenameEvent {
@@ -848,7 +850,8 @@ declare module 'vscode' {
848850

849851
export interface FileWillRenameEvent {
850852
readonly renaming: ReadonlyArray<{ oldUri: Uri, newUri: Uri }>;
851-
waitUntil(thenable: Thenable<WorkspaceEdit>): void; // TODO@joh support sync/async
853+
waitUntil(thenable: Thenable<any>): void;
854+
waitUntil(thenable: Thenable<WorkspaceEdit>): void;
852855
}
853856

854857
export namespace workspace {

src/vs/workbench/api/common/extHostFileSystemEventService.ts

+23-23
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,17 @@
33
* Licensed under the MIT License. See License.txt in the project root for license information.
44
*--------------------------------------------------------------------------------------------*/
55

6-
import { flatten } from 'vs/base/common/arrays';
76
import { AsyncEmitter, Emitter, Event, IWaitUntil } from 'vs/base/common/event';
87
import { IRelativePattern, parse } from 'vs/base/common/glob';
98
import { URI, UriComponents } from 'vs/base/common/uri';
109
import { ExtHostDocumentsAndEditors } from 'vs/workbench/api/common/extHostDocumentsAndEditors';
1110
import * as vscode from 'vscode';
12-
import { ExtHostFileSystemEventServiceShape, FileSystemEvents, IMainContext, MainContext, IResourceFileEditDto, IResourceTextEditDto, MainThreadTextEditorsShape } from './extHost.protocol';
11+
import { ExtHostFileSystemEventServiceShape, FileSystemEvents, IMainContext, MainContext, MainThreadTextEditorsShape, IResourceFileEditDto, IResourceTextEditDto } from './extHost.protocol';
1312
import * as typeConverter from './extHostTypeConverters';
1413
import { Disposable, WorkspaceEdit } from './extHostTypes';
1514
import { IExtensionDescription } from 'vs/platform/extensions/common/extensions';
1615
import { FileOperation } from 'vs/platform/files/common/files';
16+
import { flatten } from 'vs/base/common/arrays';
1717

1818
class FileSystemWatcher implements vscode.FileSystemWatcher {
1919

@@ -179,38 +179,40 @@ export class ExtHostFileSystemEventService implements ExtHostFileSystemEventServ
179179
async $onWillRunFileOperation(operation: FileOperation, target: UriComponents, source: UriComponents | undefined): Promise<any> {
180180
switch (operation) {
181181
case FileOperation.MOVE:
182-
await this._fireWillRename(URI.revive(source!), URI.revive(target));
182+
await this._fireWillEvent(this._onWillRenameFile, { renaming: [{ oldUri: URI.revive(source!), newUri: URI.revive(target) }], });
183183
break;
184184
case FileOperation.DELETE:
185-
this._onWillDeleteFile.fireAsync(thenables => (<vscode.FileWillDeleteEvent>{ deleting: [URI.revive(target)], waitUntil: p => thenables.push(Promise.resolve(p)) }));
185+
await this._fireWillEvent(this._onWillDeleteFile, { deleting: [URI.revive(target)] });
186186
break;
187187
case FileOperation.CREATE:
188-
this._onWillCreateFile.fireAsync(thenables => (<vscode.FileWillCreateEvent>{ creating: [URI.revive(target)], waitUntil: p => thenables.push(Promise.resolve(p)) }));
188+
await this._fireWillEvent(this._onWillCreateFile, { creating: [URI.revive(target)] });
189189
break;
190190
default:
191191
//ignore, dont send
192192
}
193193
}
194194

195-
private async _fireWillRename(oldUri: URI, newUri: URI): Promise<any> {
195+
private async _fireWillEvent<E extends IWaitUntil>(emitter: AsyncEmitter<E>, data: Omit<E, 'waitUntil'>): Promise<any> {
196196

197197
const edits: WorkspaceEdit[] = [];
198-
await Promise.resolve(this._onWillRenameFile.fireAsync(bucket => {
199-
return {
200-
renaming: [{ oldUri, newUri }],
201-
waitUntil: (thenable: Promise<vscode.WorkspaceEdit>): void => {
202-
if (Object.isFrozen(bucket)) {
203-
throw new TypeError('waitUntil cannot be called async');
204-
}
205-
const index = bucket.length;
206-
const wrappedThenable = Promise.resolve(thenable).then(result => {
207-
// ignore all results except for WorkspaceEdits. Those
208-
// are stored in a spare array
209-
if (result instanceof WorkspaceEdit) {
210-
edits[index] = result;
198+
await Promise.resolve(emitter.fireAsync(bucket => {
199+
return <E>{
200+
...data,
201+
...{
202+
waitUntil: (thenable: Promise<vscode.WorkspaceEdit>): void => {
203+
if (Object.isFrozen(bucket)) {
204+
throw new TypeError('waitUntil cannot be called async');
211205
}
212-
});
213-
bucket.push(wrappedThenable);
206+
const index = bucket.length;
207+
const wrappedThenable = Promise.resolve(thenable).then(result => {
208+
// ignore all results except for WorkspaceEdits. Those
209+
// are stored in a spare array
210+
if (result instanceof WorkspaceEdit) {
211+
edits[index] = result;
212+
}
213+
});
214+
bucket.push(wrappedThenable);
215+
}
214216
}
215217
};
216218
}));
@@ -230,6 +232,4 @@ export class ExtHostFileSystemEventService implements ExtHostFileSystemEventServ
230232
}
231233
return this._mainThreadTextEditors.$tryApplyWorkspaceEdit({ edits: flatten(allEdits) });
232234
}
233-
234-
235235
}

0 commit comments

Comments
 (0)