mirror of
https://github.com/neovim/neovim.git
synced 2025-12-11 09:02:40 +00:00
feat(diagnostics): stack DiagnosticUnnecessary,DiagnosticDeprecated highlights #36590
Problem: unnecessary and deprecated diagnostics use their own highlight groups (`DiagnosticUnnecessary` and `DiagnosticDeprecated`) which override the typical severity-based highlight groups (like `DiagnosticUnderlineWarn`). This can be misleading, since diagnostics about unused variables which are warnings or errors, are shown like comments, since then only the `DiagnosticUnnecessary` highlight group is used. Users do not see the more eye-catching red/yellow highlight. Solution: Instead of overriding the highlight group to `DiagnosticUnnecessary` or `DiagnosticDeprecated`, set them in addition to the normal severity-based highlights.
This commit is contained in:
committed by
GitHub
parent
5d258854a7
commit
2767eac320
@@ -1734,29 +1734,30 @@ M.handlers.underline = {
|
|||||||
local get_priority = severity_to_extmark_priority(vim.hl.priorities.diagnostics, opts)
|
local get_priority = severity_to_extmark_priority(vim.hl.priorities.diagnostics, opts)
|
||||||
|
|
||||||
for _, diagnostic in ipairs(diagnostics) do
|
for _, diagnostic in ipairs(diagnostics) do
|
||||||
local higroup = underline_highlight_map[diagnostic.severity]
|
local higroups = { underline_highlight_map[diagnostic.severity] }
|
||||||
|
|
||||||
if diagnostic._tags then
|
if diagnostic._tags then
|
||||||
-- TODO(lewis6991): we should be able to stack these.
|
|
||||||
if diagnostic._tags.unnecessary then
|
if diagnostic._tags.unnecessary then
|
||||||
higroup = 'DiagnosticUnnecessary'
|
table.insert(higroups, 'DiagnosticUnnecessary')
|
||||||
end
|
end
|
||||||
if diagnostic._tags.deprecated then
|
if diagnostic._tags.deprecated then
|
||||||
higroup = 'DiagnosticDeprecated'
|
table.insert(higroups, 'DiagnosticDeprecated')
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local lines =
|
local lines =
|
||||||
api.nvim_buf_get_lines(diagnostic.bufnr, diagnostic.lnum, diagnostic.lnum + 1, true)
|
api.nvim_buf_get_lines(diagnostic.bufnr, diagnostic.lnum, diagnostic.lnum + 1, true)
|
||||||
|
|
||||||
vim.hl.range(
|
for _, higroup in ipairs(higroups) do
|
||||||
bufnr,
|
vim.hl.range(
|
||||||
underline_ns,
|
bufnr,
|
||||||
higroup,
|
underline_ns,
|
||||||
{ diagnostic.lnum, math.min(diagnostic.col, #lines[1] - 1) },
|
higroup,
|
||||||
{ diagnostic.end_lnum, diagnostic.end_col },
|
{ diagnostic.lnum, math.min(diagnostic.col, #lines[1] - 1) },
|
||||||
{ priority = get_priority(diagnostic.severity) }
|
{ diagnostic.end_lnum, diagnostic.end_col },
|
||||||
)
|
{ priority = get_priority(diagnostic.severity) }
|
||||||
|
)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
save_extmarks(underline_ns, bufnr)
|
save_extmarks(underline_ns, bufnr)
|
||||||
end)
|
end)
|
||||||
|
|||||||
@@ -2023,6 +2023,35 @@ describe('vim.diagnostic', function()
|
|||||||
eq('DiagnosticUnderlineInfo', underline_hl)
|
eq('DiagnosticUnderlineInfo', underline_hl)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
it(
|
||||||
|
'shows deprecated and unnecessary highlights in addition to severity-based highlights',
|
||||||
|
function()
|
||||||
|
---@type string[]
|
||||||
|
local result = exec_lua(function()
|
||||||
|
local diagnostic = _G.make_error('Some error', 0, 0, 0, 0, 'source x')
|
||||||
|
diagnostic._tags = {
|
||||||
|
deprecated = true,
|
||||||
|
unnecessary = true,
|
||||||
|
}
|
||||||
|
|
||||||
|
local diagnostics = { diagnostic }
|
||||||
|
vim.diagnostic.set(_G.diagnostic_ns, _G.diagnostic_bufnr, diagnostics)
|
||||||
|
|
||||||
|
local extmarks = _G.get_underline_extmarks(_G.diagnostic_ns)
|
||||||
|
local hl_groups = vim.tbl_map(function(extmark)
|
||||||
|
return extmark[4].hl_group
|
||||||
|
end, extmarks)
|
||||||
|
return hl_groups
|
||||||
|
end)
|
||||||
|
|
||||||
|
eq({
|
||||||
|
'DiagnosticDeprecated',
|
||||||
|
'DiagnosticUnnecessary',
|
||||||
|
'DiagnosticUnderlineError',
|
||||||
|
}, result)
|
||||||
|
end
|
||||||
|
)
|
||||||
|
|
||||||
it('can show diagnostic sources in virtual text', function()
|
it('can show diagnostic sources in virtual text', function()
|
||||||
local result = exec_lua(function()
|
local result = exec_lua(function()
|
||||||
local diagnostics = {
|
local diagnostics = {
|
||||||
|
|||||||
Reference in New Issue
Block a user