mirror of
https://github.com/neovim/neovim.git
synced 2025-10-21 09:12:07 +00:00
feat(lsp)!: support multiple clients in goto methods (#30877)
Relates to: - https://github.com/neovim/neovim/issues/30034 - https://github.com/neovim/neovim/issues/17712 - https://github.com/neovim/neovim/issues/16363 Closes: - https://github.com/neovim/neovim/issues/26936 (but only provides bufnr and method) - https://github.com/neovim/neovim/issues/22318 Might fix: https://github.com/neovim/neovim/issues/30737
This commit is contained in:

committed by
GitHub

parent
9b8907d905
commit
0083e03d6f
@@ -5076,6 +5076,86 @@ describe('LSP', function()
|
||||
end)
|
||||
end)
|
||||
|
||||
describe('lsp.buf.definition', function()
|
||||
it('jumps to single location', function()
|
||||
exec_lua(create_server_definition)
|
||||
local result = exec_lua(function()
|
||||
local bufnr = vim.api.nvim_get_current_buf()
|
||||
local server = _G._create_server({
|
||||
capabilities = {
|
||||
definitionProvider = true,
|
||||
},
|
||||
handlers = {
|
||||
['textDocument/definition'] = function(_, _, callback)
|
||||
local location = {
|
||||
range = {
|
||||
start = { line = 0, character = 0 },
|
||||
['end'] = { line = 0, character = 0 },
|
||||
},
|
||||
uri = vim.uri_from_bufnr(bufnr),
|
||||
}
|
||||
callback(nil, location)
|
||||
end,
|
||||
},
|
||||
})
|
||||
local win = vim.api.nvim_get_current_win()
|
||||
vim.api.nvim_buf_set_lines(bufnr, 0, -1, true, { 'local x = 10', '', 'print(x)' })
|
||||
vim.api.nvim_win_set_cursor(win, { 3, 6 })
|
||||
local client_id = assert(vim.lsp.start({ name = 'dummy', cmd = server.cmd }))
|
||||
vim.lsp.buf.definition()
|
||||
vim.lsp.stop_client(client_id)
|
||||
return {
|
||||
cursor = vim.api.nvim_win_get_cursor(win),
|
||||
messages = server.messages,
|
||||
}
|
||||
end)
|
||||
eq('textDocument/definition', result.messages[3].method)
|
||||
eq({ 1, 0 }, result.cursor)
|
||||
end)
|
||||
it('merges results from multiple servers', function()
|
||||
exec_lua(create_server_definition)
|
||||
local result = exec_lua(function()
|
||||
local bufnr = vim.api.nvim_get_current_buf()
|
||||
local function serveropts(character)
|
||||
return {
|
||||
capabilities = {
|
||||
definitionProvider = true,
|
||||
},
|
||||
handlers = {
|
||||
['textDocument/definition'] = function(_, _, callback)
|
||||
local location = {
|
||||
range = {
|
||||
start = { line = 0, character = character },
|
||||
['end'] = { line = 0, character = character },
|
||||
},
|
||||
uri = vim.uri_from_bufnr(bufnr),
|
||||
}
|
||||
callback(nil, location)
|
||||
end,
|
||||
},
|
||||
}
|
||||
end
|
||||
local server1 = _G._create_server(serveropts(0))
|
||||
local server2 = _G._create_server(serveropts(7))
|
||||
local win = vim.api.nvim_get_current_win()
|
||||
vim.api.nvim_buf_set_lines(bufnr, 0, -1, true, { 'local x = 10', '', 'print(x)' })
|
||||
vim.api.nvim_win_set_cursor(win, { 3, 6 })
|
||||
local client_id1 = assert(vim.lsp.start({ name = 'dummy', cmd = server1.cmd }))
|
||||
local client_id2 = assert(vim.lsp.start({ name = 'dummy', cmd = server2.cmd }))
|
||||
local response
|
||||
vim.lsp.buf.definition({
|
||||
on_list = function(r)
|
||||
response = r
|
||||
end,
|
||||
})
|
||||
vim.lsp.stop_client(client_id1)
|
||||
vim.lsp.stop_client(client_id2)
|
||||
return response
|
||||
end)
|
||||
eq(2, #result.items)
|
||||
end)
|
||||
end)
|
||||
|
||||
describe('vim.lsp.tagfunc', function()
|
||||
before_each(function()
|
||||
clear()
|
||||
|
Reference in New Issue
Block a user