mirror of
https://github.com/neovim/neovim
synced 2025-07-16 09:11:51 +00:00
fix(lsp): when prefix is non word add all result into matches (#30044)
Problem: prefix can be a symbol like period, the fuzzy matching can't handle it correctly. Solution: when prefix is empty or a symbol add all lsp completion result into matches.
This commit is contained in:
@ -238,7 +238,7 @@ function M._lsp_to_complete_items(result, prefix, client_id)
|
|||||||
|
|
||||||
---@type fun(item: lsp.CompletionItem):boolean
|
---@type fun(item: lsp.CompletionItem):boolean
|
||||||
local matches
|
local matches
|
||||||
if prefix == '' then
|
if not prefix:find('%w') then
|
||||||
matches = function(_)
|
matches = function(_)
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
|
@ -18,35 +18,36 @@ local create_server_definition = t_lsp.create_server_definition
|
|||||||
---@param candidates lsp.CompletionList|lsp.CompletionItem[]
|
---@param candidates lsp.CompletionList|lsp.CompletionItem[]
|
||||||
---@param lnum? integer 0-based, defaults to 0
|
---@param lnum? integer 0-based, defaults to 0
|
||||||
---@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, server_boundary)
|
||||||
lnum = lnum or 0
|
lnum = lnum or 0
|
||||||
-- nvim_win_get_cursor returns 0 based column, line:find returns 1 based
|
-- nvim_win_get_cursor returns 0 based column, line:find returns 1 based
|
||||||
local cursor_col = line:find('|') - 1
|
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, server_boundary = ...
|
||||||
local line_to_cursor = line:sub(1, cursor_col)
|
local line_to_cursor = line:sub(1, cursor_col)
|
||||||
local client_start_boundary = vim.fn.match(line_to_cursor, '\\k*$')
|
local client_start_boundary = vim.fn.match(line_to_cursor, '\\k*$')
|
||||||
local items, server_start_boundary = require("vim.lsp.completion")._convert_results(
|
local items, new_server_boundary = require("vim.lsp.completion")._convert_results(
|
||||||
line,
|
line,
|
||||||
lnum,
|
lnum,
|
||||||
cursor_col,
|
cursor_col,
|
||||||
1,
|
1,
|
||||||
client_start_boundary,
|
client_start_boundary,
|
||||||
nil,
|
server_boundary,
|
||||||
result,
|
result,
|
||||||
"utf-16"
|
"utf-16"
|
||||||
)
|
)
|
||||||
return {
|
return {
|
||||||
items = items,
|
items = items,
|
||||||
server_start_boundary = server_start_boundary
|
server_start_boundary = new_server_boundary
|
||||||
}
|
}
|
||||||
]],
|
]],
|
||||||
line,
|
line,
|
||||||
cursor_col,
|
cursor_col,
|
||||||
lnum,
|
lnum,
|
||||||
candidates
|
candidates,
|
||||||
|
server_boundary
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -162,6 +163,26 @@ describe('vim.lsp.completion: item conversion', function()
|
|||||||
eq(expected, result)
|
eq(expected, result)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
it('works on non word prefix', function()
|
||||||
|
local completion_list = {
|
||||||
|
{ label = ' foo', insertText = '->foo' },
|
||||||
|
}
|
||||||
|
local result = complete('wp.|', completion_list, 0, 2)
|
||||||
|
local expected = {
|
||||||
|
{
|
||||||
|
abbr = ' foo',
|
||||||
|
word = '->foo',
|
||||||
|
},
|
||||||
|
}
|
||||||
|
result = vim.tbl_map(function(x)
|
||||||
|
return {
|
||||||
|
abbr = x.abbr,
|
||||||
|
word = x.word,
|
||||||
|
}
|
||||||
|
end, result.items)
|
||||||
|
eq(expected, result)
|
||||||
|
end)
|
||||||
|
|
||||||
it('trims trailing newline or tab from textEdit', function()
|
it('trims trailing newline or tab from textEdit', function()
|
||||||
local range0 = {
|
local range0 = {
|
||||||
start = { line = 0, character = 0 },
|
start = { line = 0, character = 0 },
|
||||||
|
Reference in New Issue
Block a user