commit 81d8198bda0f5651de36f7587589ec1165c48843
parent a7fef170b73f0254b6396e0945209624561eee49
Author: Yi Ming <ofseed@foxmail.com>
Date: Mon, 21 Jul 2025 12:55:47 +0800
refactor(lsp): define `Capability.on_attach`
Diffstat:
3 files changed, 20 insertions(+), 6 deletions(-)
diff --git a/runtime/lua/vim/lsp/_capability.lua b/runtime/lua/vim/lsp/_capability.lua
@@ -69,6 +69,16 @@ function M:destroy()
self.active[self.bufnr] = nil
end
+--- Callback invoked when an LSP client attaches.
+--- Use it to initialize per-client state (empty table, new namespaces, etc.),
+--- or issue requests as needed.
+---@param client_id integer
+function M:on_attach(client_id)
+ self.client_state[client_id] = {}
+end
+
+--- Callback invoked when an LSP client detaches.
+--- Use it to clear per-client state (cached data, extmarks, etc.).
---@param client_id integer
function M:on_detach(client_id)
self.client_state[client_id] = nil
diff --git a/runtime/lua/vim/lsp/_folding_range.lua b/runtime/lua/vim/lsp/_folding_range.lua
@@ -265,6 +265,11 @@ function State:destroy()
State.active[self.bufnr] = nil
end
+---@param client_id integer
+function State:on_attach(client_id)
+ self:refresh(vim.lsp.get_client_by_id(client_id))
+end
+
---@params client_id integer
function State:on_detach(client_id)
self.client_state[client_id] = nil
@@ -273,14 +278,13 @@ function State:on_detach(client_id)
end
---@param bufnr integer
----@param client_id? integer
+---@param client_id integer
function M._setup(bufnr, client_id)
local state = State.active[bufnr]
if not state then
state = State:new(bufnr)
end
-
- state:refresh(client_id and vim.lsp.get_client_by_id(client_id))
+ state:on_attach(client_id)
end
---@param kind lsp.FoldingRangeKind
diff --git a/runtime/lua/vim/lsp/semantic_tokens.lua b/runtime/lua/vim/lsp/semantic_tokens.lua
@@ -201,6 +201,9 @@ function STHighlighter:on_attach(client_id)
}
self.client_state[client_id] = state
end
+ if M.is_enabled({ bufnr = self.bufnr }) then
+ self:send_request()
+ end
end
---@package
@@ -581,9 +584,6 @@ function M._start(bufnr, client_id, debounce)
end
highlighter:on_attach(client_id)
- if M.is_enabled({ bufnr = bufnr }) then
- highlighter:send_request()
- end
end
--- Start the semantic token highlighting engine for the given buffer with the