@@ -10,7 +10,7 @@ import objects = require('vs/base/common/objects');
1010import strings = require( 'vs/base/common/strings' ) ;
1111import { getNextTickChannel } from 'vs/base/parts/ipc/common/ipc' ;
1212import { Client , IIPCOptions } from 'vs/base/parts/ipc/node/ipc.cp' ;
13- import { IProgress , LineMatch , FileMatch , ISearchComplete , ISearchProgressItem , QueryType , IFileMatch , ISearchQuery , ISearchConfiguration , ISearchService , pathIncludedInQuery , ISearchResultProvider } from 'vs/platform/search/common/search' ;
13+ import { IProgress , LineMatch , FileMatch , ISearchComplete , ISearchProgressItem , QueryType , IFileMatch , ISearchQuery , IFolderQuery , ISearchConfiguration , ISearchService , pathIncludedInQuery , ISearchResultProvider } from 'vs/platform/search/common/search' ;
1414import { IUntitledEditorService } from 'vs/workbench/services/untitled/common/untitledEditorService' ;
1515import { IModelService } from 'vs/editor/common/services/modelService' ;
1616import { IConfigurationService } from 'vs/platform/configuration/common/configuration' ;
@@ -268,9 +268,25 @@ export class DiskSearch implements ISearchResultProvider {
268268 this . raw = new SearchChannelClient ( channel ) ;
269269 }
270270
271- public async search ( query : ISearchQuery ) : PPromise < ISearchComplete , ISearchProgressItem > {
272- let request : PPromise < ISerializedSearchComplete , ISerializedSearchProgressItem > ;
271+ public search ( query : ISearchQuery ) : PPromise < ISearchComplete , ISearchProgressItem > {
272+ const folderQueries = query . folderQueries || [ ] ;
273+ return TPromise . join ( folderQueries . map ( q => q . folder . scheme === Schemas . file && pfs . exists ( q . folder . fsPath ) ) )
274+ . then ( exists => {
275+ const existingFolders = folderQueries . filter ( ( q , index ) => exists [ index ] ) ;
276+ const rawSearch = this . rawSearchQuery ( query , existingFolders ) ;
277+
278+ let request : PPromise < ISerializedSearchComplete , ISerializedSearchProgressItem > ;
279+ if ( query . type === QueryType . File ) {
280+ request = this . raw . fileSearch ( rawSearch ) ;
281+ } else {
282+ request = this . raw . textSearch ( rawSearch ) ;
283+ }
284+
285+ return DiskSearch . collectResults ( request ) ;
286+ } ) ;
287+ }
273288
289+ private rawSearchQuery ( query : ISearchQuery , existingFolders : IFolderQuery [ ] ) {
274290 let rawSearch : IRawSearch = {
275291 folderQueries : [ ] ,
276292 extraFiles : [ ] ,
@@ -286,18 +302,14 @@ export class DiskSearch implements ISearchResultProvider {
286302 ignoreSymlinks : query . ignoreSymlinks
287303 } ;
288304
289- if ( query . folderQueries ) {
290- for ( const q of query . folderQueries ) {
291- if ( q . folder . scheme === Schemas . file && await pfs . exists ( q . folder . fsPath ) ) {
292- rawSearch . folderQueries . push ( {
293- excludePattern : q . excludePattern ,
294- includePattern : q . includePattern ,
295- fileEncoding : q . fileEncoding ,
296- disregardIgnoreFiles : q . disregardIgnoreFiles ,
297- folder : q . folder . fsPath
298- } ) ;
299- }
300- }
305+ for ( const q of existingFolders ) {
306+ rawSearch . folderQueries . push ( {
307+ excludePattern : q . excludePattern ,
308+ includePattern : q . includePattern ,
309+ fileEncoding : q . fileEncoding ,
310+ disregardIgnoreFiles : q . disregardIgnoreFiles ,
311+ folder : q . folder . fsPath
312+ } ) ;
301313 }
302314
303315 if ( query . extraFileResources ) {
@@ -312,13 +324,7 @@ export class DiskSearch implements ISearchResultProvider {
312324 rawSearch . contentPattern = query . contentPattern ;
313325 }
314326
315- if ( query . type === QueryType . File ) {
316- request = this . raw . fileSearch ( rawSearch ) ;
317- } else {
318- request = this . raw . textSearch ( rawSearch ) ;
319- }
320-
321- return DiskSearch . collectResults ( request ) ;
327+ return rawSearch ;
322328 }
323329
324330 public static collectResults ( request : PPromise < ISerializedSearchComplete , ISerializedSearchProgressItem > ) : PPromise < ISearchComplete , ISearchProgressItem > {
0 commit comments