local if_nil = vim.F.if_nil
local M = {}
M.severity = {
ERROR = 1,
WARN = 2,
INFO = 3,
HINT = 4,
}
vim.tbl_add_reverse_lookup(M.severity)
-- Mappings from qflist/loclist error types to severities
M.severity.E = M.severity.ERROR
M.severity.W = M.severity.WARN
M.severity.I = M.severity.INFO
M.severity.N = M.severity.HINT
local global_diagnostic_options = {
signs = true,
underline = true,
virtual_text = true,
float = true,
update_in_insert = false,
severity_sort = false,
}
M.handlers = setmetatable({}, {
__newindex = function(t, name, handler)
vim.validate { handler = {handler, "t" } }
rawset(t, name, handler)
if not global_diagnostic_options[name] then
global_diagnostic_options[name] = true
end
end,
})
-- Local functions {{{
---@private
local function to_severity(severity)
if type(severity) == 'string' then
return assert(M.severity[string.upper(severity)], string.format("Invalid severity: %s", severity))
end
return severity
end
---@private
local function filter_by_severity(severity, diagnostics)
if not severity then
return diagnostics
end
if type(severity) ~= "table" then
severity = to_severity(severity)
return vim.tbl_filter(function(t) return t.severity == severity end, diagnostics)
end
local min_severity = to_severity(severity.min) or M.severity.HINT
local max_severity = to_severity(severity.max) or M.severity.ERROR
return vim.tbl_filter(function(t) return t.severity <= min_severity and t.severity >= max_severity end, diagnostics)
end
---@private
local function prefix_source(source, diagnostics)
vim.validate { source = {source, function(v)
return v == "always" or v == "if_many"
end, "'always' or 'if_many'" } }
if source == "if_many" then
local sources = {}
for _, d in pairs(diagnostics) do
if d.source then
sources[d.source] = true
|