From 0749b7aca802089907b861dd06bb7ccc329e3ed6 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 12 Nov 2019 21:58:39 -0800 Subject: [PATCH] Timebox the TSServer request used in the JS/TS task provider Fixes #84278 --- .../src/features/task.ts | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/extensions/typescript-language-features/src/features/task.ts b/extensions/typescript-language-features/src/features/task.ts index e41a4b66d0d..1118c660adf 100644 --- a/extensions/typescript-language-features/src/features/task.ts +++ b/extensions/typescript-language-features/src/features/task.ts @@ -8,7 +8,7 @@ import * as jsonc from 'jsonc-parser'; import * as path from 'path'; import * as vscode from 'vscode'; import * as nls from 'vscode-nls'; -import { ITypeScriptServiceClient } from '../typescriptService'; +import { ITypeScriptServiceClient, ServerResponse } from '../typescriptService'; import { isTsConfigFileName } from '../utils/languageDescription'; import { Lazy } from '../utils/lazy'; import { isImplicitProjectConfigFile } from '../utils/tsconfig'; @@ -36,6 +36,8 @@ interface TypeScriptTaskDefinition extends vscode.TaskDefinition { * Provides tasks for building `tsconfig.json` files in a project. */ export default class TscTaskProvider implements vscode.TaskProvider { + + private readonly projectInfoRequestTimeout = 2000; private autoDetect: AutoDetect = 'on'; private readonly tsconfigProvider: TsConfigProvider; private readonly disposables: vscode.Disposable[] = []; @@ -129,10 +131,13 @@ export default class TscTaskProvider implements vscode.TaskProvider { return []; } - const response = await this.client.value.execute( - 'projectInfo', - { file, needFileNameList: false }, - token); + const response = await Promise.race([ + this.client.value.execute( + 'projectInfo', + { file, needFileNameList: false }, + token), + new Promise(resolve => setTimeout(() => resolve(ServerResponse.NoContent), this.projectInfoRequestTimeout)) + ]); if (response.type !== 'response' || !response.body) { return []; }