commit 2b21c9c23f889555dd93ba508a0f787b25ed9bb4
parent b6b35cb557c2e2f2715567cd17fd550bf20211ae
Author: Lewis Russell <lewis6991@gmail.com>
Date: Thu, 5 Jun 2025 12:24:33 +0100
fix(diagnostic): ensure autocmd always is always sent diagnostics
Diffstat:
2 files changed, 26 insertions(+), 13 deletions(-)
diff --git a/runtime/lua/vim/diagnostic.lua b/runtime/lua/vim/diagnostic.lua
@@ -418,7 +418,7 @@ local bufnr_and_namespace_cacher_mt = {
}
-- bufnr -> ns -> Diagnostic[]
-local diagnostic_cache = {} --- @type table<integer,table<integer,vim.Diagnostic[]>>
+local diagnostic_cache = {} --- @type table<integer,table<integer,vim.Diagnostic[]?>>
do
local group = api.nvim_create_augroup('nvim.diagnostic.buf_wipeout', {})
setmetatable(diagnostic_cache, {
@@ -710,16 +710,6 @@ local function norm_diag(bufnr, namespace, d)
d1.bufnr = bufnr
end
---- @param namespace integer
---- @param bufnr integer
---- @param diagnostics vim.Diagnostic.Set[]
-local function set_diagnostic_cache(namespace, bufnr, diagnostics)
- for _, diagnostic in ipairs(diagnostics) do
- norm_diag(bufnr, namespace, diagnostic)
- end
- diagnostic_cache[bufnr][namespace] = diagnostics
-end
-
--- @param bufnr integer
--- @param last integer
local function restore_extmarks(bufnr, last)
@@ -1260,10 +1250,16 @@ function M.set(namespace, bufnr, diagnostics, opts)
bufnr = vim._resolve_bufnr(bufnr)
+ for _, diagnostic in ipairs(diagnostics) do
+ norm_diag(bufnr, namespace, diagnostic)
+ end
+
+ --- @cast diagnostics vim.Diagnostic[]
+
if vim.tbl_isempty(diagnostics) then
diagnostic_cache[bufnr][namespace] = nil
else
- set_diagnostic_cache(namespace, bufnr, diagnostics)
+ diagnostic_cache[bufnr][namespace] = diagnostics
end
M.show(namespace, bufnr, nil, opts)
@@ -1272,7 +1268,7 @@ function M.set(namespace, bufnr, diagnostics, opts)
modeline = false,
buffer = bufnr,
-- TODO(lewis6991): should this be deepcopy()'d like they are in vim.diagnostic.get()
- data = { diagnostics = diagnostic_cache[bufnr][namespace] },
+ data = { diagnostics = diagnostics },
})
end
diff --git a/test/functional/lua/diagnostic_spec.lua b/test/functional/lua/diagnostic_spec.lua
@@ -2714,6 +2714,23 @@ describe('vim.diagnostic', function()
eq({}, result)
end
end)
+
+ it('always passes a table to DiagnosticChanged autocommand', function()
+ local result = exec_lua(function()
+ local changed_diags --- @type vim.Diagnostic[]?
+ vim.api.nvim_create_autocmd('DiagnosticChanged', {
+ buffer = _G.diagnostic_bufnr,
+ callback = function(args)
+ --- @type vim.Diagnostic[]
+ changed_diags = args.data.diagnostics
+ end,
+ })
+ vim.diagnostic.set(_G.diagnostic_ns, _G.diagnostic_bufnr, {})
+ return changed_diags
+ end)
+ eq('table', type(result))
+ eq(0, #result)
+ end)
end)
describe('open_float()', function()