Skip to content

Commit 527dfd3

Browse files
committed
fix: gracefully handle clients that shut down with remaining messages
1 parent a3045be commit 527dfd3

File tree

1 file changed

+44
-45
lines changed

1 file changed

+44
-45
lines changed

lua/lsp-status/messaging.lua

Lines changed: 44 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,12 @@ local util = require('lsp-status/util')
22

33
local clients = {}
44
local messages = {}
5-
local function init(_messages, _)
6-
messages = _messages
5+
local function init(_messages, _) messages = _messages end
6+
7+
-- Unregister stopped clients
8+
local function unregister_client(id)
9+
messages[id] = nil
10+
clients[id] = nil
711
end
812

913
local function progress_callback(_, _, msg, client_id)
@@ -15,18 +19,19 @@ local function progress_callback(_, _, msg, client_id)
1519
title = val.title,
1620
message = val.message,
1721
percentage = val.percentage,
18-
spinner = 1,
22+
spinner = 1
1923
}
2024
elseif val.kind == 'report' then
2125
messages[client_id].progress[msg.token].message = val.message
2226
messages[client_id].progress[msg.token].percentage = val.percentage
23-
messages[client_id].progress[msg.token].spinner = messages[client_id].progress[msg.token].spinner + 1
27+
messages[client_id].progress[msg.token].spinner =
28+
messages[client_id].progress[msg.token].spinner + 1
2429
elseif val.kind == 'end' then
2530
if messages[client_id].progress[msg.token] == nil then
2631
vim.api.nvim_command('echohl WarningMsg')
2732
vim.api.nvim_command(
28-
'echom "[lsp-status] Received `end` message with no corresponding `begin` from ' .. clients[client_id] .. '!"'
29-
)
33+
'echom "[lsp-status] Received `end` message with no corresponding `begin` from '
34+
.. clients[client_id] .. '!"')
3035
vim.api.nvim_command('echohl None')
3136
else
3237
messages[client_id].progress[msg.token].message = val.message
@@ -35,7 +40,7 @@ local function progress_callback(_, _, msg, client_id)
3540
end
3641
end
3742
else
38-
table.insert(messages[client_id], { content = val, show_once = true, shown = 0 })
43+
table.insert(messages[client_id], {content = val, show_once = true, shown = 0})
3944
end
4045

4146
vim.api.nvim_command('doautocmd User LspMessageUpdate')
@@ -47,56 +52,50 @@ local function get_messages()
4752
local msg_remove = {}
4853
local progress_remove = {}
4954
for client, data in pairs(messages) do
50-
for token, ctx in pairs(data.progress) do
51-
table.insert(new_messages, {
52-
name = data.name,
53-
title = ctx.title,
54-
message = ctx.message,
55-
percentage = ctx.percentage,
56-
progress = true,
57-
spinner = ctx.spinner,
58-
})
59-
60-
if ctx.done then
61-
table.insert(progress_remove, { client = client, token = token })
55+
if vim.lsp.client_is_stopped(client) then
56+
unregister_client(client)
57+
else
58+
for token, ctx in pairs(data.progress) do
59+
table.insert(new_messages, {
60+
name = data.name,
61+
title = ctx.title,
62+
message = ctx.message,
63+
percentage = ctx.percentage,
64+
progress = true,
65+
spinner = ctx.spinner
66+
})
67+
68+
if ctx.done then table.insert(progress_remove, {client = client, token = token}) end
6269
end
63-
end
6470

65-
for i, msg in ipairs(data.messages) do
66-
if msg.show_once then
67-
msg.shown = msg.shown + 1
68-
if msg.shown > 1 then
69-
table.insert(msg_remove, { client = client, idx = i })
71+
for i, msg in ipairs(data.messages) do
72+
if msg.show_once then
73+
msg.shown = msg.shown + 1
74+
if msg.shown > 1 then table.insert(msg_remove, {client = client, idx = i}) end
7075
end
71-
end
7276

73-
table.insert(new_messages, { name = data.name, content = msg.content })
74-
end
77+
table.insert(new_messages, {name = data.name, content = msg.content})
78+
end
7579

76-
if next(data.status) ~= nil then
77-
table.insert(new_messages, {
78-
name = data.name,
79-
content = data.status.content,
80-
uri = data.status.uri,
81-
status = true
82-
})
80+
if next(data.status) ~= nil then
81+
table.insert(new_messages, {
82+
name = data.name,
83+
content = data.status.content,
84+
uri = data.status.uri,
85+
status = true
86+
})
87+
end
8388
end
8489
end
8590

86-
for _, item in ipairs(msg_remove) do
87-
table.remove(messages[item.client].messages, item.idx)
88-
end
91+
for _, item in ipairs(msg_remove) do table.remove(messages[item.client].messages, item.idx) end
8992

90-
for _, item in ipairs(progress_remove) do
91-
messages[item.client].progress[item.token] = nil
92-
end
93+
for _, item in ipairs(progress_remove) do messages[item.client].progress[item.token] = nil end
9394

9495
return new_messages
9596
end
9697

97-
local function register_progress()
98-
vim.lsp.callbacks['$/progress'] = progress_callback
99-
end
98+
local function register_progress() vim.lsp.callbacks['$/progress'] = progress_callback end
10099

101100
-- Client registration for messages
102101
local function register_client(id, name)
@@ -114,7 +113,7 @@ local M = {
114113
register_progress = register_progress,
115114
register_client = register_client,
116115
_init = init,
117-
capabilities = capabilities,
116+
capabilities = capabilities
118117
}
119118

120119
return M

0 commit comments

Comments
 (0)