diff options
Diffstat (limited to 'autoload/ale/virtualtext.vim')
-rw-r--r-- | autoload/ale/virtualtext.vim | 48 |
1 files changed, 38 insertions, 10 deletions
diff --git a/autoload/ale/virtualtext.vim b/autoload/ale/virtualtext.vim index 1f4d1fde..551211e8 100644 --- a/autoload/ale/virtualtext.vim +++ b/autoload/ale/virtualtext.vim @@ -274,6 +274,32 @@ function! ale#virtualtext#ShowCursorWarningWithDelay() abort endif endfunction +function! ale#virtualtext#CompareSeverityPerLine(left, right) abort + " Compare lines + if a:left.lnum < a:right.lnum + return -1 + endif + + if a:left.lnum > a:right.lnum + return 1 + endif + + let l:left_priority = ale#util#GetItemPriority(a:left) + let l:right_priority = ale#util#GetItemPriority(a:right) + + " Put highest priority items first. + if l:left_priority > l:right_priority + return -1 + endif + + if l:left_priority < l:right_priority + return 1 + endif + + " Put the first seen problem first. + return a:left.col - a:right.col +endfunction + function! ale#virtualtext#SetTexts(buffer, loclist) abort if !has('nvim') && s:emulate_virt return @@ -281,17 +307,19 @@ function! ale#virtualtext#SetTexts(buffer, loclist) abort call ale#virtualtext#Clear(a:buffer) - let l:filter = ale#Var(a:buffer,'virtualtext_single') - let l:seen = {} + let l:buffer_list = filter(copy(a:loclist), 'v:val.bufnr == a:buffer') - for l:item in a:loclist - if l:item.bufnr == a:buffer - let l:line = max([1, l:item.lnum]) + if ale#Var(a:buffer,'virtualtext_single') + " If we want a single problem per line, sort items on each line by + " highest severity and then lowest column position, then de-duplicate + " the items by line. + call uniq( + \ sort(l:buffer_list, function('ale#virtualtext#CompareSeverityPerLine')), + \ {a, b -> a.lnum - b.lnum} + \) + endif - if !has_key(l:seen,l:line) || l:filter == 0 - call ale#virtualtext#ShowMessage(a:buffer, l:item) - let l:seen[l:line] = 1 - endif - endif + for l:item in l:buffer_list + call ale#virtualtext#ShowMessage(a:buffer, l:item) endfor endfunction |