search: always pass a session to file search providers
FileSearchProviderOptions.session is declared as an object, but searches without a cache key got undefined, so providers that key a WeakMap on the session threw. Give those searches their own session and cancel it once the search is done, like clearCache does for cached sessions.
This commit is contained in:
1 parent
6cf5d04662
commit
9bba2ad2af
2 files changed
+22
-4
No files matched your search
@@ -293,6 +293,20 @@ suite('ExtHostSearch', () => {
|
|||||||
disposables.forEach(d => d?.dispose());
|
disposables.forEach(d => d?.dispose());
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('session is defined when there is no cache key', async () => {
|
||||||
|
let session: object | undefined;
|
||||||
|
disposables.add(extHostSearch.registerFileSearchProvider('file', {
|
||||||
|
provideFileSearchResults(pattern: string, options: vscode.FileSearchProviderOptions, token: vscode.CancellationToken): Promise<URI[]> {
|
||||||
|
session = options.session;
|
||||||
|
return Promise.resolve([]);
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
await rpcProtocol.sync();
|
||||||
|
|
||||||
|
await runFileSearch(getSimpleQuery());
|
||||||
|
assert.strictEqual(typeof session, 'object');
|
||||||
|
});
|
||||||
|
|
||||||
test('provider returns null', async () => {
|
test('provider returns null', async () => {
|
||||||
await registerTestFileSearchProvider({
|
await registerTestFileSearchProvider({
|
||||||
provideFileSearchResults(query: vscode.FileSearchQuery, options: vscode.FileSearchOptions, token: vscode.CancellationToken): Promise<URI[]> {
|
provideFileSearchResults(query: vscode.FileSearchQuery, options: vscode.FileSearchOptions, token: vscode.CancellationToken): Promise<URI[]> {
|
||||||
|
|||||||
@@ -347,7 +347,11 @@ export class FileSearchManager {
|
|||||||
onBatch(batch.map(m => this.rawMatchToSearchItem(m)));
|
onBatch(batch.map(m => this.rawMatchToSearchItem(m)));
|
||||||
};
|
};
|
||||||
|
|
||||||
return this.doSearch(engine, FileSearchManager.BATCH_SIZE, onInternalResult, token).then(
|
return this.doSearch(engine, FileSearchManager.BATCH_SIZE, onInternalResult, token).finally(() => {
|
||||||
|
if (!config.cacheKey) {
|
||||||
|
sessionTokenSource.cancel();
|
||||||
|
}
|
||||||
|
}).then(
|
||||||
result => {
|
result => {
|
||||||
return {
|
return {
|
||||||
limitHit: result.limitHit,
|
limitHit: result.limitHit,
|
||||||
@@ -369,16 +373,16 @@ export class FileSearchManager {
|
|||||||
this.sessions.delete(cacheKey);
|
this.sessions.delete(cacheKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
private getSessionTokenSource(cacheKey: string | undefined): SessionLifecycle | undefined {
|
private getSessionTokenSource(cacheKey: string | undefined): SessionLifecycle {
|
||||||
if (!cacheKey) {
|
if (!cacheKey) {
|
||||||
return undefined;
|
return new SessionLifecycle();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!this.sessions.has(cacheKey)) {
|
if (!this.sessions.has(cacheKey)) {
|
||||||
this.sessions.set(cacheKey, new SessionLifecycle());
|
this.sessions.set(cacheKey, new SessionLifecycle());
|
||||||
}
|
}
|
||||||
|
|
||||||
return this.sessions.get(cacheKey);
|
return this.sessions.get(cacheKey)!;
|
||||||
}
|
}
|
||||||
|
|
||||||
private rawMatchToSearchItem(match: IInternalFileMatch): IFileMatch {
|
private rawMatchToSearchItem(match: IInternalFileMatch): IFileMatch {
|
||||||
|
|||||||
Reference in new issue
Block a user