fix(neovim): ignore unrelated diagnostics (#4597)

Fix the NeoVim diagnostics bridge so it only sends over diagnostics relevant to the current buffer.
This commit is contained in:
xu0o0
2023-09-05 21:34:33 +08:00
committed by GitHub
parent 3bedafc29a
commit ea27441834
2 changed files with 101 additions and 22 deletions

View File

@@ -12,28 +12,30 @@ module.sendAleResultsToDiagnostics = function(buffer, loclist)
-- Convert all the ALE loclist items to the shape that Neovim's diagnostic -- Convert all the ALE loclist items to the shape that Neovim's diagnostic
-- API is expecting. -- API is expecting.
for _, location in ipairs(loclist) do for _, location in ipairs(loclist) do
table.insert( if location.bufnr == buffer then
diagnostics, table.insert(
-- All line numbers from ALE are 1-indexed, but all line numbers diagnostics,
-- in the diagnostics API are 0-indexed, so we have to subtract 1 -- All line numbers from ALE are 1-indexed, but all line numbers
-- to make this work. -- in the diagnostics API are 0-indexed, so we have to subtract 1
{ -- to make this work.
lnum = location.lnum - 1, {
-- Ending line number, or if we don't have one, just make it the same lnum = location.lnum - 1,
-- as the starting line number -- Ending line number, or if we don't have one, just make it the same
end_lnum = (location.end_lnum or location.lnum) - 1, -- as the starting line number
-- Which column does the error start on? end_lnum = (location.end_lnum or location.lnum) - 1,
col = math.max((location.col or 1) - 1, 0), -- Which column does the error start on?
-- end_col does *not* appear to need 1 subtracted, so we don't. col = math.max((location.col or 1) - 1, 0),
end_col = location.end_col, -- end_col does *not* appear to need 1 subtracted, so we don't.
-- Which severity: error, warning, or info? end_col = location.end_col,
severity = ale_type_to_diagnostic_severity[location.type] or "E", -- Which severity: error, warning, or info?
-- The error message severity = ale_type_to_diagnostic_severity[location.type] or "E",
message = location.text, -- The error message
-- e.g. "rubocop" message = location.text,
source = location.linter_name, -- e.g. "rubocop"
} source = location.linter_name,
) }
)
end
end end
local virtualtext_enabled_set = {['all'] = true, ['2'] = true, [2] = true, ['current'] = true, ['1'] = true, [1] = true} local virtualtext_enabled_set = {['all'] = true, ['2'] = true, [2] = true, ['current'] = true, ['1'] = true, [1] = true}

View File

@@ -0,0 +1,77 @@
Before:
Save g:ale_use_neovim_diagnostics_api
function! CollectMessages(buffer)
if !has('nvim-0.6')
return
endif
let l:messages = []
for l:diag in v:lua.vim.diagnostic.get(a:buffer)
call add(l:messages, l:diag.message)
endfor
return l:messages
endfunction
After:
unlet! b:other_bufnr
delfunction CollectMessages
Restore
Execute(Should only set diagnostics belonging to the given buffer):
if has('nvim-0.6')
let b:other_bufnr = bufnr('/foo/bar/baz', 1)
" Make sure we actually get another buffer number, or the test is invalid.
AssertNotEqual -1, b:other_bufnr
let g:ale_use_neovim_diagnostics_api = 1
call ale#engine#SetResults(bufnr('%'), [
\ {
\ 'lnum': 1,
\ 'col': 10,
\ 'bufnr': bufnr('%'),
\ 'vcol': 0,
\ 'linter_name': 'bettercode',
\ 'nr': -1,
\ 'type': 'W',
\ 'text': 'A',
\ },
\ {
\ 'lnum': 2,
\ 'col': 10,
\ 'bufnr': b:other_bufnr,
\ 'vcol': 0,
\ 'linter_name': 'bettercode',
\ 'nr': -1,
\ 'type': 'W',
\ 'text': 'B',
\ },
\ {
\ 'lnum': 3,
\ 'col': 1,
\ 'bufnr': bufnr('%'),
\ 'vcol': 0,
\ 'linter_name': 'bettercode',
\ 'nr': -1,
\ 'type': 'E',
\ 'text': 'C',
\ },
\ {
\ 'lnum': 4,
\ 'col': 1,
\ 'bufnr': b:other_bufnr,
\ 'vcol': 0,
\ 'linter_name': 'bettercode',
\ 'nr': -1,
\ 'type': 'E',
\ 'text': 'D',
\ },
\])
AssertEqual ["A", "C"], CollectMessages(bufnr('%'))
endif