3
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
4
*--------------------------------------------------------------------------------------------*/
5
5
6
- import { flatten } from 'vs/base/common/arrays' ;
7
6
import { AsyncEmitter , Emitter , Event , IWaitUntil } from 'vs/base/common/event' ;
8
7
import { IRelativePattern , parse } from 'vs/base/common/glob' ;
9
8
import { URI , UriComponents } from 'vs/base/common/uri' ;
10
9
import { ExtHostDocumentsAndEditors } from 'vs/workbench/api/common/extHostDocumentsAndEditors' ;
11
10
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' ;
13
12
import * as typeConverter from './extHostTypeConverters' ;
14
13
import { Disposable , WorkspaceEdit } from './extHostTypes' ;
15
14
import { IExtensionDescription } from 'vs/platform/extensions/common/extensions' ;
16
15
import { FileOperation } from 'vs/platform/files/common/files' ;
16
+ import { flatten } from 'vs/base/common/arrays' ;
17
17
18
18
class FileSystemWatcher implements vscode . FileSystemWatcher {
19
19
@@ -179,38 +179,40 @@ export class ExtHostFileSystemEventService implements ExtHostFileSystemEventServ
179
179
async $onWillRunFileOperation ( operation : FileOperation , target : UriComponents , source : UriComponents | undefined ) : Promise < any > {
180
180
switch ( operation ) {
181
181
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 ) } ] , } ) ;
183
183
break ;
184
184
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 ) ] } ) ;
186
186
break ;
187
187
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 ) ] } ) ;
189
189
break ;
190
190
default :
191
191
//ignore, dont send
192
192
}
193
193
}
194
194
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 > {
196
196
197
197
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' ) ;
211
205
}
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
+ }
214
216
}
215
217
} ;
216
218
} ) ) ;
@@ -230,6 +232,4 @@ export class ExtHostFileSystemEventService implements ExtHostFileSystemEventServ
230
232
}
231
233
return this . _mainThreadTextEditors . $tryApplyWorkspaceEdit ( { edits : flatten ( allEdits ) } ) ;
232
234
}
233
-
234
-
235
235
}
0 commit comments