From 5d5421f2b3741a9f7af45245e4e1b99348621528 Mon Sep 17 00:00:00 2001 From: Zhiming Ma Date: Tue, 18 Apr 2023 00:00:08 +0800 Subject: [PATCH] Fix VSCode extension: cancel pending completion request when make a new completion request. (#110) --- clients/vscode/src/TabbyCompletionProvider.ts | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/clients/vscode/src/TabbyCompletionProvider.ts b/clients/vscode/src/TabbyCompletionProvider.ts index 8b668d7..2846a79 100644 --- a/clients/vscode/src/TabbyCompletionProvider.ts +++ b/clients/vscode/src/TabbyCompletionProvider.ts @@ -10,13 +10,14 @@ import { TextDocument, workspace, } from "vscode"; -import { CompletionResponse, EventType, ChoiceEvent, ApiError } from "./generated"; +import { CompletionResponse, EventType, ChoiceEvent, ApiError, CancelablePromise, CancelError } from "./generated"; import { TabbyClient } from "./TabbyClient"; import { sleep } from "./utils"; export class TabbyCompletionProvider implements InlineCompletionItemProvider { private uuid = Date.now(); private latestTimestamp: number = 0; + private pendingCompletion: CancelablePromise | null = null; private tabbyClient = TabbyClient.getInstance(); // User Settings @@ -65,17 +66,25 @@ export class TabbyCompletionProvider implements InlineCompletionItemProvider { } ); - const completion = await this.tabbyClient.api.default.completionsV1CompletionsPost({ + if (this.pendingCompletion) { + this.pendingCompletion.cancel(); + } + this.pendingCompletion = this.tabbyClient.api.default.completionsV1CompletionsPost({ prompt: prompt as string, // Prompt is already nil-checked language: document.languageId, // https://code.visualstudio.com/docs/languages/identifiers - }).then((response: CompletionResponse) => { + }); + + const completion = await this.pendingCompletion.then((response: CompletionResponse) => { this.tabbyClient.changeStatus("ready"); return response; + }).catch((_: CancelError) => { + return null; }).catch((err: ApiError) => { console.error(err); this.tabbyClient.changeStatus("disconnected"); return null; }); + this.pendingCompletion = null; const hasSuffixParen = this.hasSuffixParen(document, position); const replaceRange = hasSuffixParen