From 317c80f460a7826421f40f57ee8bdbd736b0f225 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathias=20Fu=C3=9Fenegger?= Date: Wed, 12 Jul 2023 14:48:21 +0200 Subject: [PATCH] feat(lsp): add method filter to get_active_clients (#24319) --- runtime/doc/lsp.txt | 2 ++ runtime/lua/vim/lsp.lua | 3 +++ runtime/lua/vim/lsp/buf.lua | 28 +++++++++++----------------- 3 files changed, 16 insertions(+), 17 deletions(-) diff --git a/runtime/doc/lsp.txt b/runtime/doc/lsp.txt index 4bafb622a6..3aef5bb7dd 100644 --- a/runtime/doc/lsp.txt +++ b/runtime/doc/lsp.txt @@ -780,6 +780,8 @@ get_active_clients({filter}) *vim.lsp.get_active_clients()* • bufnr (number): Only return clients attached to this buffer • name (string): Only return clients with the given name + • method (string): Only return clients supporting the given + method Return: ~ lsp.Client []: List of |vim.lsp.client| objects diff --git a/runtime/lua/vim/lsp.lua b/runtime/lua/vim/lsp.lua index ed431e080e..1f9b6c4360 100644 --- a/runtime/lua/vim/lsp.lua +++ b/runtime/lua/vim/lsp.lua @@ -1995,6 +1995,7 @@ end ---@field id integer|nil Match clients by id ---@field bufnr integer|nil match clients attached to the given buffer ---@field name string|nil match clients by name +---@field method string|nil match client by supported method name --- Get active clients. --- @@ -2004,6 +2005,7 @@ end --- - id (number): Only return clients with the given id --- - bufnr (number): Only return clients attached to this buffer --- - name (string): Only return clients with the given name +--- - method (string): Only return clients supporting the given method ---@return lsp.Client[]: List of |vim.lsp.client| objects function lsp.get_active_clients(filter) validate({ filter = { filter, 't', true } }) @@ -2020,6 +2022,7 @@ function lsp.get_active_clients(filter) client and (filter.id == nil or client.id == filter.id) and (filter.name == nil or client.name == filter.name) + and (filter.method == nil or client.supports_method(filter.method, { bufnr = filter.bufnr })) then clients[#clients + 1] = client end diff --git a/runtime/lua/vim/lsp/buf.lua b/runtime/lua/vim/lsp/buf.lua index 8ae0e0cde3..b238b5c221 100644 --- a/runtime/lua/vim/lsp/buf.lua +++ b/runtime/lua/vim/lsp/buf.lua @@ -197,15 +197,6 @@ end function M.format(options) options = options or {} local bufnr = options.bufnr or api.nvim_get_current_buf() - local clients = vim.lsp.get_active_clients({ - id = options.id, - bufnr = bufnr, - name = options.name, - }) - - if options.filter then - clients = vim.tbl_filter(options.filter, clients) - end local mode = api.nvim_get_mode().mode local range = options.range @@ -214,9 +205,15 @@ function M.format(options) end local method = range and 'textDocument/rangeFormatting' or 'textDocument/formatting' - clients = vim.tbl_filter(function(client) - return client.supports_method(method) - end, clients) + local clients = vim.lsp.get_active_clients({ + id = options.id, + bufnr = bufnr, + name = options.name, + method = method, + }) + if options.filter then + clients = vim.tbl_filter(options.filter, clients) + end if #clients == 0 then vim.notify('[LSP] Format request failed, no matching language servers.') @@ -277,16 +274,13 @@ function M.rename(new_name, options) local clients = vim.lsp.get_active_clients({ bufnr = bufnr, name = options.name, + -- Clients must at least support rename, prepareRename is optional + method = 'textDocument/rename', }) if options.filter then clients = vim.tbl_filter(options.filter, clients) end - -- Clients must at least support rename, prepareRename is optional - clients = vim.tbl_filter(function(client) - return client.supports_method('textDocument/rename') - end, clients) - if #clients == 0 then vim.notify('[LSP] Rename, no matching language servers with rename capability.') end