mirror of
https://github.com/neovim/neovim.git
synced 2026-02-19 09:58:32 +00:00
feat(diagnostic): fromqflist({merge_lines}) #37416
Problem:
`vim.diagnostic.fromqflist` ignores lines that are `item.valid == 0` (see
`getqflist`). Many qflists have messages that span multiple lines, which look
like this:
collection/src/Modelling/CdOd/Central.hs|496 col 80| error: [GHC-83865]
|| • Couldn't match expected type: InstanceWithForm
|| (FilePath
|| -> SelectValidCdInstWithForm
...
calling `vim.diagnostic.fromqflist(vim.fn.getqflist)` gets a diagnostic message
like this:
error: [GHC-83865]
only the first line is kept, but often, the remaing lines are useful as well.
Solution:
Introduce `merge_lines` option, which "squashes" lines from invalid qflist items
into the error message of the previous valid item, so that we get this
diagnostic message instead:
error: [GHC-83865]
• Couldn't match expected type: InstanceWithForm
(FilePath
-> SelectValidCdInstWithForm
This commit is contained in:
committed by
GitHub
parent
0864939cc5
commit
01666aae64
@@ -2913,14 +2913,27 @@ function M.toqflist(diagnostics)
|
||||
return list
|
||||
end
|
||||
|
||||
--- Configuration table with the following keys:
|
||||
--- @class vim.diagnostic.fromqflist.Opts
|
||||
--- @inlinedoc
|
||||
---
|
||||
--- When true, items with valid=0 are appended to the previous valid item's
|
||||
--- message with a newline. (default: false)
|
||||
--- @field merge_lines? boolean
|
||||
|
||||
--- Convert a list of quickfix items to a list of diagnostics.
|
||||
---
|
||||
---@param list table[] List of quickfix items from |getqflist()| or |getloclist()|.
|
||||
---@param list vim.quickfix.entry[] List of quickfix items from |getqflist()| or |getloclist()|.
|
||||
---@param opts? vim.diagnostic.fromqflist.Opts
|
||||
---@return vim.Diagnostic[]
|
||||
function M.fromqflist(list)
|
||||
function M.fromqflist(list, opts)
|
||||
vim.validate('list', list, 'table')
|
||||
|
||||
opts = opts or {}
|
||||
local merge = opts.merge_lines
|
||||
|
||||
local diagnostics = {} --- @type vim.Diagnostic[]
|
||||
local last_diag --- @type vim.Diagnostic?
|
||||
for _, item in ipairs(list) do
|
||||
if item.valid == 1 then
|
||||
local lnum = math.max(0, item.lnum - 1)
|
||||
@@ -2929,7 +2942,7 @@ function M.fromqflist(list)
|
||||
local end_col = item.end_col > 0 and (item.end_col - 1) or col
|
||||
local code = item.nr > 0 and item.nr or nil
|
||||
local severity = item.type ~= '' and M.severity[item.type:upper()] or M.severity.ERROR
|
||||
diagnostics[#diagnostics + 1] = {
|
||||
local diag = {
|
||||
bufnr = item.bufnr,
|
||||
lnum = lnum,
|
||||
col = col,
|
||||
@@ -2939,6 +2952,10 @@ function M.fromqflist(list)
|
||||
message = item.text,
|
||||
code = code,
|
||||
}
|
||||
diagnostics[#diagnostics + 1] = diag
|
||||
last_diag = diag
|
||||
elseif merge and last_diag then
|
||||
last_diag.message = last_diag.message .. '\n' .. item.text
|
||||
end
|
||||
end
|
||||
return diagnostics
|
||||
|
||||
Reference in New Issue
Block a user