mirror of
https://github.com/neovim/neovim.git
synced 2025-10-21 17:21:49 +00:00
fix(lsp): do not assume client capability exists in watchfiles check (#24550)
PR #23689 assumes `client.config.capabilities.workspace.didChangeWatchedFiles` exists when checking `dynamicRegistration`, but thats's true only if it was passed to `vim.lsp.start{_client}`. This caused #23806 (still an issue in v0.9.1; needs manual backport), but #23681 fixed it by defaulting `config.capabilities` to `make_client_capabilities` if not passed to `vim.lsp.start{_client}`. However, the bug resurfaces on HEAD if you provide a non-nil `capabilities` to `vim.lsp.start{_client}` with missing fields (e.g: not made via `make_client_capabilities`). From what I see, the spec says such missing fields should be interpreted as an absence of the capability (including those indicated by missing sub-fields): https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#clientCapabilities Also, suggest `vim.empty_dict()` for an empty dict in `:h vim.lsp.start_client()` (`{[vim.type_idx]=vim.types.dictionary}` no longer works anyway, probably since the cjson switch).
This commit is contained in:
@@ -121,12 +121,15 @@ M._poll_exclude_pattern = parse('**/.git/{objects,subtree-cache}/**')
|
||||
function M.register(reg, ctx)
|
||||
local client_id = ctx.client_id
|
||||
local client = vim.lsp.get_client_by_id(client_id)
|
||||
if
|
||||
-- Ill-behaved servers may not honor the client capability and try to register
|
||||
-- anyway, so ignore requests when the user has opted out of the feature.
|
||||
not client.config.capabilities.workspace.didChangeWatchedFiles.dynamicRegistration
|
||||
or not client.workspace_folders
|
||||
then
|
||||
-- Ill-behaved servers may not honor the client capability and try to register
|
||||
-- anyway, so ignore requests when the user has opted out of the feature.
|
||||
local has_capability = vim.tbl_get(
|
||||
client.config.capabilities or {},
|
||||
'workspace',
|
||||
'didChangeWatchedFiles',
|
||||
'dynamicRegistration'
|
||||
)
|
||||
if not has_capability or not client.workspace_folders then
|
||||
return
|
||||
end
|
||||
local watch_regs = {} --- @type table<string,{pattern:userdata,kind:integer}>
|
||||
|
Reference in New Issue
Block a user