diff --git a/src/vs/platform/search/common/search.ts b/src/vs/platform/search/common/search.ts index ded634a58a4..2e1e6dcab87 100644 --- a/src/vs/platform/search/common/search.ts +++ b/src/vs/platform/search/common/search.ts @@ -27,7 +27,7 @@ export interface ISearchService { search(query: ISearchQuery): PPromise; extendQuery(query: ISearchQuery): void; clearCache(cacheKey: string): TPromise; - registerSearchResultProvider(provider: ISearchResultProvider): IDisposable; + registerSearchResultProvider(scheme: string, provider: ISearchResultProvider): IDisposable; } export interface ISearchHistoryValues { diff --git a/src/vs/workbench/api/electron-browser/mainThreadSearch.ts b/src/vs/workbench/api/electron-browser/mainThreadSearch.ts index 2fc636b81e1..6e692f064b7 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadSearch.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadSearch.ts @@ -86,7 +86,7 @@ class RemoteSearchProvider implements ISearchResultProvider { private readonly _handle: number, private readonly _proxy: ExtHostSearchShape ) { - this._registrations = [searchService.registerSearchResultProvider(this)]; + this._registrations = [searchService.registerSearchResultProvider(this._scheme, this)]; } dispose(): void { diff --git a/src/vs/workbench/services/search/node/searchService.ts b/src/vs/workbench/services/search/node/searchService.ts index f9bb3b703fe..e7159cee743 100644 --- a/src/vs/workbench/services/search/node/searchService.ts +++ b/src/vs/workbench/services/search/node/searchService.ts @@ -32,6 +32,7 @@ export class SearchService implements ISearchService { private diskSearch: DiskSearch; private readonly searchProviders: ISearchResultProvider[] = []; + private fileSearchProvider: ISearchResultProvider; private forwardingTelemetry: PPromise; constructor( @@ -46,13 +47,22 @@ export class SearchService implements ISearchService { this.diskSearch = new DiskSearch(!environmentService.isBuilt || environmentService.verbose, /*timeout=*/undefined, environmentService.debugSearch); } - public registerSearchResultProvider(provider: ISearchResultProvider): IDisposable { - this.searchProviders.push(provider); + public registerSearchResultProvider(scheme: string, provider: ISearchResultProvider): IDisposable { + if (scheme === 'file') { + this.fileSearchProvider = provider; + } else { + this.searchProviders.push(provider); + } + return { dispose: () => { - const idx = this.searchProviders.indexOf(provider); - if (idx >= 0) { - this.searchProviders.splice(idx, 1); + if (scheme === 'file') { + this.fileSearchProvider = null; + } else { + const idx = this.searchProviders.indexOf(provider); + if (idx >= 0) { + this.searchProviders.splice(idx, 1); + } } } }; @@ -115,32 +125,32 @@ export class SearchService implements ISearchService { }); const providerPromise = this.extensionService.whenInstalledExtensionsRegistered().then(() => { - // If no search providers are registered, fall back on DiskSearch // TODO@roblou this is not properly waiting for search-rg to finish registering itself - if (this.searchProviders.length) { - return TPromise.join(this.searchProviders.map(p => searchWithProvider(p))) - .then(completes => { - completes = completes.filter(c => !!c); - if (!completes.length) { - return null; - } + // If no search provider has been registered for the 'file' schema, fall back on DiskSearch + const providers = [ + this.fileSearchProvider || this.diskSearch, + ...this.searchProviders + ]; + return TPromise.join(providers.map(p => searchWithProvider(p))) + .then(completes => { + completes = completes.filter(c => !!c); + if (!completes.length) { + return null; + } - return { - limitHit: completes[0] && completes[0].limitHit, - stats: completes[0].stats, - results: arrays.flatten(completes.map(c => c.results)) - }; - }, errs => { - if (!Array.isArray(errs)) { - errs = [errs]; - } + return { + limitHit: completes[0] && completes[0].limitHit, + stats: completes[0].stats, + results: arrays.flatten(completes.map(c => c.results)) + }; + }, errs => { + if (!Array.isArray(errs)) { + errs = [errs]; + } - errs = errs.filter(e => !!e); - return TPromise.wrapError(errs[0]); - }); - } else { - return searchWithProvider(this.diskSearch); - } + errs = errs.filter(e => !!e); + return TPromise.wrapError(errs[0]); + }); }); combinedPromise = providerPromise.then(value => {