mirror of
https://github.com/neovim/neovim.git
synced 2025-10-21 09:12:07 +00:00
refactor(lsp): stateful data abstraction, vim.lsp.Capability #34639
Problem: Closes #31453 Solution: Introduce `vim.lsp.Capability`, which may serve as the base class for all LSP features that require caching data. it - was created if there is at least one client that supports the specific method; - was destroyed if all clients that support the method were detached. - Apply the refactor for `folding_range.lua` and `semantic_tokens.lua`. - Show active features in :checkhealth. Future: I found that these features that are expected to be refactored by `vim.lsp.Capability` have one characteristic in common: they all send LSP requests once the document is modified. The following code is different, but they are all for this purpose. - semantic tokens:fb8dba413f/runtime/lua/vim/lsp/semantic_tokens.lua (L192-L198)
- inlay hints, folding ranges, document colorfb8dba413f/runtime/lua/vim/lsp/inlay_hint.lua (L250-L266)
I think I can sum up this characteristic as the need to keep certain data synchronized with the latest version computed by the server. I believe we can handle this at the `vim.lsp.Capability` level, and I think it will be very useful. Therefore, my next step is to implement LSP request sending and data synchronization on `vim.lsp.Capability`, rather than limiting it to the current create/destroy data approach.
This commit is contained in:
@@ -1082,6 +1082,9 @@ function Client:on_attach(bufnr)
|
||||
if vim.tbl_get(self.server_capabilities, 'semanticTokensProvider', 'full') then
|
||||
lsp.semantic_tokens.start(bufnr, self.id)
|
||||
end
|
||||
if vim.tbl_get(self.server_capabilities, 'foldingRangeProvider') then
|
||||
lsp._folding_range._setup(bufnr)
|
||||
end
|
||||
end)
|
||||
|
||||
self.attached_buffers[bufnr] = true
|
||||
|
Reference in New Issue
Block a user