diff --git a/runtime/lua/vim/diagnostic.lua b/runtime/lua/vim/diagnostic.lua index d96b932b68..e01b1f2daa 100644 --- 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> +local diagnostic_cache = {} --- @type table> 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 index ad08a33fc0..7f94d0ed54 100644 --- 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()