Skip to content
  • Sean Dewar's avatar
    cc87dda3
    fix(lsp): do not assume client capability exists in watchfiles check (#24550) · cc87dda3
    Sean Dewar authored
    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).
    cc87dda3
    fix(lsp): do not assume client capability exists in watchfiles check (#24550)
    Sean Dewar authored
    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).
Loading