1
>
/*---------------------------------------------------------------------------------------------
extHostSearch.ts
2
>
* Copyright (c) Microsoft Corporation. All rights reserved.
3
>
* Licensed under the MIT License. See License.txt in the project root for license information.
4
>
*--------------------------------------------------------------------------------------------*/
5
>
6
>
import { IDisposable, toDisposable } from '../../../base/common/lifecycle.js';
7
>
import type * as vscode from 'vscode';
8
>
import { ExtHostSearchShape, MainThreadSearchShape, MainContext } from './extHost.protocol.js';
9
>
import { createDecorator } from '../../../platform/instantiation/common/instantiation.js';
10
>
import { FileSearchManager } from '../../services/search/common/fileSearchManager.js';
11
>
import { IExtHostRpcService } from './extHostRpcService.js';
12
>
import { IURITransformerService } from './extHostUriTransformerService.js';
13
>
import { ILogService } from '../../../platform/log/common/log.js';
14
>
import { IRawFileQuery, ISearchCompleteStats, IFileQuery, IRawTextQuery, IRawQuery, ITextQuery, IFolderQuery, IRawAITextQuery, IAITextQuery } from '../../services/search/common/search.js';
15
>
import { URI, UriComponents } from '../../../base/common/uri.js';
16
>
import { TextSearchManager } from '../../services/search/common/textSearchManager.js';
17
>
import { CancellationToken } from '../../../base/common/cancellation.js';
18
>
import { revive } from '../../../base/common/marshalling.js';
19
>
import { OldFileSearchProviderConverter, OldTextSearchProviderConverter } from '../../services/search/common/searchExtConversionTypes.js';
20
>
21
>
export interface IExtHostSearch extends ExtHostSearchShape {
22
>
registerTextSearchProviderOld(scheme: string, provider: vscode.TextSearchProvider): IDisposable;
23
>
registerFileSearchProviderOld(scheme: string, provider: vscode.FileSearchProvider): IDisposable;
24
>
registerTextSearchProvider(scheme: string, provider: vscode.TextSearchProvider2): IDisposable;
25
>
registerAITextSearchProvider(scheme: string, provider: vscode.AITextSearchProvider): IDisposable;
26
>
registerFileSearchProvider(scheme: string, provider: vscode.FileSearchProvider2): IDisposable;
27
>
doInternalFileSearchWithCustomCallback(query: IFileQuery, token: CancellationToken, handleFileMatch: (data: URI[]) => void): Promise<ISearchCompleteStats>;
28
>
}
29
>
30
>
export const IExtHostSearch = createDecorator<IExtHostSearch>('IExtHostSearch');
31
>
32
>
export class ExtHostSearch implements IExtHostSearch {
33
>
34
>
protected readonly _proxy: MainThreadSearchShape;
35
>
protected _handlePool: number;
36
>
37
>
private readonly _textSearchProvider: Map<number, vscode.TextSearchProvider2>;
38
>
private readonly _textSearchUsedSchemes: Set<string>;
39
>
40
>
private readonly _aiTextSearchProvider: Map<number, vscode.AITextSearchProvider>;
41
>
private readonly _aiTextSearchUsedSchemes: Set<string>;
42
>
43
>
private readonly _fileSearchProvider: Map<number, vscode.FileSearchProvider2>;
44
>
private readonly _fileSearchUsedSchemes: Set<string>;
45
>
46
>
private readonly _fileSearchManager: FileSearchManager;
47
>
48
>
constructor(
49
>
@IExtHostRpcService private extHostRpc: IExtHostRpcService,
50
>
@IURITransformerService protected _uriTransformer: IURITransformerService,
51
>
@ILogService protected _logService: ILogService,
52
>
) {
53
>
this._proxy = this.extHostRpc.getProxy(MainContext.MainThreadSearch);
54
>
this._handlePool = 0;
55
>
this._textSearchProvider = new Map<number, vscode.TextSearchProvider2>();
56
>
this._textSearchUsedSchemes = new Set<string>();
57
>
this._aiTextSearchProvider = new Map<number, vscode.AITextSearchProvider>();
58
>
this._aiTextSearchUsedSchemes = new Set<string>();
59
>
this._fileSearchProvider = new Map<number, vscode.FileSearchProvider2>();
60
>
this._fileSearchUsedSchemes = new Set<string>();
61
>
this._fileSearchManager = new FileSearchManager();
62
>
}
63
>
64
>
protected _transformScheme(scheme: string): string {
65
>
return this._uriTransformer.transformOutgoingScheme(scheme);
66
>
}
67
>
68
>
registerTextSearchProviderOld(scheme: string, provider: vscode.TextSearchProvider): IDisposable {
69
if (this._textSearchUsedSchemes.has(scheme)) {
70
throw new Error(`a text search provider for the scheme '${scheme}' is already registered`);