diff options
author | Michael Lingelbach <m.j.lbach@gmail.com> | 2021-11-25 07:28:46 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-11-25 07:28:46 -0500 |
commit | 6ea5e80393dbcc6205ee8586c29a097e8a08ad53 (patch) | |
tree | d286c07b9e1d15f763988829a0f9e0650d5ebb4e /runtime/lua/vim/diagnostic.lua | |
parent | b5b025f6a3ad406929c096f63b5f1e7649d3c818 (diff) | |
parent | 0341c687a35381b360f5f2a89f444490b09c5cda (diff) | |
download | rneovim-6ea5e80393dbcc6205ee8586c29a097e8a08ad53.tar.gz rneovim-6ea5e80393dbcc6205ee8586c29a097e8a08ad53.tar.bz2 rneovim-6ea5e80393dbcc6205ee8586c29a097e8a08ad53.zip |
Merge pull request #16434 from gpanders/diagnostic-clampage
fix(diagnostic): line clamping fixes
Diffstat (limited to 'runtime/lua/vim/diagnostic.lua')
-rw-r--r-- | runtime/lua/vim/diagnostic.lua | 38 |
1 files changed, 25 insertions, 13 deletions
diff --git a/runtime/lua/vim/diagnostic.lua b/runtime/lua/vim/diagnostic.lua index 226c440fe7..cdf349dbdd 100644 --- a/runtime/lua/vim/diagnostic.lua +++ b/runtime/lua/vim/diagnostic.lua @@ -372,25 +372,35 @@ 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 @@ -398,19 +408,19 @@ local function get_diagnostics(bufnr, opts, clamp) 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 @@ -431,7 +441,9 @@ local function set_list(loclist, opts) if loclist then bufnr = vim.api.nvim_win_get_buf(winnr) end - local diagnostics = get_diagnostics(bufnr, opts, true) + -- Don't clamp line numbers since the quickfix list can already handle line + -- numbers beyond the end of the buffer + local diagnostics = get_diagnostics(bufnr, opts, false) local items = M.toqflist(diagnostics) if loclist then vim.fn.setloclist(winnr, {}, ' ', { title = title, items = items }) |