Make getTsConfigsInWorkspace observe the TaskProvider cancellation

This commit is contained in:
Matt Bierner 2020-09-18 16:00:56 -07:00
parent d1510288f0
commit bf2448549d
2 changed files with 17 additions and 22 deletions

View file

@ -7,6 +7,7 @@ import * as jsonc from 'jsonc-parser';
import * as path from 'path';
import * as vscode from 'vscode';
import * as nls from 'vscode-nls';
import { wait } from '../test/testUtils';
import { ITypeScriptServiceClient, ServerResponse } from '../typescriptService';
import { isTsConfigFileName } from '../utils/languageDescription';
import { Lazy } from '../utils/lazy';
@ -105,7 +106,7 @@ class TscTaskProvider implements vscode.TaskProvider {
const out = new Set<TSConfig>();
const configs = [
...await this.getTsConfigForActiveFile(token),
...await this.getTsConfigsInWorkspace()
...await this.getTsConfigsInWorkspace(token)
];
for (const config of configs) {
if (await exists(config.uri)) {
@ -161,8 +162,17 @@ class TscTaskProvider implements vscode.TaskProvider {
return [];
}
private async getTsConfigsInWorkspace(): Promise<TSConfig[]> {
return Array.from(await this.tsconfigProvider.getConfigsForWorkspace({ timeout: this.findConfigFilesTimeout }));
private async getTsConfigsInWorkspace(token: vscode.CancellationToken): Promise<TSConfig[]> {
const getConfigsTimeout = new vscode.CancellationTokenSource();
token.onCancellationRequested(() => getConfigsTimeout.cancel());
return Promise.race([
this.tsconfigProvider.getConfigsForWorkspace(getConfigsTimeout.token).then(x => Array.from(x)),
wait(this.findConfigFilesTimeout).then(() => {
getConfigsTimeout.cancel();
return [];
}),
]);
}
private static async getCommand(project: TSConfig): Promise<string> {

View file

@ -4,7 +4,6 @@
*--------------------------------------------------------------------------------------------*/
import * as vscode from 'vscode';
import { wait } from '../test/testUtils';
export interface TSConfig {
readonly uri: vscode.Uri;
@ -14,13 +13,13 @@ export interface TSConfig {
}
export class TsConfigProvider {
public async getConfigsForWorkspace(options?: { timeout: number }): Promise<Iterable<TSConfig>> {
public async getConfigsForWorkspace(token: vscode.CancellationToken): Promise<Iterable<TSConfig>> {
if (!vscode.workspace.workspaceFolders) {
return [];
}
const configs = new Map<string, TSConfig>();
for (const config of await this.findConfigFiles(options)) {
for (const config of await this.findConfigFiles(token)) {
const root = vscode.workspace.getWorkspaceFolder(config);
if (root) {
configs.set(config.fsPath, {
@ -34,21 +33,7 @@ export class TsConfigProvider {
return configs.values();
}
private async findConfigFiles(options?: { timeout: number }): Promise<vscode.Uri[]> {
const timeout = options?.timeout;
const task = (token?: vscode.CancellationToken) => vscode.workspace.findFiles('**/tsconfig*.json', '**/{node_modules,.*}/**', undefined, token);
if (typeof timeout === 'number') {
const cancel = new vscode.CancellationTokenSource();
return Promise.race([
task(cancel.token),
wait(timeout).then(() => {
cancel.cancel();
return [];
}),
]);
} else {
return task();
}
private async findConfigFiles(token: vscode.CancellationToken): Promise<vscode.Uri[]> {
return await vscode.workspace.findFiles('**/tsconfig*.json', '**/{node_modules,.*}/**', undefined, token);
}
}