fix: Optimize completion hint range detection
- Added a function to check if a substring is a subsequence of another - Improved logic to better determine the completion hint range - Ensures completion suggestions display correctly in edge cases
This commit is contained in:
parent
3b3ad60848
commit
e4bedd9eff
@ -22,6 +22,24 @@ export function registerCodeCompleteCallbackCommand(context: vscode.ExtensionCon
|
|||||||
context.subscriptions.push(disposable);
|
context.subscriptions.push(disposable);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function isSubsequence(sub: string, source: string): boolean {
|
||||||
|
let subIndex = 0; // 子序列字符串的索引
|
||||||
|
let srcIndex = 0; // 源字符串的索引
|
||||||
|
|
||||||
|
// 当子序列和源字符串索引都未超出自身长度时循环
|
||||||
|
while (subIndex < sub.length && srcIndex < source.length) {
|
||||||
|
// 如果找到一个匹配的字符,则移动子序列的索引
|
||||||
|
if (sub[subIndex] === source[srcIndex]) {
|
||||||
|
subIndex++;
|
||||||
|
}
|
||||||
|
// 无论是否找到匹配,源字符串索引始终移动
|
||||||
|
srcIndex++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 如果子序列索引等于子序列长度,说明子序列的所有字符都按顺序在源字符串中找到了
|
||||||
|
return subIndex === sub.length;
|
||||||
|
}
|
||||||
|
|
||||||
interface LogEventRequest {
|
interface LogEventRequest {
|
||||||
completion_id: string;
|
completion_id: string;
|
||||||
type: string; // "view", "select"
|
type: string; // "view", "select"
|
||||||
@ -240,13 +258,21 @@ export class InlineCompletionProvider implements vscode.InlineCompletionItemProv
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// 获取当前行中光标之后的文本内容
|
||||||
|
const lineSuffix = document.lineAt(position.line).text.slice(position.character).trim();
|
||||||
|
const isIncludeLineSuffix = isSubsequence(lineSuffix, response.code.split("\n")[0]);
|
||||||
|
let rangeEndPosition = position.translate(0, response.code.length);
|
||||||
|
if (!isIncludeLineSuffix) {
|
||||||
|
rangeEndPosition = position;
|
||||||
|
}
|
||||||
|
|
||||||
this.lastComplete = response.code;
|
this.lastComplete = response.code;
|
||||||
return [
|
return [
|
||||||
new vscode.InlineCompletionItem(
|
new vscode.InlineCompletionItem(
|
||||||
response.code,
|
response.code,
|
||||||
new vscode.Range(
|
new vscode.Range(
|
||||||
position,
|
position,
|
||||||
position.translate(0, response.code.length)
|
rangeEndPosition
|
||||||
),
|
),
|
||||||
{
|
{
|
||||||
title: "code complete accept",
|
title: "code complete accept",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user