diff options
author | Chris AtLee <chris.atlee@shopify.com> | 2023-08-31 04:00:24 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-08-31 10:00:24 +0200 |
commit | c235959fd909d75248c066a781475e207606c5aa (patch) | |
tree | 340f439aa9c6cc533cc33e14439acc473662c35e /runtime/lua/vim/lsp/util.lua | |
parent | ee56daebb6468075e743db0d605cb3f2a1699419 (diff) | |
download | rneovim-c235959fd909d75248c066a781475e207606c5aa.tar.gz rneovim-c235959fd909d75248c066a781475e207606c5aa.tar.bz2 rneovim-c235959fd909d75248c066a781475e207606c5aa.zip |
fix(lsp): only disable inlay hints / diagnostics if no other clients are connected (#24535)
This fixes the issue where the LspNotify handlers for inlay_hint /
diagnostics would end up refreshing all attached clients.
The handler would call util._refresh, which called
vim.lsp.buf_request, which calls the method on all attached clients.
Now util._refresh takes an optional client_id parameter, which is used
to specify a specific client to update.
This commit also fixes util._refresh's handling of the `only_visible`
flag. Previously if `only_visible` was false, two requests would be made
to the server: one for the visible region, and one for the entire file.
Co-authored-by: Stanislav Asunkin <1353637+stasjok@users.noreply.github.com>
Co-authored-by: Mathias Fußenegger <mfussenegger@users.noreply.github.com>
Diffstat (limited to 'runtime/lua/vim/lsp/util.lua')
-rw-r--r-- | runtime/lua/vim/lsp/util.lua | 53 |
1 files changed, 35 insertions, 18 deletions
diff --git a/runtime/lua/vim/lsp/util.lua b/runtime/lua/vim/lsp/util.lua index 633cddca2d..2e376f9093 100644 --- a/runtime/lua/vim/lsp/util.lua +++ b/runtime/lua/vim/lsp/util.lua @@ -2122,6 +2122,7 @@ end function M.make_workspace_params(added, removed) return { event = { added = added, removed = removed } } end + --- Returns indentation size. --- ---@see 'shiftwidth' @@ -2192,32 +2193,46 @@ end ---@private --- Request updated LSP information for a buffer. --- +---@class lsp.util.RefreshOptions +---@field bufnr integer? Buffer to refresh (default: 0) +---@field only_visible? boolean Whether to only refresh for the visible regions of the buffer (default: false) +---@field client_id? integer Client ID to refresh (default: all clients) +-- ---@param method string LSP method to call ----@param opts (nil|table) Optional arguments ---- - bufnr (integer, default: 0): Buffer to refresh ---- - only_visible (boolean, default: false): Whether to only refresh for the visible regions of the buffer +---@param opts? lsp.util.RefreshOptions Options table function M._refresh(method, opts) opts = opts or {} local bufnr = opts.bufnr if bufnr == nil or bufnr == 0 then bufnr = api.nvim_get_current_buf() end + + local clients = vim.lsp.get_clients({ bufnr = bufnr, method = method, id = opts.client_id }) + + if #clients == 0 then + return + end + local only_visible = opts.only_visible or false - for _, window in ipairs(api.nvim_list_wins()) do - if api.nvim_win_get_buf(window) == bufnr then - local first = vim.fn.line('w0', window) - local last = vim.fn.line('w$', window) - local params = { - textDocument = M.make_text_document_params(bufnr), - range = { - start = { line = first - 1, character = 0 }, - ['end'] = { line = last, character = 0 }, - }, - } - vim.lsp.buf_request(bufnr, method, params) + + if only_visible then + for _, window in ipairs(api.nvim_list_wins()) do + if api.nvim_win_get_buf(window) == bufnr then + local first = vim.fn.line('w0', window) + local last = vim.fn.line('w$', window) + local params = { + textDocument = M.make_text_document_params(bufnr), + range = { + start = { line = first - 1, character = 0 }, + ['end'] = { line = last, character = 0 }, + }, + } + for _, client in ipairs(clients) do + client.request(method, params, nil, bufnr) + end + end end - end - if not only_visible then + else local params = { textDocument = M.make_text_document_params(bufnr), range = { @@ -2225,7 +2240,9 @@ function M._refresh(method, opts) ['end'] = { line = api.nvim_buf_line_count(bufnr), character = 0 }, }, } - vim.lsp.buf_request(bufnr, method, params) + for _, client in ipairs(clients) do + client.request(method, params, nil, bufnr) + end end end |