mirror of
https://github.com/Microsoft/vscode
synced 2024-09-13 21:55:38 +00:00
Make getTsConfigsInWorkspace observe the TaskProvider cancellation
This commit is contained in:
parent
d1510288f0
commit
bf2448549d
|
@ -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> {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue