diff --git a/autoload/ale/highlight.vim b/autoload/ale/highlight.vim index 54103aa9..8d70ead5 100644 --- a/autoload/ale/highlight.vim +++ b/autoload/ale/highlight.vim @@ -34,17 +34,35 @@ function! s:GetALEMatches() abort return l:list endfunction +function! s:GetCurrentMatchIDs(loclist) abort + let l:current_id_map = {} + + for l:item in a:loclist + if has_key(l:item, 'match_id') + let l:current_id_map[l:item.match_id] = 1 + endif + endfor + + return l:current_id_map +endfunction + function! ale#highlight#UpdateHighlights() abort let l:buffer = bufnr('%') let l:has_new_items = has_key(s:buffer_highlights, l:buffer) let l:loclist = l:has_new_items ? remove(s:buffer_highlights, l:buffer) : [] + let l:current_id_map = s:GetCurrentMatchIDs(l:loclist) if l:has_new_items || !g:ale_enabled for l:match in s:GetALEMatches() - call matchdelete(l:match['id']) + if !has_key(l:current_id_map, l:match.id) + call matchdelete(l:match.id) + endif endfor endif + " Remove anything with a current match_id + call filter(l:loclist, '!has_key(v:val, ''match_id'')') + if l:has_new_items for l:item in l:loclist let l:col = l:item.col diff --git a/test/test_highlight_placement.vader b/test/test_highlight_placement.vader index 2bf37d19..52e861d9 100644 --- a/test/test_highlight_placement.vader +++ b/test/test_highlight_placement.vader @@ -33,11 +33,13 @@ After: delfunction GenerateResults call ale#linter#Reset() let g:ale_buffer_info = {} + call clearmatches() Given testft(A Javscript file with warnings/errors): foo bar baz wat + line four Execute(Highlights should be set when a linter runs): call ale#Lint() @@ -52,3 +54,23 @@ Execute(Highlights should be set when a linter runs): \ getmatches() AssertEqual [4, 5, 6], map(copy(g:ale_buffer_info[bufnr('')].loclist), 'v:val.match_id') + +Execute(Existing highlights should be kept): + call matchaddpos('ALEError', [[1, 2, 1]], 10, 347) + call matchaddpos('ALEWarning', [[2, 2, 1]], 10, 348) + + call ale#highlight#SetHighlights(bufnr('%'), [ + \ {'bufnr': bufnr('%'), 'match_id': 347, 'type': 'E', 'lnum': 1, 'col': 2}, + \ {'bufnr': bufnr('%'), 'match_id': 348, 'type': 'W', 'lnum': 2, 'col': 2}, + \ {'bufnr': bufnr('%'), 'type': 'E', 'lnum': 3, 'col': 2}, + \ {'bufnr': bufnr('%'), 'type': 'W', 'lnum': 4, 'col': 1}, + \]) + + AssertEqual + \ [ + \ {'group': 'ALEError', 'id': 347, 'priority': 10, 'pos1': [1, 2, 1]}, + \ {'group': 'ALEWarning', 'id': 348, 'priority': 10, 'pos1': [2, 2, 1]}, + \ {'group': 'ALEError', 'id': 7, 'priority': 10, 'pos1': [3, 2, 1]}, + \ {'group': 'ALEWarning', 'id': 8, 'priority': 10, 'pos1': [4, 1, 1]}, + \ ], + \ getmatches()