diff options
author | Lewis Russell <lewis6991@gmail.com> | 2024-10-29 09:51:14 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-10-29 09:51:14 +0000 |
commit | 2cd6abf0d7b1fb0ff71c2cb75913170025f8c915 (patch) | |
tree | fe906621455c9070d43fc2095a02e3cfc32c70f4 /runtime/lua/vim/lsp.lua | |
parent | 8f9401f5c80a8a72128b8bd8279689daf13f3a04 (diff) | |
parent | 8260e4860b27a54a061bd8e2a9da23069993953a (diff) | |
download | rneovim-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.lua | 38 |
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 |