aboutsummaryrefslogtreecommitdiff
path: root/runtime/lua/vim/lsp/buf.lua
diff options
context:
space:
mode:
authorMathias Fussenegger <f.mathias@zignar.net>2024-10-08 19:04:28 +0200
committerMathias Fußenegger <mfussenegger@users.noreply.github.com>2024-10-20 14:43:22 +0200
commitdff684fdb3d2e787ac6d6fd49ec52ede604fd0ce (patch)
tree01bde7b45b183b771f1bfae5b436584cf95cc4b6 /runtime/lua/vim/lsp/buf.lua
parentce9a9b4700262fb50312720bfdffbebfc7d8ef7a (diff)
downloadrneovim-dff684fdb3d2e787ac6d6fd49ec52ede604fd0ce.tar.gz
rneovim-dff684fdb3d2e787ac6d6fd49ec52ede604fd0ce.tar.bz2
rneovim-dff684fdb3d2e787ac6d6fd49ec52ede604fd0ce.zip
feat(lsp)!: support multiple clients in lsp.buf.references
Relates to: - https://github.com/neovim/neovim/issues/17712 - https://github.com/neovim/neovim/issues/30034
Diffstat (limited to 'runtime/lua/vim/lsp/buf.lua')
-rw-r--r--runtime/lua/vim/lsp/buf.lua58
1 files changed, 53 insertions, 5 deletions
diff --git a/runtime/lua/vim/lsp/buf.lua b/runtime/lua/vim/lsp/buf.lua
index f6837a627f..8803c0495a 100644
--- a/runtime/lua/vim/lsp/buf.lua
+++ b/runtime/lua/vim/lsp/buf.lua
@@ -438,11 +438,59 @@ end
---@param opts? vim.lsp.ListOpts
function M.references(context, opts)
validate('context', context, 'table', true)
- local params = util.make_position_params()
- params.context = context or {
- includeDeclaration = true,
- }
- request_with_opts(ms.textDocument_references, params, opts)
+ local clients = vim.lsp.get_clients({ method = ms.textDocument_references })
+ if not next(clients) then
+ return
+ end
+ local win = api.nvim_get_current_win()
+ local bufnr = api.nvim_get_current_buf()
+ opts = opts or {}
+
+ local all_items = {}
+ local title = 'References'
+
+ local function on_done()
+ if not next(all_items) then
+ vim.notify('No references found')
+ else
+ local list = {
+ title = title,
+ items = all_items,
+ context = {
+ method = ms.textDocument_references,
+ bufnr = bufnr,
+ },
+ }
+ if opts.loclist then
+ vim.fn.setloclist(0, {}, ' ', list)
+ vim.cmd.lopen()
+ elseif opts.on_list then
+ assert(vim.is_callable(opts.on_list), 'on_list is not a function')
+ opts.on_list(list)
+ else
+ vim.fn.setqflist({}, ' ', list)
+ vim.cmd('botright copen')
+ end
+ end
+ end
+
+ local remaining = #clients
+ for _, client in ipairs(clients) do
+ local params = util.make_position_params(win, client.offset_encoding)
+
+ ---@diagnostic disable-next-line: inject-field
+ params.context = context or {
+ includeDeclaration = true,
+ }
+ client.request(ms.textDocument_references, params, function(_, result)
+ local items = util.locations_to_items(result or {}, client.offset_encoding)
+ vim.list_extend(all_items, items)
+ remaining = remaining - 1
+ if remaining == 0 then
+ on_done()
+ end
+ end)
+ end
end
--- Lists all symbols in the current buffer in the quickfix window.