diff --git a/extensions/typescript-language-features/src/features/bufferSyncSupport.ts b/extensions/typescript-language-features/src/features/bufferSyncSupport.ts index ddbccd3a27d..b44ec9fa0a0 100644 --- a/extensions/typescript-language-features/src/features/bufferSyncSupport.ts +++ b/extensions/typescript-language-features/src/features/bufferSyncSupport.ts @@ -256,6 +256,7 @@ export default class BufferSyncSupport extends Disposable { if (!syncedBuffer) { return; } + this.pendingDiagnostics.delete(resource); this.syncedBuffers.delete(resource); syncedBuffer.close(); if (!fs.existsSync(resource.fsPath)) { @@ -264,6 +265,19 @@ export default class BufferSyncSupport extends Disposable { } } + public interuptGetErr(f: () => R): R { + console.log('try inter'); + if (!this.pendingGetErr) { + return f(); + } + + this.pendingGetErr.cancel(); + this.pendingGetErr = undefined; + const result = f(); + this.triggerDiagnostics(); + return result; + } + private onDidCloseTextDocument(document: vscode.TextDocument): void { this.closeResource(document.uri); } diff --git a/extensions/typescript-language-features/src/features/completions.ts b/extensions/typescript-language-features/src/features/completions.ts index e1eb9121f13..063bd8cbbc6 100644 --- a/extensions/typescript-language-features/src/features/completions.ts +++ b/extensions/typescript-language-features/src/features/completions.ts @@ -304,7 +304,7 @@ class TypeScriptCompletionItemProvider implements vscode.CompletionItemProvider return null; } - await this.fileConfigurationManager.ensureConfigurationForDocument(document, token); + await this.client.interuptGetErr(() => this.fileConfigurationManager.ensureConfigurationForDocument(document, token)); const args: Proto.CompletionsRequestArgs = { ...typeConverters.Position.toFileLocationRequestArgs(file, position), @@ -313,19 +313,18 @@ class TypeScriptCompletionItemProvider implements vscode.CompletionItemProvider triggerCharacter: context.triggerCharacter as Proto.CompletionsTriggerCharacter }; - let enableCommitCharacters = true; let msg: ReadonlyArray | undefined = undefined; try { if (this.client.apiVersion.gte(API.v300)) { - const { body } = await this.client.execute('completionInfo', args, token); + const { body } = await this.client.interuptGetErr(() => this.client.execute('completionInfo', args, token)); if (!body) { return null; } enableCommitCharacters = !body.isNewIdentifierLocation; msg = body.entries; } else { - const { body } = await this.client.execute('completions', args, token); + const { body } = await this.client.interuptGetErr(() => this.client.execute('completions', args, token)); if (!body) { return null; } diff --git a/extensions/typescript-language-features/src/features/hover.ts b/extensions/typescript-language-features/src/features/hover.ts index 78580d3dfdc..19f78ee5f33 100644 --- a/extensions/typescript-language-features/src/features/hover.ts +++ b/extensions/typescript-language-features/src/features/hover.ts @@ -25,9 +25,10 @@ class TypeScriptHoverProvider implements vscode.HoverProvider { if (!filepath) { return undefined; } + const args = typeConverters.Position.toFileLocationRequestArgs(filepath, position); try { - const { body } = await this.client.execute('quickinfo', args, token); + const { body } = await this.client.interuptGetErr(() => this.client.execute('quickinfo', args, token)); if (body) { return new vscode.Hover( TypeScriptHoverProvider.getContents(body), diff --git a/extensions/typescript-language-features/src/typescriptService.ts b/extensions/typescript-language-features/src/typescriptService.ts index 990ab8c6384..aff38d6a44c 100644 --- a/extensions/typescript-language-features/src/typescriptService.ts +++ b/extensions/typescript-language-features/src/typescriptService.ts @@ -91,4 +91,9 @@ export interface ITypeScriptServiceClient { executeWithoutWaitingForResponse(command: 'reloadProjects', args: null): void; executeAsync(command: 'geterr', args: Proto.GeterrRequestArgs, token: vscode.CancellationToken): Promise; + + /** + * Cancel on going geterr requests and re-queue them after `f` has been evaluated. + */ + interuptGetErr(f: () => R): R; } \ No newline at end of file diff --git a/extensions/typescript-language-features/src/typescriptServiceClient.ts b/extensions/typescript-language-features/src/typescriptServiceClient.ts index 2d20a3c0a64..016f533b6e2 100644 --- a/extensions/typescript-language-features/src/typescriptServiceClient.ts +++ b/extensions/typescript-language-features/src/typescriptServiceClient.ts @@ -738,6 +738,10 @@ export default class TypeScriptServiceClient extends Disposable implements IType return result; } + public interuptGetErr(f: () => R): R { + return this.bufferSyncSupport.interuptGetErr(f); + } + /** * Given a `errorText` from a tsserver request indicating failure in handling a request, * prepares a payload for telemetry-logging.