fix(lsp): fix omnicomplete in middle of the line (#25787)

Fixes a regression from 5e5f5174e3

Until that commit we had a logic like this:
`local prefix = startbyte and line:sub(startbyte + 1) or line_to_cursor:sub(word_boundary)`

The commit changed the logic and no longer cut off the line at the cursor,  resulting in a prefix that included trailing characters
This commit is contained in:
Lajos Koszti 2023-10-26 22:40:36 +02:00 committed by GitHub
parent 15983cf2c6
commit ba6761eafe
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 60 additions and 2 deletions

View File

@ -137,6 +137,7 @@ end
function M._convert_results(
line,
lnum,
cursor_col,
client_start_boundary,
server_start_boundary,
result,
@ -164,7 +165,7 @@ function M._convert_results(
elseif curstartbyte ~= nil and curstartbyte ~= server_start_boundary then
server_start_boundary = client_start_boundary
end
local prefix = line:sub((server_start_boundary or client_start_boundary) + 1)
local prefix = line:sub((server_start_boundary or client_start_boundary) + 1, cursor_col)
local matches = M._lsp_to_complete_items(result, prefix)
return matches, server_start_boundary
end
@ -212,6 +213,7 @@ function M.omnifunc(findstart, base)
matches, server_start_boundary = M._convert_results(
line,
lnum,
cursor_col,
client_start_boundary,
server_start_boundary,
result,

View File

@ -12,7 +12,8 @@ local exec_lua = helpers.exec_lua
---@return {items: table[], server_start_boundary: integer?}
local function complete(line, candidates, lnum)
lnum = lnum or 0
local cursor_col = line:find("|")
-- nvim_win_get_cursor returns 0 based column, line:find returns 1 based
local cursor_col = line:find("|") - 1
line = line:gsub("|", "")
return exec_lua([[
local line, cursor_col, lnum, result = ...
@ -21,6 +22,7 @@ local function complete(line, candidates, lnum)
local items, server_start_boundary = require("vim.lsp._completion")._convert_results(
line,
lnum,
cursor_col,
client_start_boundary,
nil,
result,
@ -180,4 +182,58 @@ describe("vim.lsp._completion", function()
item.user_data = nil
eq(expected, item)
end)
it("should search from start boundary to cursor position", function()
local completion_list = {
isIncomplete = false,
items = {
{
filterText = "this_thread",
insertText = "this_thread",
insertTextFormat = 1,
kind = 9,
label = " this_thread",
score = 1.3205767869949,
sortText = "4056f757this_thread",
textEdit = {
newText = "this_thread",
range = {
start = { line = 0, character = 7 },
["end"] = { line = 0, character = 11 },
},
}
},
{
filterText = "notthis_thread",
insertText = "notthis_thread",
insertTextFormat = 1,
kind = 9,
label = " notthis_thread",
score = 1.3205767869949,
sortText = "4056f757this_thread",
textEdit = {
newText = "notthis_thread",
range = {
start = { line = 0, character = 7 },
["end"] = { line = 0, character = 11 },
},
}
},
}
}
local expected = {
abbr = ' this_thread',
dup = 1,
empty = 1,
icase = 1,
kind = 'Module',
menu = '',
word = 'this_thread',
}
local result = complete(" std::this|is", completion_list)
eq(1, #result.items)
local item = result.items[1]
item.user_data = nil
eq(expected, item)
end)
end)