mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
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:
parent
15983cf2c6
commit
ba6761eafe
@ -137,6 +137,7 @@ end
|
|||||||
function M._convert_results(
|
function M._convert_results(
|
||||||
line,
|
line,
|
||||||
lnum,
|
lnum,
|
||||||
|
cursor_col,
|
||||||
client_start_boundary,
|
client_start_boundary,
|
||||||
server_start_boundary,
|
server_start_boundary,
|
||||||
result,
|
result,
|
||||||
@ -164,7 +165,7 @@ function M._convert_results(
|
|||||||
elseif curstartbyte ~= nil and curstartbyte ~= server_start_boundary then
|
elseif curstartbyte ~= nil and curstartbyte ~= server_start_boundary then
|
||||||
server_start_boundary = client_start_boundary
|
server_start_boundary = client_start_boundary
|
||||||
end
|
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)
|
local matches = M._lsp_to_complete_items(result, prefix)
|
||||||
return matches, server_start_boundary
|
return matches, server_start_boundary
|
||||||
end
|
end
|
||||||
@ -212,6 +213,7 @@ function M.omnifunc(findstart, base)
|
|||||||
matches, server_start_boundary = M._convert_results(
|
matches, server_start_boundary = M._convert_results(
|
||||||
line,
|
line,
|
||||||
lnum,
|
lnum,
|
||||||
|
cursor_col,
|
||||||
client_start_boundary,
|
client_start_boundary,
|
||||||
server_start_boundary,
|
server_start_boundary,
|
||||||
result,
|
result,
|
||||||
|
@ -12,7 +12,8 @@ local exec_lua = helpers.exec_lua
|
|||||||
---@return {items: table[], server_start_boundary: integer?}
|
---@return {items: table[], server_start_boundary: integer?}
|
||||||
local function complete(line, candidates, lnum)
|
local function complete(line, candidates, lnum)
|
||||||
lnum = lnum or 0
|
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("|", "")
|
line = line:gsub("|", "")
|
||||||
return exec_lua([[
|
return exec_lua([[
|
||||||
local line, cursor_col, lnum, result = ...
|
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(
|
local items, server_start_boundary = require("vim.lsp._completion")._convert_results(
|
||||||
line,
|
line,
|
||||||
lnum,
|
lnum,
|
||||||
|
cursor_col,
|
||||||
client_start_boundary,
|
client_start_boundary,
|
||||||
nil,
|
nil,
|
||||||
result,
|
result,
|
||||||
@ -180,4 +182,58 @@ describe("vim.lsp._completion", function()
|
|||||||
item.user_data = nil
|
item.user_data = nil
|
||||||
eq(expected, item)
|
eq(expected, item)
|
||||||
end)
|
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)
|
end)
|
||||||
|
Loading…
Reference in New Issue
Block a user