fix(diagnostic): support severity_sort

This commit is contained in:
Gregory Anders 2021-09-17 10:50:25 -06:00
parent f87779a24d
commit 32c0631183
4 changed files with 80 additions and 15 deletions

View File

@ -216,18 +216,31 @@ config({opts}, {namespace}) *vim.diagnostic.config()*
{opts} table Configuration table with the following {opts} table Configuration table with the following
keys: keys:
• underline: (default true) Use underline for • underline: (default true) Use underline for
diagnostics diagnostics. Options:
• severity: Only underline diagnostics
matching the given severity
|diagnostic-severity|
• virtual_text: (default true) Use virtual • virtual_text: (default true) Use virtual
text for diagnostics text for diagnostics. Options:
• severity: Only show virtual text for
diagnostics matching the given severity
|diagnostic-severity|
• signs: (default true) Use signs for • signs: (default true) Use signs for
diagnostics diagnostics. Options:
• severity: Only show signs for diagnostics
matching the given severity
|diagnostic-severity|
• update_in_insert: (default false) Update • update_in_insert: (default false) Update
diagnostics in Insert mode (if false, diagnostics in Insert mode (if false,
diagnostics are updated on InsertLeave) diagnostics are updated on InsertLeave)
• severity_sort: (default false) Sort • severity_sort: (default false) Sort
diagnostics by severity. This affects the diagnostics by severity. This affects the
order in which signs and virtual text are order in which signs and virtual text are
displayed displayed. Options:
• reverse: (boolean) Reverse sort order
{namespace} number|nil Update the options for the given {namespace} number|nil Update the options for the given
namespace. When omitted, update the global namespace. When omitted, update the global
diagnostic options. diagnostic options.

View File

@ -440,13 +440,20 @@ end
--- - `function`: Function with signature (namespace, bufnr) that returns any of the above. --- - `function`: Function with signature (namespace, bufnr) that returns any of the above.
--- ---
---@param opts table Configuration table with the following keys: ---@param opts table Configuration table with the following keys:
--- - underline: (default true) Use underline for diagnostics --- - underline: (default true) Use underline for diagnostics. Options:
--- - virtual_text: (default true) Use virtual text for diagnostics --- * severity: Only underline diagnostics matching the given severity
--- - signs: (default true) Use signs for diagnostics --- |diagnostic-severity|
--- - virtual_text: (default true) Use virtual text for diagnostics. Options:
--- * severity: Only show virtual text for diagnostics matching the given
--- severity |diagnostic-severity|
--- - signs: (default true) Use signs for diagnostics. Options:
--- * severity: Only show signs for diagnostics matching the given severity
--- |diagnostic-severity|
--- - update_in_insert: (default false) Update diagnostics in Insert mode (if false, --- - update_in_insert: (default false) Update diagnostics in Insert mode (if false,
--- diagnostics are updated on InsertLeave) --- diagnostics are updated on InsertLeave)
--- - severity_sort: (default false) Sort diagnostics by severity. This affects the order in --- - severity_sort: (default false) Sort diagnostics by severity. This affects the order in
--- which signs and virtual text are displayed --- which signs and virtual text are displayed. Options:
--- * reverse: (boolean) Reverse sort order
---@param namespace number|nil Update the options for the given namespace. When omitted, update the ---@param namespace number|nil Update the options for the given namespace. When omitted, update the
--- global diagnostic options. --- global diagnostic options.
function M.config(opts, namespace) function M.config(opts, namespace)
@ -989,6 +996,14 @@ function M.show(namespace, bufnr, diagnostics, opts)
end end
end end
if vim.F.if_nil(opts.severity_sort, false) then
if type(opts.severity_sort) == "table" and opts.severity_sort.reverse then
table.sort(diagnostics, function(a, b) return a.severity > b.severity end)
else
table.sort(diagnostics, function(a, b) return a.severity < b.severity end)
end
end
if opts.underline then if opts.underline then
M._set_underline(namespace, bufnr, diagnostics, opts.underline) M._set_underline(namespace, bufnr, diagnostics, opts.underline)
end end

View File

@ -195,10 +195,6 @@ function M.on_publish_diagnostics(_, result, ctx, config)
local diagnostics = result.diagnostics local diagnostics = result.diagnostics
if config then if config then
if vim.F.if_nil(config.severity_sort, false) then
table.sort(diagnostics, function(a, b) return a.severity > b.severity end)
end
for _, opt in pairs(config) do for _, opt in pairs(config) do
if type(opt) == 'table' then if type(opt) == 'table' then
if not opt.severity and opt.severity_limit then if not opt.severity and opt.severity_limit then

View File

@ -35,7 +35,7 @@ describe('vim.diagnostic', function()
} }
end end
function make_information(msg, x1, y1, x2, y2) function make_info(msg, x1, y1, x2, y2)
return { return {
lnum = x1, lnum = x1,
col = y1, col = y1,
@ -456,7 +456,7 @@ describe('vim.diagnostic', function()
vim.diagnostic.set(diagnostic_ns, diagnostic_bufnr, { vim.diagnostic.set(diagnostic_ns, diagnostic_bufnr, {
make_error("Error 1", 1, 1, 1, 5), make_error("Error 1", 1, 1, 1, 5),
make_warning("Warning on Server 1", 1, 1, 2, 5), make_warning("Warning on Server 1", 1, 1, 2, 5),
make_information("Ignored information", 1, 1, 2, 5), make_info("Ignored information", 1, 1, 2, 5),
make_hint("Here's a hint", 1, 1, 2, 5), make_hint("Here's a hint", 1, 1, 2, 5),
}) })
@ -478,7 +478,7 @@ describe('vim.diagnostic', function()
vim.diagnostic.set(diagnostic_ns, diagnostic_bufnr, { vim.diagnostic.set(diagnostic_ns, diagnostic_bufnr, {
make_error("Error 1", 1, 1, 1, 5), make_error("Error 1", 1, 1, 1, 5),
make_warning("Warning on Server 1", 1, 1, 2, 5), make_warning("Warning on Server 1", 1, 1, 2, 5),
make_information("Ignored information", 1, 1, 2, 5), make_info("Ignored information", 1, 1, 2, 5),
make_error("Error On Other Line", 2, 1, 1, 5), make_error("Error On Other Line", 2, 1, 1, 5),
}) })
@ -538,6 +538,47 @@ describe('vim.diagnostic', function()
eq(1, get_extmark_count_with_severity("WARN")) eq(1, get_extmark_count_with_severity("WARN"))
eq(1, get_extmark_count_with_severity("HINT")) eq(1, get_extmark_count_with_severity("HINT"))
end) end)
it('allows sorting by severity', function()
local result = exec_lua([[
vim.diagnostic.config({
underline = true,
virtual_text = false,
severity_sort = false,
})
vim.diagnostic.set(diagnostic_ns, diagnostic_bufnr, {
make_warning('Warning', 4, 4, 4, 4),
make_error('Error', 4, 4, 4, 4),
make_info('Info', 4, 4, 4, 4),
})
local extmarks = vim.api.nvim_buf_get_extmarks(diagnostic_bufnr, diagnostic_ns, 0, -1, {details = true})
local warn_highlight = extmarks[1][4].hl_group
vim.diagnostic.config({
severity_sort = true,
})
extmarks = vim.api.nvim_buf_get_extmarks(diagnostic_bufnr, diagnostic_ns, 0, -1, {details = true})
local err_highlight = extmarks[1][4].hl_group
vim.diagnostic.config({
severity_sort = { reverse = true },
})
extmarks = vim.api.nvim_buf_get_extmarks(diagnostic_bufnr, diagnostic_ns, 0, -1, {details = true})
local info_highlight = extmarks[1][4].hl_group
return { warn_highlight, err_highlight, info_highlight }
]])
eq('DiagnosticUnderlineWarn', result[1])
eq('DiagnosticUnderlineError', result[2])
eq('DiagnosticUnderlineInfo', result[3])
end)
end) end)
describe('set()', function() describe('set()', function()