summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorw0rp <devw0rp@gmail.com>2017-03-14 20:26:44 +0000
committerw0rp <devw0rp@gmail.com>2017-03-14 20:26:44 +0000
commitd19a35485fef949c823657d548f4c0ddd78bbe4f (patch)
treeb31f1f99748f4058a2be73ab71b8f07e28879934
parent5836d9a9a732f34929b8c78150e9e3ed41bb7318 (diff)
downloadale-d19a35485fef949c823657d548f4c0ddd78bbe4f.zip
#333 Keep any loclist items which have match_id values set on them
-rw-r--r--autoload/ale/highlight.vim20
-rw-r--r--test/test_highlight_placement.vader22
2 files changed, 41 insertions, 1 deletions
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()