diff --git a/autoload/ale/handlers/gcc.vim b/autoload/ale/handlers/gcc.vim index eb42b27..09a1848 100644 --- a/autoload/ale/handlers/gcc.vim +++ b/autoload/ale/handlers/gcc.vim @@ -99,12 +99,17 @@ function! ale#handlers#gcc#HandleGCCFormat(buffer, lines) abort continue endif - call add(l:output, { + let l:obj = { \ 'lnum': l:match[2] + 0, \ 'col': l:match[3] + 0, \ 'type': l:match[4] =~# 'error' ? 'E' : 'W', \ 'text': s:RemoveUnicodeQuotes(l:match[5]), - \}) + \} + + " clang++ and some other tools can output duplicated errors. + if empty(l:output) || l:output[-1] != l:obj + call add(l:output, l:obj) + endif endif endfor diff --git a/test/handler/test_gcc_handler.vader b/test/handler/test_gcc_handler.vader index 72b7c54..2934bbe 100644 --- a/test/handler/test_gcc_handler.vader +++ b/test/handler/test_gcc_handler.vader @@ -94,3 +94,29 @@ Execute(The GCC handler shouldn't complain about #pragma once for headers): \ ale#handlers#gcc#HandleGCCFormat(347, [ \ ':1:1: warning: #pragma once in main file [enabled by default]', \ ]) + +Execute(The GCC handler should eliminate duplicated clang errors): + AssertEqual + \ [ + \ {'lnum': 2, 'col': 10, 'type': 'E', 'text': '''a.h'' file not found'}, + \ {'lnum': 4, 'col': 10, 'type': 'E', 'text': 'empty filename'}, + \ ], + \ ale#handlers#gcc#HandleGCCFormat(347, [ + \ ':2:10: fatal error: ''a.h'' file not found', + \ '#include "a.h"', + \ ' ^~~~~', + \ '', + \ ':2:10: fatal error: ''a.h'' file not found', + \ '#include "a.h"', + \ ' ^~~~~', + \ '', + \ ':4:10: error: empty filename', + \ '', + \ ':4:10: error: empty filename', + \ '#include ""', + \ ' ^', + \ '', + \ ':4:10: error: empty filename', + \ '#include ""', + \ ' ^', + \ ])