From 6536592dac00904b41b258ccd99a4ce5d881d3f5 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Mon, 18 Nov 2019 13:53:30 +0100 Subject: [PATCH] allow workspace edit in all will-events, #43768 --- src/vs/vscode.proposed.d.ts | 5 +- .../common/extHostFileSystemEventService.ts | 46 +++++++++---------- 2 files changed, 27 insertions(+), 24 deletions(-) diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 78b0c93869ea7..e1a5cb97a3861 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -831,6 +831,7 @@ declare module 'vscode' { export interface FileWillCreateEvent { readonly creating: ReadonlyArray; waitUntil(thenable: Thenable): void; + waitUntil(thenable: Thenable): void; } export interface FileDeleteEvent { @@ -840,6 +841,7 @@ declare module 'vscode' { export interface FileWillDeleteEvent { readonly deleting: ReadonlyArray; waitUntil(thenable: Thenable): void; + waitUntil(thenable: Thenable): void; } export interface FileRenameEvent { @@ -848,7 +850,8 @@ declare module 'vscode' { export interface FileWillRenameEvent { readonly renaming: ReadonlyArray<{ oldUri: Uri, newUri: Uri }>; - waitUntil(thenable: Thenable): void; // TODO@joh support sync/async + waitUntil(thenable: Thenable): void; + waitUntil(thenable: Thenable): void; } export namespace workspace { diff --git a/src/vs/workbench/api/common/extHostFileSystemEventService.ts b/src/vs/workbench/api/common/extHostFileSystemEventService.ts index a290fb0cc0f3c..a3ea9c9caa6a1 100644 --- a/src/vs/workbench/api/common/extHostFileSystemEventService.ts +++ b/src/vs/workbench/api/common/extHostFileSystemEventService.ts @@ -3,17 +3,17 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { flatten } from 'vs/base/common/arrays'; import { AsyncEmitter, Emitter, Event, IWaitUntil } from 'vs/base/common/event'; import { IRelativePattern, parse } from 'vs/base/common/glob'; import { URI, UriComponents } from 'vs/base/common/uri'; import { ExtHostDocumentsAndEditors } from 'vs/workbench/api/common/extHostDocumentsAndEditors'; import * as vscode from 'vscode'; -import { ExtHostFileSystemEventServiceShape, FileSystemEvents, IMainContext, MainContext, IResourceFileEditDto, IResourceTextEditDto, MainThreadTextEditorsShape } from './extHost.protocol'; +import { ExtHostFileSystemEventServiceShape, FileSystemEvents, IMainContext, MainContext, MainThreadTextEditorsShape, IResourceFileEditDto, IResourceTextEditDto } from './extHost.protocol'; import * as typeConverter from './extHostTypeConverters'; import { Disposable, WorkspaceEdit } from './extHostTypes'; import { IExtensionDescription } from 'vs/platform/extensions/common/extensions'; import { FileOperation } from 'vs/platform/files/common/files'; +import { flatten } from 'vs/base/common/arrays'; class FileSystemWatcher implements vscode.FileSystemWatcher { @@ -179,38 +179,40 @@ export class ExtHostFileSystemEventService implements ExtHostFileSystemEventServ async $onWillRunFileOperation(operation: FileOperation, target: UriComponents, source: UriComponents | undefined): Promise { switch (operation) { case FileOperation.MOVE: - await this._fireWillRename(URI.revive(source!), URI.revive(target)); + await this._fireWillEvent(this._onWillRenameFile, { renaming: [{ oldUri: URI.revive(source!), newUri: URI.revive(target) }], }); break; case FileOperation.DELETE: - this._onWillDeleteFile.fireAsync(thenables => ({ deleting: [URI.revive(target)], waitUntil: p => thenables.push(Promise.resolve(p)) })); + await this._fireWillEvent(this._onWillDeleteFile, { deleting: [URI.revive(target)] }); break; case FileOperation.CREATE: - this._onWillCreateFile.fireAsync(thenables => ({ creating: [URI.revive(target)], waitUntil: p => thenables.push(Promise.resolve(p)) })); + await this._fireWillEvent(this._onWillCreateFile, { creating: [URI.revive(target)] }); break; default: //ignore, dont send } } - private async _fireWillRename(oldUri: URI, newUri: URI): Promise { + private async _fireWillEvent(emitter: AsyncEmitter, data: Omit): Promise { const edits: WorkspaceEdit[] = []; - await Promise.resolve(this._onWillRenameFile.fireAsync(bucket => { - return { - renaming: [{ oldUri, newUri }], - waitUntil: (thenable: Promise): void => { - if (Object.isFrozen(bucket)) { - throw new TypeError('waitUntil cannot be called async'); - } - const index = bucket.length; - const wrappedThenable = Promise.resolve(thenable).then(result => { - // ignore all results except for WorkspaceEdits. Those - // are stored in a spare array - if (result instanceof WorkspaceEdit) { - edits[index] = result; + await Promise.resolve(emitter.fireAsync(bucket => { + return { + ...data, + ...{ + waitUntil: (thenable: Promise): void => { + if (Object.isFrozen(bucket)) { + throw new TypeError('waitUntil cannot be called async'); } - }); - bucket.push(wrappedThenable); + const index = bucket.length; + const wrappedThenable = Promise.resolve(thenable).then(result => { + // ignore all results except for WorkspaceEdits. Those + // are stored in a spare array + if (result instanceof WorkspaceEdit) { + edits[index] = result; + } + }); + bucket.push(wrappedThenable); + } } }; })); @@ -230,6 +232,4 @@ export class ExtHostFileSystemEventService implements ExtHostFileSystemEventServ } return this._mainThreadTextEditors.$tryApplyWorkspaceEdit({ edits: flatten(allEdits) }); } - - }