diff options
author | Lewis Russell <lewis6991@gmail.com> | 2024-10-24 16:44:09 +0100 |
---|---|---|
committer | Lewis Russell <lewis6991@gmail.com> | 2024-10-29 09:06:05 +0000 |
commit | 1471dfc85964a9d95c216619d715bfe449d97c19 (patch) | |
tree | f3eec1e84269a94463450694cf49288375dc8ecc /runtime/lua/vim | |
parent | 54249d051c3e0b97321939e6a3ae3d2e83971ce7 (diff) | |
download | rneovim-1471dfc85964a9d95c216619d715bfe449d97c19.tar.gz rneovim-1471dfc85964a9d95c216619d715bfe449d97c19.tar.bz2 rneovim-1471dfc85964a9d95c216619d715bfe449d97c19.zip |
refactor(lsp): buf_request_all
Diffstat (limited to 'runtime/lua/vim')
-rw-r--r-- | runtime/lua/vim/lsp.lua | 36 |
1 files changed, 15 insertions, 21 deletions
diff --git a/runtime/lua/vim/lsp.lua b/runtime/lua/vim/lsp.lua index 4f13ad5721..4065785c5a 100644 --- a/runtime/lua/vim/lsp.lua +++ b/runtime/lua/vim/lsp.lua @@ -915,35 +915,29 @@ 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 +---@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 |