fix(diagnostic): get line count per buffer when clamping

Fixes a bug when `get_diagnostics` is called with a nil `bufnr`.
Diagnostics should be clamped for the buffer they reside in, not the
current buffer.
This commit is contained in:
Gregory Anders 2021-11-24 19:32:26 -07:00
parent f2722884a8
commit c59f2008e0

View File

@ -372,25 +372,35 @@ local function get_diagnostics(bufnr, opts, clamp)
local namespace = opts.namespace local namespace = opts.namespace
local diagnostics = {} local diagnostics = {}
local buf_line_count = clamp and vim.api.nvim_buf_line_count(bufnr) or math.huge
-- Memoized results of buf_line_count per bufnr
local buf_line_count = setmetatable({}, {
__index = function(t, k)
t[k] = vim.api.nvim_buf_line_count(k)
return rawget(t, k)
end,
})
---@private ---@private
local function add(d) local function add(b, d)
if not opts.lnum or d.lnum == opts.lnum then if not opts.lnum or d.lnum == opts.lnum then
if clamp and (d.lnum >= buf_line_count or d.end_lnum >= buf_line_count) then if clamp and vim.api.nvim_buf_is_loaded(b) then
local line_count = buf_line_count[b] - 1
if (d.lnum > line_count or d.end_lnum > line_count) then
d = vim.deepcopy(d) d = vim.deepcopy(d)
d.lnum = math.max(math.min(d.lnum, buf_line_count - 1), 0) d.lnum = math.max(math.min(d.lnum, line_count), 0)
d.end_lnum = math.max(math.min(d.end_lnum, buf_line_count - 1), 0) d.end_lnum = math.max(math.min(d.end_lnum, line_count), 0)
end
end end
table.insert(diagnostics, d) table.insert(diagnostics, d)
end end
end end
if namespace == nil and bufnr == nil then if namespace == nil and bufnr == nil then
for _, t in pairs(diagnostic_cache) do for b, t in pairs(diagnostic_cache) do
for _, v in pairs(t) do for _, v in pairs(t) do
for _, diagnostic in pairs(v) do for _, diagnostic in pairs(v) do
add(diagnostic) add(b, diagnostic)
end end
end end
end end
@ -398,19 +408,19 @@ local function get_diagnostics(bufnr, opts, clamp)
bufnr = get_bufnr(bufnr) bufnr = get_bufnr(bufnr)
for iter_namespace in pairs(diagnostic_cache[bufnr]) do for iter_namespace in pairs(diagnostic_cache[bufnr]) do
for _, diagnostic in pairs(diagnostic_cache[bufnr][iter_namespace]) do for _, diagnostic in pairs(diagnostic_cache[bufnr][iter_namespace]) do
add(diagnostic) add(bufnr, diagnostic)
end end
end end
elseif bufnr == nil then elseif bufnr == nil then
for _, t in pairs(diagnostic_cache) do for b, t in pairs(diagnostic_cache) do
for _, diagnostic in pairs(t[namespace] or {}) do for _, diagnostic in pairs(t[namespace] or {}) do
add(diagnostic) add(b, diagnostic)
end end
end end
else else
bufnr = get_bufnr(bufnr) bufnr = get_bufnr(bufnr)
for _, diagnostic in pairs(diagnostic_cache[bufnr][namespace] or {}) do for _, diagnostic in pairs(diagnostic_cache[bufnr][namespace] or {}) do
add(diagnostic) add(bufnr, diagnostic)
end end
end end