mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
fix(lsp): clear codelens on LspDetach (#24903)
Also fix incorrect parameters in on_detach callback.
This commit is contained in:
parent
f246cf029f
commit
8bd6f7c20b
@ -1430,7 +1430,7 @@ display({lenses}, {bufnr}, {client_id}) *vim.lsp.codelens.display()*
|
|||||||
Display the lenses using virtual text
|
Display the lenses using virtual text
|
||||||
|
|
||||||
Parameters: ~
|
Parameters: ~
|
||||||
• {lenses} (table) of lenses to display (`CodeLens[] | null`)
|
• {lenses} lsp.CodeLens[]|nil lenses to display
|
||||||
• {bufnr} (integer)
|
• {bufnr} (integer)
|
||||||
• {client_id} (integer)
|
• {client_id} (integer)
|
||||||
|
|
||||||
@ -1442,7 +1442,7 @@ get({bufnr}) *vim.lsp.codelens.get()*
|
|||||||
buffer.
|
buffer.
|
||||||
|
|
||||||
Return: ~
|
Return: ~
|
||||||
(table) (`CodeLens[]`)
|
lsp.CodeLens[]
|
||||||
|
|
||||||
*vim.lsp.codelens.on_codelens()*
|
*vim.lsp.codelens.on_codelens()*
|
||||||
on_codelens({err}, {result}, {ctx}, {_})
|
on_codelens({err}, {result}, {ctx}, {_})
|
||||||
@ -1464,7 +1464,7 @@ save({lenses}, {bufnr}, {client_id}) *vim.lsp.codelens.save()*
|
|||||||
Store lenses for a specific buffer and client
|
Store lenses for a specific buffer and client
|
||||||
|
|
||||||
Parameters: ~
|
Parameters: ~
|
||||||
• {lenses} (table) of lenses to store (`CodeLens[] | null`)
|
• {lenses} lsp.CodeLens[]|nil lenses to store
|
||||||
• {bufnr} (integer)
|
• {bufnr} (integer)
|
||||||
• {client_id} (integer)
|
• {client_id} (integer)
|
||||||
|
|
||||||
|
@ -8,6 +8,7 @@ local M = {}
|
|||||||
--- to throttle refreshes to at most one at a time
|
--- to throttle refreshes to at most one at a time
|
||||||
local active_refreshes = {}
|
local active_refreshes = {}
|
||||||
|
|
||||||
|
---@type table<integer, table<integer, lsp.CodeLens[]>>
|
||||||
--- bufnr -> client_id -> lenses
|
--- bufnr -> client_id -> lenses
|
||||||
local lens_cache_by_buf = setmetatable({}, {
|
local lens_cache_by_buf = setmetatable({}, {
|
||||||
__index = function(t, b)
|
__index = function(t, b)
|
||||||
@ -16,6 +17,8 @@ local lens_cache_by_buf = setmetatable({}, {
|
|||||||
end,
|
end,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
---@type table<integer, integer>
|
||||||
|
---client_id -> namespace
|
||||||
local namespaces = setmetatable({}, {
|
local namespaces = setmetatable({}, {
|
||||||
__index = function(t, key)
|
__index = function(t, key)
|
||||||
local value = api.nvim_create_namespace('vim_lsp_codelens:' .. key)
|
local value = api.nvim_create_namespace('vim_lsp_codelens:' .. key)
|
||||||
@ -27,6 +30,18 @@ local namespaces = setmetatable({}, {
|
|||||||
---@private
|
---@private
|
||||||
M.__namespaces = namespaces
|
M.__namespaces = namespaces
|
||||||
|
|
||||||
|
local augroup = api.nvim_create_augroup('vim_lsp_codelens', {})
|
||||||
|
|
||||||
|
api.nvim_create_autocmd('LspDetach', {
|
||||||
|
group = augroup,
|
||||||
|
callback = function(ev)
|
||||||
|
M.clear(ev.data.client_id, ev.buf)
|
||||||
|
end,
|
||||||
|
})
|
||||||
|
|
||||||
|
---@param lens lsp.CodeLens
|
||||||
|
---@param bufnr integer
|
||||||
|
---@param client_id integer
|
||||||
local function execute_lens(lens, bufnr, client_id)
|
local function execute_lens(lens, bufnr, client_id)
|
||||||
local line = lens.range.start.line
|
local line = lens.range.start.line
|
||||||
api.nvim_buf_clear_namespace(bufnr, namespaces[client_id], line, line + 1)
|
api.nvim_buf_clear_namespace(bufnr, namespaces[client_id], line, line + 1)
|
||||||
@ -42,7 +57,7 @@ end
|
|||||||
--- Return all lenses for the given buffer
|
--- Return all lenses for the given buffer
|
||||||
---
|
---
|
||||||
---@param bufnr integer Buffer number. 0 can be used for the current buffer.
|
---@param bufnr integer Buffer number. 0 can be used for the current buffer.
|
||||||
---@return table (`CodeLens[]`)
|
---@return lsp.CodeLens[]
|
||||||
function M.get(bufnr)
|
function M.get(bufnr)
|
||||||
local lenses_by_client = lens_cache_by_buf[bufnr or 0]
|
local lenses_by_client = lens_cache_by_buf[bufnr or 0]
|
||||||
if not lenses_by_client then
|
if not lenses_by_client then
|
||||||
@ -98,12 +113,17 @@ end
|
|||||||
---@param client_id integer|nil filter by client_id. All clients if nil
|
---@param client_id integer|nil filter by client_id. All clients if nil
|
||||||
---@param bufnr integer|nil filter by buffer. All buffers if nil
|
---@param bufnr integer|nil filter by buffer. All buffers if nil
|
||||||
function M.clear(client_id, bufnr)
|
function M.clear(client_id, bufnr)
|
||||||
local buffers = bufnr and { resolve_bufnr(bufnr) } or vim.tbl_keys(lens_cache_by_buf)
|
bufnr = bufnr and resolve_bufnr(bufnr)
|
||||||
|
local buffers = bufnr and { bufnr }
|
||||||
|
or vim.tbl_filter(api.nvim_buf_is_loaded, api.nvim_list_bufs())
|
||||||
for _, iter_bufnr in pairs(buffers) do
|
for _, iter_bufnr in pairs(buffers) do
|
||||||
local client_ids = client_id and { client_id } or vim.tbl_keys(namespaces)
|
local client_ids = client_id and { client_id } or vim.tbl_keys(namespaces)
|
||||||
for _, iter_client_id in pairs(client_ids) do
|
for _, iter_client_id in pairs(client_ids) do
|
||||||
local ns = namespaces[iter_client_id]
|
local ns = namespaces[iter_client_id]
|
||||||
lens_cache_by_buf[iter_bufnr][iter_client_id] = {}
|
-- there can be display()ed lenses, which are not stored in cache
|
||||||
|
if lens_cache_by_buf[iter_bufnr] then
|
||||||
|
lens_cache_by_buf[iter_bufnr][iter_client_id] = {}
|
||||||
|
end
|
||||||
api.nvim_buf_clear_namespace(iter_bufnr, ns, 0, -1)
|
api.nvim_buf_clear_namespace(iter_bufnr, ns, 0, -1)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -111,7 +131,7 @@ end
|
|||||||
|
|
||||||
--- Display the lenses using virtual text
|
--- Display the lenses using virtual text
|
||||||
---
|
---
|
||||||
---@param lenses table of lenses to display (`CodeLens[] | null`)
|
---@param lenses? lsp.CodeLens[] lenses to display
|
||||||
---@param bufnr integer
|
---@param bufnr integer
|
||||||
---@param client_id integer
|
---@param client_id integer
|
||||||
function M.display(lenses, bufnr, client_id)
|
function M.display(lenses, bufnr, client_id)
|
||||||
@ -124,7 +144,8 @@ function M.display(lenses, bufnr, client_id)
|
|||||||
api.nvim_buf_clear_namespace(bufnr, ns, 0, -1)
|
api.nvim_buf_clear_namespace(bufnr, ns, 0, -1)
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
local lenses_by_lnum = {}
|
|
||||||
|
local lenses_by_lnum = {} ---@type table<integer, lsp.CodeLens[]>
|
||||||
for _, lens in pairs(lenses) do
|
for _, lens in pairs(lenses) do
|
||||||
local line_lenses = lenses_by_lnum[lens.range.start.line]
|
local line_lenses = lenses_by_lnum[lens.range.start.line]
|
||||||
if not line_lenses then
|
if not line_lenses then
|
||||||
@ -160,7 +181,7 @@ end
|
|||||||
|
|
||||||
--- Store lenses for a specific buffer and client
|
--- Store lenses for a specific buffer and client
|
||||||
---
|
---
|
||||||
---@param lenses table of lenses to store (`CodeLens[] | null`)
|
---@param lenses? lsp.CodeLens[] lenses to store
|
||||||
---@param bufnr integer
|
---@param bufnr integer
|
||||||
---@param client_id integer
|
---@param client_id integer
|
||||||
function M.save(lenses, bufnr, client_id)
|
function M.save(lenses, bufnr, client_id)
|
||||||
@ -174,7 +195,7 @@ function M.save(lenses, bufnr, client_id)
|
|||||||
lens_cache_by_buf[bufnr] = lenses_by_client
|
lens_cache_by_buf[bufnr] = lenses_by_client
|
||||||
local ns = namespaces[client_id]
|
local ns = namespaces[client_id]
|
||||||
api.nvim_buf_attach(bufnr, false, {
|
api.nvim_buf_attach(bufnr, false, {
|
||||||
on_detach = function(b)
|
on_detach = function(_, b)
|
||||||
lens_cache_by_buf[b] = nil
|
lens_cache_by_buf[b] = nil
|
||||||
end,
|
end,
|
||||||
on_lines = function(_, b, _, first_lnum, last_lnum)
|
on_lines = function(_, b, _, first_lnum, last_lnum)
|
||||||
@ -185,6 +206,10 @@ function M.save(lenses, bufnr, client_id)
|
|||||||
lenses_by_client[client_id] = lenses
|
lenses_by_client[client_id] = lenses
|
||||||
end
|
end
|
||||||
|
|
||||||
|
---@param lenses? lsp.CodeLens[]
|
||||||
|
---@param bufnr integer
|
||||||
|
---@param client_id integer
|
||||||
|
---@param callback fun()
|
||||||
local function resolve_lenses(lenses, bufnr, client_id, callback)
|
local function resolve_lenses(lenses, bufnr, client_id, callback)
|
||||||
lenses = lenses or {}
|
lenses = lenses or {}
|
||||||
local num_lens = vim.tbl_count(lenses)
|
local num_lens = vim.tbl_count(lenses)
|
||||||
|
Loading…
Reference in New Issue
Block a user