mirror of
https://github.com/neovim/neovim.git
synced 2025-09-06 19:38:20 +00:00
feat(lsp)!: add vim.lsp.status, client.progress and promote LspProgressUpdate (#23958)
`client.messages` could grow unbounded because the default handler only added new messages, never removing them. A user either had to consume the messages by calling `vim.lsp.util.get_progress_messages` or by manually removing them from `client.messages.progress`. If they didn't do that, using LSP effectively leaked memory. To fix this, this deprecates the `messages` property and instead adds a `progress` ring buffer that only keeps at most 50 messages. In addition it deprecates `vim.lsp.util.get_progress_messages` in favour of a new `vim.lsp.status()` and also promotes the `LspProgressUpdate` user autocmd to a regular autocmd to allow users to pattern match on the progress kind. Also closes https://github.com/neovim/neovim/pull/20327
This commit is contained in:

committed by
GitHub

parent
f31dba93f9
commit
e5e0bda41b
@@ -353,11 +353,40 @@ end
|
||||
|
||||
--- Process and return progress reports from lsp server
|
||||
---@private
|
||||
---@deprecated Use vim.lsp.status() or access client.progress directly
|
||||
function M.get_progress_messages()
|
||||
vim.deprecate('vim.lsp.util.get_progress_messages', 'vim.lsp.status', '0.11.0')
|
||||
local new_messages = {}
|
||||
local progress_remove = {}
|
||||
|
||||
for _, client in ipairs(vim.lsp.get_active_clients()) do
|
||||
local groups = {}
|
||||
for progress in client.progress do
|
||||
local value = progress.value
|
||||
if type(value) == 'table' and value.kind then
|
||||
local group = groups[progress.token]
|
||||
if not group then
|
||||
group = {
|
||||
done = false,
|
||||
progress = true,
|
||||
title = 'empty title',
|
||||
}
|
||||
groups[progress.token] = group
|
||||
end
|
||||
group.title = value.title or group.title
|
||||
group.cancellable = value.cancellable or group.cancellable
|
||||
if value.kind == 'end' then
|
||||
group.done = true
|
||||
end
|
||||
group.message = value.message or group.message
|
||||
group.percentage = value.percentage or group.percentage
|
||||
end
|
||||
end
|
||||
|
||||
for _, group in pairs(groups) do
|
||||
table.insert(new_messages, group)
|
||||
end
|
||||
|
||||
local messages = client.messages
|
||||
local data = messages
|
||||
for token, ctx in pairs(data.progress) do
|
||||
|
Reference in New Issue
Block a user