mirror of
https://github.com/neovim/neovim
synced 2025-07-16 01:01:49 +00:00
feat(lsp): update LSP healthcheck format (#28980)
This is mostly an aesthetic change, although there are a few new pieces of information included. Originally I wanted to investigate including server capabilities in the healthcheck, but until we have the ability to fold/unfold text in health checks that would be too much information.
This commit is contained in:
@ -33,16 +33,22 @@ local function check_active_clients()
|
|||||||
local clients = vim.lsp.get_clients()
|
local clients = vim.lsp.get_clients()
|
||||||
if next(clients) then
|
if next(clients) then
|
||||||
for _, client in pairs(clients) do
|
for _, client in pairs(clients) do
|
||||||
local attached_to = table.concat(vim.tbl_keys(client.attached_buffers or {}), ',')
|
local cmd ---@type string
|
||||||
report_info(
|
if type(client.config.cmd) == 'table' then
|
||||||
|
cmd = table.concat(client.config.cmd --[[@as table]], ' ')
|
||||||
|
elseif type(client.config.cmd) == 'function' then
|
||||||
|
cmd = tostring(client.config.cmd)
|
||||||
|
end
|
||||||
|
report_info(table.concat({
|
||||||
|
string.format('%s (id: %d)', client.name, client.id),
|
||||||
|
string.format(' Root directory: %s', vim.fn.fnamemodify(client.root_dir, ':~')),
|
||||||
|
string.format(' Command: %s', cmd),
|
||||||
|
string.format(' Settings: %s', vim.inspect(client.settings, { newline = '\n ' })),
|
||||||
string.format(
|
string.format(
|
||||||
'%s (id=%s, root_dir=%s, attached_to=[%s])',
|
' Attached buffers: %s',
|
||||||
client.name,
|
vim.iter(pairs(client.attached_buffers)):map(tostring):join(', ')
|
||||||
client.id,
|
),
|
||||||
vim.fn.fnamemodify(client.root_dir, ':~'),
|
}, '\n'))
|
||||||
attached_to
|
|
||||||
)
|
|
||||||
)
|
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
report_info('No active clients')
|
report_info('No active clients')
|
||||||
@ -50,7 +56,7 @@ local function check_active_clients()
|
|||||||
end
|
end
|
||||||
|
|
||||||
local function check_watcher()
|
local function check_watcher()
|
||||||
vim.health.start('vim.lsp: File watcher')
|
vim.health.start('vim.lsp: File Watcher')
|
||||||
|
|
||||||
-- Only run the check if file watching has been enabled by a client.
|
-- Only run the check if file watching has been enabled by a client.
|
||||||
local clients = vim.lsp.get_clients()
|
local clients = vim.lsp.get_clients()
|
||||||
@ -94,11 +100,68 @@ local function check_watcher()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local function check_position_encodings()
|
||||||
|
vim.health.start('vim.lsp: Position Encodings')
|
||||||
|
local clients = vim.lsp.get_clients()
|
||||||
|
if next(clients) then
|
||||||
|
local position_encodings = {} ---@type table<integer, table<string, integer[]>>
|
||||||
|
for _, client in pairs(clients) do
|
||||||
|
for bufnr in pairs(client.attached_buffers) do
|
||||||
|
if not position_encodings[bufnr] then
|
||||||
|
position_encodings[bufnr] = {}
|
||||||
|
end
|
||||||
|
if not position_encodings[bufnr][client.offset_encoding] then
|
||||||
|
position_encodings[bufnr][client.offset_encoding] = {}
|
||||||
|
end
|
||||||
|
table.insert(position_encodings[bufnr][client.offset_encoding], client.id)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Check if any buffers are attached to multiple clients with different position encodings
|
||||||
|
local buffers = {} ---@type integer[]
|
||||||
|
for bufnr, encodings in pairs(position_encodings) do
|
||||||
|
local list = {} ---@type string[]
|
||||||
|
for k in pairs(encodings) do
|
||||||
|
list[#list + 1] = k
|
||||||
|
end
|
||||||
|
|
||||||
|
if #list > 1 then
|
||||||
|
buffers[#buffers + 1] = bufnr
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
if #buffers > 0 then
|
||||||
|
local lines =
|
||||||
|
{ 'Found buffers attached to multiple clients with different position encodings.' }
|
||||||
|
for _, bufnr in ipairs(buffers) do
|
||||||
|
local encodings = position_encodings[bufnr]
|
||||||
|
local parts = {}
|
||||||
|
for encoding, client_ids in pairs(encodings) do
|
||||||
|
table.insert(
|
||||||
|
parts,
|
||||||
|
string.format('%s (client id(s): %s)', encoding:upper(), table.concat(client_ids, ', '))
|
||||||
|
)
|
||||||
|
end
|
||||||
|
table.insert(lines, string.format('- Buffer %d: %s', bufnr, table.concat(parts, ', ')))
|
||||||
|
end
|
||||||
|
report_warn(
|
||||||
|
table.concat(lines, '\n'),
|
||||||
|
'Use the positionEncodings client capability to ensure all clients use the same position encoding'
|
||||||
|
)
|
||||||
|
else
|
||||||
|
report_info('No buffers contain mixed position encodings')
|
||||||
|
end
|
||||||
|
else
|
||||||
|
report_info('No active clients')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
--- Performs a healthcheck for LSP
|
--- Performs a healthcheck for LSP
|
||||||
function M.check()
|
function M.check()
|
||||||
check_log()
|
check_log()
|
||||||
check_active_clients()
|
check_active_clients()
|
||||||
check_watcher()
|
check_watcher()
|
||||||
|
check_position_encodings()
|
||||||
end
|
end
|
||||||
|
|
||||||
return M
|
return M
|
||||||
|
Reference in New Issue
Block a user