aboutsummaryrefslogtreecommitdiff
path: root/runtime/lua/vim/lsp.lua
diff options
context:
space:
mode:
authorLewis Russell <lewis6991@gmail.com>2024-10-29 09:51:14 +0000
committerGitHub <noreply@github.com>2024-10-29 09:51:14 +0000
commit2cd6abf0d7b1fb0ff71c2cb75913170025f8c915 (patch)
treefe906621455c9070d43fc2095a02e3cfc32c70f4 /runtime/lua/vim/lsp.lua
parent8f9401f5c80a8a72128b8bd8279689daf13f3a04 (diff)
parent8260e4860b27a54a061bd8e2a9da23069993953a (diff)
downloadrneovim-2cd6abf0d7b1fb0ff71c2cb75913170025f8c915.tar.gz
rneovim-2cd6abf0d7b1fb0ff71c2cb75913170025f8c915.tar.bz2
rneovim-2cd6abf0d7b1fb0ff71c2cb75913170025f8c915.zip
Merge pull request #30935 from lewis6991/feat/lsp_multi_hover
Diffstat (limited to 'runtime/lua/vim/lsp.lua')
-rw-r--r--runtime/lua/vim/lsp.lua38
1 files changed, 17 insertions, 21 deletions
diff --git a/runtime/lua/vim/lsp.lua b/runtime/lua/vim/lsp.lua
index a41a3f1585..a8ae283f64 100644
--- a/runtime/lua/vim/lsp.lua
+++ b/runtime/lua/vim/lsp.lua
@@ -916,35 +916,31 @@ end
---
---@param bufnr (integer) Buffer handle, or 0 for current.
---@param method (string) LSP method name
----@param params (table|nil) Parameters to send to the server
----@param handler fun(results: table<integer, {error: lsp.ResponseError?, result: any}>) (function)
+---@param params? table|(fun(client: vim.lsp.Client, bufnr: integer): table?) Parameters to send to the server.
+--- Can also be passed as a function that returns the params table for cases where
+--- parameters are specific to the client.
+---@param handler lsp.MultiHandler (function)
--- Handler called after all requests are completed. Server results are passed as
--- a `client_id:result` map.
---@return function cancel Function that cancels all requests.
function lsp.buf_request_all(bufnr, method, params, handler)
- local results = {} --- @type table<integer,{error: lsp.ResponseError?, result: any}>
- local result_count = 0
- local expected_result_count = 0
-
- local set_expected_result_count = once(function()
- for _, client in ipairs(lsp.get_clients({ bufnr = bufnr })) do
- if client.supports_method(method, { bufnr = bufnr }) then
- expected_result_count = expected_result_count + 1
- end
+ local results = {} --- @type table<integer,{err: lsp.ResponseError?, result: any}>
+ local remaining --- @type integer?
+
+ local _, cancel = lsp.buf_request(bufnr, method, params, function(err, result, ctx, config)
+ if not remaining then
+ -- Calculate as late as possible in case a client is removed during the request
+ remaining = #lsp.get_clients({ bufnr = bufnr, method = method })
end
- end)
- local function _sync_handler(err, result, ctx)
- results[ctx.client_id] = { error = err, result = result }
- result_count = result_count + 1
- set_expected_result_count()
+ -- The error key is deprecated and will be removed in 0.13
+ results[ctx.client_id] = { err = err, error = err, result = result }
+ remaining = remaining - 1
- if result_count >= expected_result_count then
- handler(results)
+ if remaining == 0 then
+ handler(results, ctx, config)
end
- end
-
- local _, cancel = lsp.buf_request(bufnr, method, params, _sync_handler)
+ end)
return cancel
end