diff --git a/src/vs/workbench/api/electron-browser/mainThreadWorkspace.ts b/src/vs/workbench/api/electron-browser/mainThreadWorkspace.ts index 852ed36a15c9c057e776871c3c8a918ecfec3c88..861859a7f4f38c4bc20e75f430808bb07ffd2c69 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadWorkspace.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadWorkspace.ts @@ -214,8 +214,13 @@ export class MainThreadWorkspace implements MainThreadWorkspaceShape { return search; } - $checkExists(query: ISearchQuery, requestId: number): Thenable { - query.exists = true; + $checkExists(includes: string[], requestId: number): Thenable { + const queryBuilder = this._instantiationService.createInstance(QueryBuilder); + const folders = this._contextService.getWorkspace().folders.map(folder => folder.uri); + const query = queryBuilder.file(folders, { + includePattern: includes.join(', '), + exists: true + }); const tokenSource = new CancellationTokenSource(); const search = this._searchService.search(query, tokenSource.token).then( diff --git a/src/vs/workbench/api/node/extHost.protocol.ts b/src/vs/workbench/api/node/extHost.protocol.ts index 780d6691841088339fbcef6266ed599335d47aae..3262559aae574a0efa244f17ea6540205a74ef07 100644 --- a/src/vs/workbench/api/node/extHost.protocol.ts +++ b/src/vs/workbench/api/node/extHost.protocol.ts @@ -26,7 +26,7 @@ import { LabelRules } from 'vs/platform/label/common/label'; import { LogLevel } from 'vs/platform/log/common/log'; import { IMarkerData } from 'vs/platform/markers/common/markers'; import { IPickOptions, IQuickInputButton, IQuickPickItem } from 'vs/platform/quickinput/common/quickInput'; -import { IPatternInfo, IQueryOptions, IRawFileMatch2, IRawSearchQuery, ISearchCompleteStats, ISearchQuery } from 'vs/platform/search/common/search'; +import { IPatternInfo, IQueryOptions, IRawFileMatch2, IRawSearchQuery, ISearchCompleteStats } from 'vs/platform/search/common/search'; import { StatusbarAlignment as MainThreadStatusBarAlignment } from 'vs/platform/statusbar/common/statusbar'; import { ITelemetryInfo } from 'vs/platform/telemetry/common/telemetry'; import { ThemeColor } from 'vs/platform/theme/common/themeService'; @@ -472,7 +472,7 @@ export interface ExtHostUrlsShape { export interface MainThreadWorkspaceShape extends IDisposable { $startFileSearch(includePattern: string, includeFolder: string, excludePatternOrDisregardExcludes: string | false, maxResults: number, requestId: number): Thenable; $startTextSearch(query: IPatternInfo, options: IQueryOptions, requestId: number): Thenable; - $checkExists(query: ISearchQuery, requestId: number): Thenable; + $checkExists(includes: string[], requestId: number): Thenable; $cancelSearch(requestId: number): Thenable; $saveAll(includeUntitled?: boolean): Thenable; $updateWorkspaceFolders(extensionName: string, index: number, deleteCount: number, workspaceFoldersToAdd: { uri: UriComponents, name?: string }[]): Thenable; diff --git a/src/vs/workbench/node/extensionHostMain.ts b/src/vs/workbench/node/extensionHostMain.ts index 13e3a073a452326a5e71cb7a7ca148ae9f168328..36d33d6057177f1e46f4b0c90cdeb04ca9d02b3f 100644 --- a/src/vs/workbench/node/extensionHostMain.ts +++ b/src/vs/workbench/node/extensionHostMain.ts @@ -13,11 +13,9 @@ import { ExtHostExtensionService } from 'vs/workbench/api/node/extHostExtensionS import { ExtHostConfiguration } from 'vs/workbench/api/node/extHostConfiguration'; import { ExtHostWorkspace } from 'vs/workbench/api/node/extHostWorkspace'; import { IExtensionDescription } from 'vs/workbench/services/extensions/common/extensions'; -import { QueryType, ISearchQuery } from 'vs/platform/search/common/search'; import { DiskSearch } from 'vs/workbench/services/search/node/searchService'; import { IInitData, IEnvironment, IWorkspaceData, MainContext, MainThreadWorkspaceShape } from 'vs/workbench/api/node/extHost.protocol'; import * as errors from 'vs/base/common/errors'; -import * as glob from 'vs/base/common/glob'; import { ExtensionActivatedByEvent } from 'vs/workbench/api/node/extHostExtensionActivator'; import { IDisposable, dispose } from 'vs/base/common/lifecycle'; import { IMessagePassingProtocol } from 'vs/base/parts/ipc/node/ipc'; @@ -273,27 +271,8 @@ export class ExtensionHostMain { this._diskSearch = new DiskSearch(false, 1000); } - const includes: glob.IExpression = {}; - globPatterns.forEach((globPattern) => { - includes[globPattern] = true; - }); - - const folderQueries = this._workspace.folders.map(folder => ({ folder: URI.revive(folder.uri) })); - const config = this._extHostConfiguration.getConfiguration('search'); - const useRipgrep = config.get('useRipgrep', true); - const followSymlinks = config.get('followSymlinks', true); - - const query: ISearchQuery = { - folderQueries, - type: QueryType.File, - exists: true, - includePattern: includes, - useRipgrep, - ignoreSymlinks: !followSymlinks - }; - const requestId = this._searchRequestIdProvider.getNext(); - const searchP = this._mainThreadWorkspace.$checkExists(query, requestId);; + const searchP = this._mainThreadWorkspace.$checkExists(globPatterns, requestId); const timer = setTimeout(async () => { await this._mainThreadWorkspace.$cancelSearch(requestId); diff --git a/src/vs/workbench/parts/search/common/queryBuilder.ts b/src/vs/workbench/parts/search/common/queryBuilder.ts index 6bf03131c0af6e4faf9e6692e9c25ab37142b137..861ad5bcd12796878e98f002d8e4e36b22de6933 100644 --- a/src/vs/workbench/parts/search/common/queryBuilder.ts +++ b/src/vs/workbench/parts/search/common/queryBuilder.ts @@ -96,7 +96,8 @@ export class QueryBuilder { disregardIgnoreFiles: options.disregardIgnoreFiles || !useIgnoreFiles, disregardExcludeSettings: options.disregardExcludeSettings, ignoreSymlinks, - previewOptions: options.previewOptions + previewOptions: options.previewOptions, + exists: options.exists }; // Filter extraFileResources against global include/exclude patterns - they are already expected to not belong to a workspace