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
This commit is contained in:
bobo.yang 2024-04-28 16:27:52 +08:00
parent ddc4396f39
commit 0f63d2771f

View File

@ -55,6 +55,7 @@ export class InlineCompletionProvider implements vscode.InlineCompletionItemProv
private recentEditors: RecentEditsManager; private recentEditors: RecentEditsManager;
private previousCodeComplete: CodeCompleteResult | undefined; private previousCodeComplete: CodeCompleteResult | undefined;
private previousPrefix: string | undefined; private previousPrefix: string | undefined;
private preCompletionItem: vscode.InlineCompletionItem | undefined;
constructor() { constructor() {
// TODO // TODO
@ -210,10 +211,7 @@ export class InlineCompletionProvider implements vscode.InlineCompletionItemProv
if (this.previousPrefix && this.previousCodeComplete && this.previousCodeComplete.code.length > 0) { if (this.previousPrefix && this.previousCodeComplete && this.previousCodeComplete.code.length > 0) {
const index = (this.previousPrefix + this.previousCodeComplete.code).indexOf(linePrefix); const index = (this.previousPrefix + this.previousCodeComplete.code).indexOf(linePrefix);
if (index !== -1) { if (index !== -1) {
response = JSON.parse(JSON.stringify(this.previousCodeComplete)); return [this.preCompletionItem!];
if (response) {
response.code = (this.previousPrefix + this.previousCodeComplete.code).slice(index + linePrefix.length);
}
} }
} }
if (!response) { if (!response) {
@ -283,19 +281,24 @@ export class InlineCompletionProvider implements vscode.InlineCompletionItemProv
this.previousCodeComplete = response; this.previousCodeComplete = response;
this.previousPrefix = linePrefix; this.previousPrefix = linePrefix;
return [ const currentLinePrefix = document.lineAt(position.line).text.slice(0, position.character);
new vscode.InlineCompletionItem( const codeCompleted = currentLinePrefix + response.code;
response.code, const rangeStartPosition = new vscode.Position(position.line, 0);
new vscode.Range(
position, this.preCompletionItem = new vscode.InlineCompletionItem(
rangeEndPosition codeCompleted,
), new vscode.Range(
{ rangeStartPosition,
title: "code complete accept", rangeEndPosition
command: "DevChat.codecomplete_callback",
arguments: [callback],
}
), ),
{
title: "code complete accept",
command: "DevChat.codecomplete_callback",
arguments: [callback],
}
);
return [
this.preCompletionItem
]; ];
} }
} }