diff --git a/extensions/typescript-language-features/src/task/taskProvider.ts b/extensions/typescript-language-features/src/task/taskProvider.ts index f324e0ff60a..babb4c8c9e2 100644 --- a/extensions/typescript-language-features/src/task/taskProvider.ts +++ b/extensions/typescript-language-features/src/task/taskProvider.ts @@ -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(); 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 { - return Array.from(await this.tsconfigProvider.getConfigsForWorkspace({ timeout: this.findConfigFilesTimeout })); + private async getTsConfigsInWorkspace(token: vscode.CancellationToken): Promise { + 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 { diff --git a/extensions/typescript-language-features/src/task/tsconfigProvider.ts b/extensions/typescript-language-features/src/task/tsconfigProvider.ts index 247b6bb321a..16dca92cc62 100644 --- a/extensions/typescript-language-features/src/task/tsconfigProvider.ts +++ b/extensions/typescript-language-features/src/task/tsconfigProvider.ts @@ -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> { + public async getConfigsForWorkspace(token: vscode.CancellationToken): Promise> { if (!vscode.workspace.workspaceFolders) { return []; } const configs = new Map(); - 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 { - 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 { + return await vscode.workspace.findFiles('**/tsconfig*.json', '**/{node_modules,.*}/**', undefined, token); } }