aboutsummaryrefslogtreecommitdiff
path: root/runtime/lua/vim/diagnostic.lua
diff options
context:
space:
mode:
authorMathias Fußenegger <mfussenegger@users.noreply.github.com>2024-04-24 21:47:02 +0200
committerGitHub <noreply@github.com>2024-04-24 21:47:02 +0200
commit7f084770c23855083776b0598f2f54bb59a06875 (patch)
tree9698c7ee0f7e4a0b0b7382c63b5f7b6e0c8514d1 /runtime/lua/vim/diagnostic.lua
parenta1550dbf0ac252052a7a71780708d3ec05aa3686 (diff)
downloadrneovim-7f084770c23855083776b0598f2f54bb59a06875.tar.gz
rneovim-7f084770c23855083776b0598f2f54bb59a06875.tar.bz2
rneovim-7f084770c23855083776b0598f2f54bb59a06875.zip
perf(diagnostic): avoid table copies to filter by severity (#28491)
Instead of adding all diagnostics matching lnum filters to a table, and then copying that table to another table while applying the severity filter, this changes the flow to only add diagnostics matching both filters in the first pass.
Diffstat (limited to 'runtime/lua/vim/diagnostic.lua')
-rw-r--r--runtime/lua/vim/diagnostic.lua59
1 files changed, 33 insertions, 26 deletions
diff --git a/runtime/lua/vim/diagnostic.lua b/runtime/lua/vim/diagnostic.lua
index b42eece4c2..3321b6ad71 100644
--- a/runtime/lua/vim/diagnostic.lua
+++ b/runtime/lua/vim/diagnostic.lua
@@ -372,43 +372,46 @@ local function to_severity(severity)
end
--- @param severity vim.diagnostic.SeverityFilter
---- @param diagnostics vim.Diagnostic[]
---- @return vim.Diagnostic[]
-local function filter_by_severity(severity, diagnostics)
- if not severity then
- return diagnostics
- end
-
+--- @return fun(vim.Diagnostic):boolean
+local function severity_predicate(severity)
if type(severity) ~= 'table' then
severity = assert(to_severity(severity))
- --- @param t vim.Diagnostic
- return vim.tbl_filter(function(t)
- return t.severity == severity
- end, diagnostics)
+ ---@param d vim.Diagnostic
+ return function(d)
+ return d.severity == severity
+ end
end
-
if severity.min or severity.max then
--- @cast severity {min:vim.diagnostic.Severity,max:vim.diagnostic.Severity}
local min_severity = to_severity(severity.min) or M.severity.HINT
local max_severity = to_severity(severity.max) or M.severity.ERROR
- --- @param t vim.Diagnostic
- return vim.tbl_filter(function(t)
- return t.severity <= min_severity and t.severity >= max_severity
- end, diagnostics)
+ --- @param d vim.Diagnostic
+ return function(d)
+ return d.severity <= min_severity and d.severity >= max_severity
+ end
end
--- @cast severity vim.diagnostic.Severity[]
-
local severities = {} --- @type table<vim.diagnostic.Severity,true>
for _, s in ipairs(severity) do
severities[assert(to_severity(s))] = true
end
- --- @param t vim.Diagnostic
- return vim.tbl_filter(function(t)
- return severities[t.severity]
- end, diagnostics)
+ --- @param d vim.Diagnostic
+ return function(d)
+ return severities[d.severity]
+ end
+end
+
+--- @param severity vim.diagnostic.SeverityFilter
+--- @param diagnostics vim.Diagnostic[]
+--- @return vim.Diagnostic[]
+local function filter_by_severity(severity, diagnostics)
+ if not severity then
+ return diagnostics
+ end
+ return vim.tbl_filter(severity_predicate(severity), diagnostics)
end
--- @param bufnr integer
@@ -714,10 +717,18 @@ local function get_diagnostics(bufnr, opts, clamp)
end,
})
+ local match_severity = opts.severity and severity_predicate(opts.severity)
+ or function(_)
+ return true
+ end
+
---@param b integer
---@param d vim.Diagnostic
local function add(b, d)
- if not opts.lnum or (opts.lnum >= d.lnum and opts.lnum <= (d.end_lnum or d.lnum)) then
+ if
+ match_severity(d)
+ and (not opts.lnum or (opts.lnum >= d.lnum and opts.lnum <= (d.end_lnum or d.lnum)))
+ then
if clamp and api.nvim_buf_is_loaded(b) then
local line_count = buf_line_count[b] - 1
if
@@ -771,10 +782,6 @@ local function get_diagnostics(bufnr, opts, clamp)
end
end
- if opts.severity then
- diagnostics = filter_by_severity(opts.severity, diagnostics)
- end
-
return diagnostics
end