From 0f63d2771fc93aa9c590beabdfa252bcb254abb4 Mon Sep 17 00:00:00 2001 From: "bobo.yang" Date: Sun, 28 Apr 2024 16:27:52 +0800 Subject: [PATCH] fix: Optimize autocomplete to prevent screen flicker - Added a preCompletionItem to hold the current autocomplete item - Refactored how autocomplete items are returned to prevent flickering - Improved logic to combine current line prefix and response code effectively --- src/contributes/codecomplete/codecomplete.ts | 35 +++++++++++--------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/src/contributes/codecomplete/codecomplete.ts b/src/contributes/codecomplete/codecomplete.ts index 987fdb0..71adc69 100644 --- a/src/contributes/codecomplete/codecomplete.ts +++ b/src/contributes/codecomplete/codecomplete.ts @@ -55,6 +55,7 @@ export class InlineCompletionProvider implements vscode.InlineCompletionItemProv private recentEditors: RecentEditsManager; private previousCodeComplete: CodeCompleteResult | undefined; private previousPrefix: string | undefined; + private preCompletionItem: vscode.InlineCompletionItem | undefined; constructor() { // TODO @@ -210,10 +211,7 @@ export class InlineCompletionProvider implements vscode.InlineCompletionItemProv if (this.previousPrefix && this.previousCodeComplete && this.previousCodeComplete.code.length > 0) { const index = (this.previousPrefix + this.previousCodeComplete.code).indexOf(linePrefix); if (index !== -1) { - response = JSON.parse(JSON.stringify(this.previousCodeComplete)); - if (response) { - response.code = (this.previousPrefix + this.previousCodeComplete.code).slice(index + linePrefix.length); - } + return [this.preCompletionItem!]; } } if (!response) { @@ -283,19 +281,24 @@ export class InlineCompletionProvider implements vscode.InlineCompletionItemProv this.previousCodeComplete = response; this.previousPrefix = linePrefix; - return [ - new vscode.InlineCompletionItem( - response.code, - new vscode.Range( - position, - rangeEndPosition - ), - { - title: "code complete accept", - command: "DevChat.codecomplete_callback", - arguments: [callback], - } + const currentLinePrefix = document.lineAt(position.line).text.slice(0, position.character); + const codeCompleted = currentLinePrefix + response.code; + const rangeStartPosition = new vscode.Position(position.line, 0); + + this.preCompletionItem = new vscode.InlineCompletionItem( + codeCompleted, + new vscode.Range( + rangeStartPosition, + rangeEndPosition ), + { + title: "code complete accept", + command: "DevChat.codecomplete_callback", + arguments: [callback], + } + ); + return [ + this.preCompletionItem ]; } }