Skip to content

Commit

Permalink
fix(diagnostic): get line count per buffer when clamping
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
gpanders committed Nov 25, 2021
1 parent f272288 commit c59f200
Showing 1 changed file with 22 additions and 12 deletions.
34 changes: 22 additions & 12 deletions runtime/lua/vim/diagnostic.lua
Expand Up @@ -372,45 +372,55 @@ local function get_diagnostics(bufnr, opts, clamp)

local namespace = opts.namespace
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
local function add(d)
local function add(b, d)
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
d = vim.deepcopy(d)
d.lnum = math.max(math.min(d.lnum, buf_line_count - 1), 0)
d.end_lnum = math.max(math.min(d.end_lnum, buf_line_count - 1), 0)
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.lnum = math.max(math.min(d.lnum, line_count), 0)
d.end_lnum = math.max(math.min(d.end_lnum, line_count), 0)
end
end
table.insert(diagnostics, d)
end
end

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 _, diagnostic in pairs(v) do
add(diagnostic)
add(b, diagnostic)
end
end
end
elseif namespace == nil then
bufnr = get_bufnr(bufnr)
for iter_namespace in pairs(diagnostic_cache[bufnr]) do
for _, diagnostic in pairs(diagnostic_cache[bufnr][iter_namespace]) do
add(diagnostic)
add(bufnr, diagnostic)
end
end
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
add(diagnostic)
add(b, diagnostic)
end
end
else
bufnr = get_bufnr(bufnr)
for _, diagnostic in pairs(diagnostic_cache[bufnr][namespace] or {}) do
add(diagnostic)
add(bufnr, diagnostic)
end
end

Expand Down

0 comments on commit c59f200

Please sign in to comment.