diff options
author | w0rp <devw0rp@gmail.com> | 2020-08-20 01:46:29 +0100 |
---|---|---|
committer | w0rp <devw0rp@gmail.com> | 2020-08-20 01:49:14 +0100 |
commit | 2b785688ead505dcbc1007374d3dca9914aa247a (patch) | |
tree | 6ca8b42b3eedc17e60931a6d22f61d71e8e142e3 /ale_linters/cpp | |
parent | 4d42ebc160d7cccd19c37ffe2ccb97752794be37 (diff) | |
download | ale-2b785688ead505dcbc1007374d3dca9914aa247a.zip |
#3299 Merge gcc and clang into a cc linter
Users can easily be confused when they set some options for a C or C++
compiler, and another compiler is run with different options, which
still reports errors. To remedy this, the existing `gcc` and `clang`
linters have been replaced with a `cc` linter that will run either
compiler.
This is a breaking change for ALE v3.0.0.
Diffstat (limited to 'ale_linters/cpp')
-rw-r--r-- | ale_linters/cpp/cc.vim | 53 | ||||
-rw-r--r-- | ale_linters/cpp/clang.vim | 33 | ||||
-rw-r--r-- | ale_linters/cpp/gcc.vim | 38 |
3 files changed, 53 insertions, 71 deletions
diff --git a/ale_linters/cpp/cc.vim b/ale_linters/cpp/cc.vim new file mode 100644 index 00000000..eed3898f --- /dev/null +++ b/ale_linters/cpp/cc.vim @@ -0,0 +1,53 @@ +" Author: w0rp <devw0rp@gmail.com> +" Description: A C++ compiler linter for C++ files with gcc/clang, etc. + +call ale#Set('cpp_cc_executable', '<auto>') +call ale#Set('cpp_cc_options', '-std=c++14 -Wall') + +function! ale_linters#cpp#cc#GetExecutable(buffer) abort + let l:executable = ale#Var(a:buffer, 'cpp_cc_executable') + + " Default to either clang++ or gcc. + if l:executable is# '<auto>' + if ale#engine#IsExecutable(a:buffer, 'clang++') + let l:executable = 'clang++' + else + let l:executable = 'gcc' + endif + endif + + return l:executable +endfunction + +function! ale_linters#cpp#cc#GetCommand(buffer, output) abort + let l:cflags = ale#c#GetCFlags(a:buffer, a:output) + let l:ale_flags = ale#Var(a:buffer, 'cpp_cc_options') + + if l:cflags =~# '-std=' + let l:ale_flags = substitute( + \ l:ale_flags, + \ '-std=\(c\|gnu\)++[0-9]\{2\}', + \ '', + \ 'g') + endif + + " -iquote with the directory the file is in makes #include work for + " headers in the same directory. + " + " `-o /dev/null` or `-o null` is needed to catch all errors, + " -fsyntax-only doesn't catch everything. + return '%e -S -x c++' + \ . ' -o ' . g:ale#util#nul_file + \ . ' -iquote ' . ale#Escape(fnamemodify(bufname(a:buffer), ':p:h')) + \ . ale#Pad(l:cflags) + \ . ale#Pad(l:ale_flags) . ' -' +endfunction + +call ale#linter#Define('cpp', { +\ 'name': 'cc', +\ 'aliases': ['gcc', 'clang', 'g++', 'clang++'], +\ 'output_stream': 'stderr', +\ 'executable': function('ale_linters#cpp#cc#GetExecutable'), +\ 'command': {b -> ale#c#RunMakeCommand(b, function('ale_linters#cpp#cc#GetCommand'))}, +\ 'callback': 'ale#handlers#gcc#HandleGCCFormatWithIncludes', +\}) diff --git a/ale_linters/cpp/clang.vim b/ale_linters/cpp/clang.vim deleted file mode 100644 index d93638ec..00000000 --- a/ale_linters/cpp/clang.vim +++ /dev/null @@ -1,33 +0,0 @@ -" Author: Tomota Nakamura <https://github.com/tomotanakamura> -" Description: clang linter for cpp files - -call ale#Set('cpp_clang_executable', 'clang++') -call ale#Set('cpp_clang_options', '-std=c++14 -Wall') - -function! ale_linters#cpp#clang#GetCommand(buffer, output) abort - let l:cflags = ale#c#GetCFlags(a:buffer, a:output) - let l:ale_flags = ale#Var(a:buffer, 'cpp_clang_options') - - if l:cflags =~# '-std=' - let l:ale_flags = substitute( - \ l:ale_flags, - \ '-std=\(c\|gnu\)++[0-9]\{2\}', - \ '', - \ 'g') - endif - - " -iquote with the directory the file is in makes #include work for - " headers in the same directory. - return '%e -S -x c++ -fsyntax-only' - \ . ' -iquote ' . ale#Escape(fnamemodify(bufname(a:buffer), ':p:h')) - \ . ale#Pad(l:cflags) - \ . ale#Pad(l:ale_flags) . ' -' -endfunction - -call ale#linter#Define('cpp', { -\ 'name': 'clang', -\ 'output_stream': 'stderr', -\ 'executable': {b -> ale#Var(b, 'cpp_clang_executable')}, -\ 'command': {b -> ale#c#RunMakeCommand(b, function('ale_linters#cpp#clang#GetCommand'))}, -\ 'callback': 'ale#handlers#gcc#HandleGCCFormatWithIncludes', -\}) diff --git a/ale_linters/cpp/gcc.vim b/ale_linters/cpp/gcc.vim deleted file mode 100644 index 89c2d358..00000000 --- a/ale_linters/cpp/gcc.vim +++ /dev/null @@ -1,38 +0,0 @@ -" Author: geam <mdelage@student.42.fr> -" Description: gcc linter for cpp files -" -call ale#Set('cpp_gcc_executable', 'gcc') -call ale#Set('cpp_gcc_options', '-std=c++14 -Wall') - -function! ale_linters#cpp#gcc#GetCommand(buffer, output) abort - let l:cflags = ale#c#GetCFlags(a:buffer, a:output) - let l:ale_flags = ale#Var(a:buffer, 'cpp_gcc_options') - - if l:cflags =~# '-std=' - let l:ale_flags = substitute( - \ l:ale_flags, - \ '-std=\(c\|gnu\)++[0-9]\{2\}', - \ '', - \ 'g') - endif - - " -iquote with the directory the file is in makes #include work for - " headers in the same directory. - " - " `-o /dev/null` or `-o null` is needed to catch all errors, - " -fsyntax-only doesn't catch everything. - return '%e -S -x c++' - \ . ' -o ' . g:ale#util#nul_file - \ . ' -iquote ' . ale#Escape(fnamemodify(bufname(a:buffer), ':p:h')) - \ . ale#Pad(l:cflags) - \ . ale#Pad(l:ale_flags) . ' -' -endfunction - -call ale#linter#Define('cpp', { -\ 'name': 'gcc', -\ 'aliases': ['g++'], -\ 'output_stream': 'stderr', -\ 'executable': {b -> ale#Var(b, 'cpp_gcc_executable')}, -\ 'command': {b -> ale#c#RunMakeCommand(b, function('ale_linters#cpp#gcc#GetCommand'))}, -\ 'callback': 'ale#handlers#gcc#HandleGCCFormatWithIncludes', -\}) |