mirror of
https://github.com/dense-analysis/ale.git
synced 2025-12-10 06:21:53 +08:00
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:
@@ -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}
|
||||||
|
|||||||
77
test/test_neovim_diagnostics.vader
Normal file
77
test/test_neovim_diagnostics.vader
Normal 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
|
||||||
Reference in New Issue
Block a user