aboutsummaryrefslogtreecommitdiff
path: root/runtime/lua/vim/lsp/handlers.lua
diff options
context:
space:
mode:
authorFolke Lemaitre <folke.lemaitre@gmail.com>2023-05-28 07:51:28 +0200
committerGitHub <noreply@github.com>2023-05-28 07:51:28 +0200
commitddd92a70d2aab5247895e89abaaa79c62ba7dbb4 (patch)
tree12d216a7fbc41d7f70dfefa3148f84435d1cd41b /runtime/lua/vim/lsp/handlers.lua
parente41b2e34b46a806b0fc59914263f8f4af9ac62f1 (diff)
downloadrneovim-ddd92a70d2aab5247895e89abaaa79c62ba7dbb4.tar.gz
rneovim-ddd92a70d2aab5247895e89abaaa79c62ba7dbb4.tar.bz2
rneovim-ddd92a70d2aab5247895e89abaaa79c62ba7dbb4.zip
feat(lsp): initial support for dynamic capabilities (#23681)
- `client.dynamic_capabilities` is an object that tracks client register/unregister - `client.supports_method` will additionally check if a dynamic capability supports the method, taking document filters into account. But only if the client enabled `dynamicRegistration` for the capability - updated the default client capabilities to include dynamicRegistration for: - formatting - rangeFormatting - hover - codeAction - hover - rename
Diffstat (limited to 'runtime/lua/vim/lsp/handlers.lua')
-rw-r--r--runtime/lua/vim/lsp/handlers.lua28
1 files changed, 20 insertions, 8 deletions
diff --git a/runtime/lua/vim/lsp/handlers.lua b/runtime/lua/vim/lsp/handlers.lua
index 8e926c4644..5346160871 100644
--- a/runtime/lua/vim/lsp/handlers.lua
+++ b/runtime/lua/vim/lsp/handlers.lua
@@ -118,22 +118,30 @@ end
--see: https://microsoft.github.io/language-server-protocol/specifications/specification-current/#client_registerCapability
M['client/registerCapability'] = function(_, result, ctx)
- local log_unsupported = false
+ local client_id = ctx.client_id
+ ---@type lsp.Client
+ local client = vim.lsp.get_client_by_id(client_id)
+
+ client.dynamic_capabilities:register(result.registrations)
+ for bufnr, _ in ipairs(client.attached_buffers) do
+ vim.lsp._set_defaults(client, bufnr)
+ end
+
+ ---@type string[]
+ local unsupported = {}
for _, reg in ipairs(result.registrations) do
if reg.method == 'workspace/didChangeWatchedFiles' then
require('vim.lsp._watchfiles').register(reg, ctx)
- else
- log_unsupported = true
+ elseif not client.dynamic_capabilities:supports_registration(reg.method) then
+ unsupported[#unsupported + 1] = reg.method
end
end
- if log_unsupported then
- local client_id = ctx.client_id
+ if #unsupported > 0 then
local warning_tpl = 'The language server %s triggers a registerCapability '
- .. 'handler despite dynamicRegistration set to false. '
+ .. 'handler for %s despite dynamicRegistration set to false. '
.. 'Report upstream, this warning is harmless'
- local client = vim.lsp.get_client_by_id(client_id)
local client_name = client and client.name or string.format('id=%d', client_id)
- local warning = string.format(warning_tpl, client_name)
+ local warning = string.format(warning_tpl, client_name, table.concat(unsupported, ', '))
log.warn(warning)
end
return vim.NIL
@@ -141,6 +149,10 @@ end
--see: https://microsoft.github.io/language-server-protocol/specifications/specification-current/#client_unregisterCapability
M['client/unregisterCapability'] = function(_, result, ctx)
+ local client_id = ctx.client_id
+ local client = vim.lsp.get_client_by_id(client_id)
+ client.dynamic_capabilities:unregister(result.unregisterations)
+
for _, unreg in ipairs(result.unregisterations) do
if unreg.method == 'workspace/didChangeWatchedFiles' then
require('vim.lsp._watchfiles').unregister(unreg, ctx)