summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--plugin/ale/sign.vim28
1 files changed, 25 insertions, 3 deletions
diff --git a/plugin/ale/sign.vim b/plugin/ale/sign.vim
index 7eb858ba..4797e52b 100644
--- a/plugin/ale/sign.vim
+++ b/plugin/ale/sign.vim
@@ -30,14 +30,36 @@ function! ale#sign#SetSigns(loclist)
exec 'sign unplace * buffer=' . buffer
- for i in range(0, len(a:loclist) - 1)
- let obj = a:loclist[i]
+ let signlist = []
+
+ for obj in a:loclist
+ let should_append = 1
+
+ if len(signlist) > 0 && signlist[-1].lnum == obj.lnum
+ " We can't add the same line twice, because signs must be
+ " unique per line.
+ let should_append = 0
+
+ if signlist[-1].type ==# 'W' && obj.type ==# 'E'
+ " If we had a warning previously, but now have an error,
+ " we replace the object to set an error instead.
+ let signlist[-1] = obj
+ endif
+ endif
+
+ if should_append
+ call add(signlist, obj)
+ endif
+ endfor
+
+ for i in range(0, len(signlist) - 1)
+ let obj = signlist[i]
let name = obj['type'] ==# 'W' ? 'ALEWarningSign' : 'ALEErrorSign'
let sign_line = 'sign place ' . (i + 1)
\. ' line=' . obj['lnum']
\. ' name=' . name
- \. ' buffer=' . obj['bufnr']
+ \. ' buffer=' . buffer
exec sign_line
endfor