aboutsummaryrefslogtreecommitdiff
path: root/runtime/lua/vim/diagnostic.lua
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/lua/vim/diagnostic.lua')
-rw-r--r--runtime/lua/vim/diagnostic.lua108
1 files changed, 56 insertions, 52 deletions
diff --git a/runtime/lua/vim/diagnostic.lua b/runtime/lua/vim/diagnostic.lua
index afc0a4095c..40991673f3 100644
--- a/runtime/lua/vim/diagnostic.lua
+++ b/runtime/lua/vim/diagnostic.lua
@@ -68,7 +68,10 @@ local all_namespaces = {}
---@private
local function to_severity(severity)
if type(severity) == 'string' then
- return assert(M.severity[string.upper(severity)], string.format('Invalid severity: %s', severity))
+ return assert(
+ M.severity[string.upper(severity)],
+ string.format('Invalid severity: %s', severity)
+ )
end
return severity
end
@@ -277,7 +280,8 @@ local function set_diagnostic_cache(namespace, bufnr, diagnostics)
for _, diagnostic in ipairs(diagnostics) do
assert(diagnostic.lnum, 'Diagnostic line number is required')
assert(diagnostic.col, 'Diagnostic column is required')
- diagnostic.severity = diagnostic.severity and to_severity(diagnostic.severity) or M.severity.ERROR
+ diagnostic.severity = diagnostic.severity and to_severity(diagnostic.severity)
+ or M.severity.ERROR
diagnostic.end_lnum = diagnostic.end_lnum or diagnostic.lnum
diagnostic.end_col = diagnostic.end_col or diagnostic.col
diagnostic.namespace = namespace
@@ -322,13 +326,8 @@ local function save_extmarks(namespace, bufnr)
})
diagnostic_attached_buffers[bufnr] = true
end
- diagnostic_cache_extmarks[bufnr][namespace] = vim.api.nvim_buf_get_extmarks(
- bufnr,
- namespace,
- 0,
- -1,
- { details = true }
- )
+ diagnostic_cache_extmarks[bufnr][namespace] =
+ vim.api.nvim_buf_get_extmarks(bufnr, namespace, 0, -1, { details = true })
end
local registered_autocmds = {}
@@ -339,6 +338,32 @@ local function make_augroup_key(namespace, bufnr)
return string.format('DiagnosticInsertLeave:%s:%s', bufnr, ns.name)
end
+---@private
+local function execute_scheduled_display(namespace, bufnr)
+ local args = bufs_waiting_to_update[bufnr][namespace]
+ if not args then
+ return
+ end
+
+ -- Clear the args so we don't display unnecessarily.
+ bufs_waiting_to_update[bufnr][namespace] = nil
+
+ M.show(namespace, bufnr, nil, args)
+end
+
+--- @deprecated
+--- Callback scheduled when leaving Insert mode.
+---
+--- called from the Vimscript autocommand.
+---
+--- See @ref schedule_display()
+---
+---@private
+function M._execute_scheduled_display(namespace, bufnr)
+ vim.deprecate('vim.diagnostic._execute_scheduled_display', nil, '0.9')
+ execute_scheduled_display(namespace, bufnr)
+end
+
--- Table of autocmd events to fire the update for displaying new diagnostic information
local insert_leave_auto_cmds = { 'InsertLeave', 'CursorHoldI' }
@@ -347,18 +372,15 @@ local function schedule_display(namespace, bufnr, args)
bufs_waiting_to_update[bufnr][namespace] = args
local key = make_augroup_key(namespace, bufnr)
+ local group = vim.api.nvim_create_augroup(key, { clear = true })
if not registered_autocmds[key] then
- vim.cmd(string.format(
- [[augroup %s
- au!
- autocmd %s <buffer=%s> lua vim.diagnostic._execute_scheduled_display(%s, %s)
- augroup END]],
- key,
- table.concat(insert_leave_auto_cmds, ','),
- bufnr,
- namespace,
- bufnr
- ))
+ vim.api.nvim_create_autocmd(insert_leave_auto_cmds, {
+ group = group,
+ buffer = bufnr,
+ callback = function()
+ execute_scheduled_display(namespace, bufnr)
+ end,
+ })
registered_autocmds[key] = true
end
end
@@ -368,12 +390,7 @@ local function clear_scheduled_display(namespace, bufnr)
local key = make_augroup_key(namespace, bufnr)
if registered_autocmds[key] then
- vim.cmd(string.format(
- [[augroup %s
- au!
- augroup END]],
- key
- ))
+ vim.api.nvim_del_augroup_by_name(key)
registered_autocmds[key] = nil
end
end
@@ -482,7 +499,8 @@ local function next_diagnostic(position, search_forward, bufnr, opts, namespace)
bufnr = get_bufnr(bufnr)
local wrap = vim.F.if_nil(opts.wrap, true)
local line_count = vim.api.nvim_buf_line_count(bufnr)
- local diagnostics = get_diagnostics(bufnr, vim.tbl_extend('keep', opts, { namespace = namespace }), true)
+ local diagnostics =
+ get_diagnostics(bufnr, vim.tbl_extend('keep', opts, { namespace = namespace }), true)
local line_diagnostics = diagnostic_lines(diagnostics)
for i = 0, line_count do
local offset = i * (search_forward and 1 or -1)
@@ -971,7 +989,10 @@ M.handlers.virtual_text = {
if opts.virtual_text.format then
diagnostics = reformat_diagnostics(opts.virtual_text.format, diagnostics)
end
- if opts.virtual_text.source and (opts.virtual_text.source ~= 'if_many' or count_sources(bufnr) > 1) then
+ if
+ opts.virtual_text.source
+ and (opts.virtual_text.source ~= 'if_many' or count_sources(bufnr) > 1)
+ then
diagnostics = prefix_source(diagnostics)
end
if opts.virtual_text.severity then
@@ -1045,26 +1066,6 @@ function M._get_virt_text_chunks(line_diags, opts)
end
end
---- Callback scheduled when leaving Insert mode.
----
---- This function must be exported publicly so that it is available to be
---- called from the Vimscript autocommand.
----
---- See @ref schedule_display()
----
----@private
-function M._execute_scheduled_display(namespace, bufnr)
- local args = bufs_waiting_to_update[bufnr][namespace]
- if not args then
- return
- end
-
- -- Clear the args so we don't display unnecessarily.
- bufs_waiting_to_update[bufnr][namespace] = nil
-
- M.show(namespace, bufnr, nil, args)
-end
-
--- Hide currently displayed diagnostics.
---
--- This only clears the decorations displayed in the buffer. Diagnostics can
@@ -1279,7 +1280,9 @@ function M.open_float(opts, ...)
-- LSP servers can send diagnostics with `end_col` past the length of the line
local line_length = #vim.api.nvim_buf_get_lines(bufnr, lnum, lnum + 1, true)[1]
diagnostics = vim.tbl_filter(function(d)
- return d.lnum == lnum and math.min(d.col, line_length - 1) <= col and (d.end_col >= col or d.end_lnum > lnum)
+ return d.lnum == lnum
+ and math.min(d.col, line_length - 1) <= col
+ and (d.end_col >= col or d.end_lnum > lnum)
end, diagnostics)
end
@@ -1333,9 +1336,10 @@ function M.open_float(opts, ...)
diagnostics = prefix_source(diagnostics)
end
- local prefix_opt = if_nil(opts.prefix, (scope == 'cursor' and #diagnostics <= 1) and '' or function(_, i)
- return string.format('%d. ', i)
- end)
+ local prefix_opt =
+ if_nil(opts.prefix, (scope == 'cursor' and #diagnostics <= 1) and '' or function(_, i)
+ return string.format('%d. ', i)
+ end)
local prefix, prefix_hl_group
if prefix_opt then