mirror of
https://github.com/dense-analysis/ale
synced 2024-12-17 20:05:31 +00:00
Add clang-check linter for C (#4662)
* Close #976 - add clang-check to C linters * Update docs
This commit is contained in:
parent
1ccd99e113
commit
fc45a935bf
38
ale_linters/c/clangcheck.vim
Normal file
38
ale_linters/c/clangcheck.vim
Normal file
@ -0,0 +1,38 @@
|
||||
" Author: gagbo <gagbobada@gmail.com>
|
||||
" : luibo <ng.akhoa98@gmail.com>
|
||||
" : Jorengarenar <jorengarenar@outlook.com>
|
||||
" Description: clang-check linter for C files
|
||||
" modified from cpp/clangcheck.vim to match for C
|
||||
|
||||
call ale#Set('c_clangcheck_executable', 'clang-check')
|
||||
call ale#Set('c_clangcheck_options', '')
|
||||
call ale#Set('c_build_dir', '')
|
||||
|
||||
function! ale_linters#c#clangcheck#GetCommand(buffer) abort
|
||||
let l:user_options = ale#Var(a:buffer, 'c_clangcheck_options')
|
||||
|
||||
" Try to find compilation database to link automatically
|
||||
let l:build_dir = ale#Var(a:buffer, 'c_build_dir')
|
||||
|
||||
if empty(l:build_dir)
|
||||
let [l:root, l:json_file] = ale#c#FindCompileCommands(a:buffer)
|
||||
let l:build_dir = ale#path#Dirname(l:json_file)
|
||||
endif
|
||||
|
||||
" The extra arguments in the command are used to prevent .plist files from
|
||||
" being generated. These are only added if no build directory can be
|
||||
" detected.
|
||||
return '%e -analyze %s'
|
||||
\ . (empty(l:build_dir) ? ' --extra-arg=-Xclang --extra-arg=-analyzer-output=text --extra-arg=-fno-color-diagnostics': '')
|
||||
\ . ale#Pad(l:user_options)
|
||||
\ . (!empty(l:build_dir) ? ' -p ' . ale#Escape(l:build_dir) : '')
|
||||
endfunction
|
||||
|
||||
call ale#linter#Define('c', {
|
||||
\ 'name': 'clangcheck',
|
||||
\ 'output_stream': 'stderr',
|
||||
\ 'executable': {b -> ale#Var(b, 'c_clangcheck_executable')},
|
||||
\ 'command': function('ale_linters#c#clangcheck#GetCommand'),
|
||||
\ 'callback': 'ale#handlers#gcc#HandleGCCFormat',
|
||||
\ 'lint_file': 1,
|
||||
\})
|
@ -25,10 +25,10 @@ g:ale_c_build_dir_names *g:ale_c_build_dir_names*
|
||||
Type: |List|
|
||||
Default: `['build', 'bin']`
|
||||
|
||||
A list of directory names to be used when searching upwards from cpp files
|
||||
A list of directory names to be used when searching upwards from C files
|
||||
to discover compilation databases with. For directory named `'foo'`, ALE
|
||||
will search for `'foo/compile_commands.json'` in all directories on and
|
||||
above the directory containing the cpp file to find path to compilation
|
||||
above the directory containing the C file to find path to compilation
|
||||
database. This feature is useful for the clang tools wrapped around
|
||||
LibTooling (namely here, clang-tidy)
|
||||
|
||||
@ -202,6 +202,37 @@ g:ale_c_ccls_init_options *g:ale_c_ccls_init_options*
|
||||
https://github.com/MaskRay/ccls/wiki/Customization#initialization-options.
|
||||
|
||||
|
||||
===============================================================================
|
||||
clangcheck *ale-c-clangcheck*
|
||||
|
||||
`clang-check` will be run only when files are saved to disk, so that
|
||||
`compile_commands.json` files can be used. It is recommended to use this
|
||||
linter in combination with `compile_commands.json` files.
|
||||
Therefore, `clang-check` linter reads the options |g:ale_c_build_dir| and
|
||||
|g:ale_c_build_dir_names|. Also, setting |g:ale_c_build_dir| actually
|
||||
overrides |g:ale_c_build_dir_names|.
|
||||
|
||||
|
||||
g:ale_c_clangcheck_executable *g:ale_c_clangcheck_executable*
|
||||
*b:ale_c_clangcheck_executable*
|
||||
Type: |String|
|
||||
Default: `'clang-check'`
|
||||
|
||||
This variable can be changed to use a different executable for clangcheck.
|
||||
|
||||
|
||||
g:ale_c_clangcheck_options *g:ale_c_clangcheck_options*
|
||||
*b:ale_c_clangcheck_options*
|
||||
Type: |String|
|
||||
Default: `''`
|
||||
|
||||
This variable can be changed to modify flags given to clang-check.
|
||||
|
||||
This variable should not be set to point to build subdirectory with
|
||||
`-p path/to/build` option, as it is handled by the |g:ale_c_build_dir|
|
||||
option.
|
||||
|
||||
|
||||
===============================================================================
|
||||
clangd *ale-c-clangd*
|
||||
|
||||
@ -378,7 +409,7 @@ g:ale_c_cquery_executable *g:ale_c_cquery_executable*
|
||||
This variable can be changed to use a different executable for cquery.
|
||||
|
||||
|
||||
g:ale_cpp_cquery_cache_directory *g:ale_c_cquery_cache_directory*
|
||||
g:ale_c_cquery_cache_directory *g:ale_c_cquery_cache_directory*
|
||||
*b:ale_c_cquery_cache_directory*
|
||||
Type: |String|
|
||||
Default: `'~/.cache/cquery'`
|
||||
|
@ -67,6 +67,7 @@ Notes:
|
||||
* `ccls`
|
||||
* `clang` (`cc`)
|
||||
* `clang-format`
|
||||
* `clangcheck`!!
|
||||
* `clangd`
|
||||
* `clangtidy`!!
|
||||
* `cppcheck`
|
||||
|
@ -2918,6 +2918,7 @@ documented in additional help files.
|
||||
astyle................................|ale-c-astyle|
|
||||
cc....................................|ale-c-cc|
|
||||
ccls..................................|ale-c-ccls|
|
||||
clangcheck............................|ale-c-clangcheck|
|
||||
clangd................................|ale-c-clangd|
|
||||
clang-format..........................|ale-c-clangformat|
|
||||
clangtidy.............................|ale-c-clangtidy|
|
||||
|
@ -76,6 +76,7 @@ formatting.
|
||||
* [ccls](https://github.com/MaskRay/ccls)
|
||||
* [clang](http://clang.llvm.org/)
|
||||
* [clang-format](https://clang.llvm.org/docs/ClangFormat.html)
|
||||
* [clangcheck](http://clang.llvm.org/docs/ClangCheck.html) :floppy_disk:
|
||||
* [clangd](https://clang.llvm.org/extra/clangd.html)
|
||||
* [clangtidy](http://clang.llvm.org/extra/clang-tidy/) :floppy_disk:
|
||||
* [cppcheck](http://cppcheck.sourceforge.net)
|
||||
|
37
test/linter/test_c_clangcheck.vader
Normal file
37
test/linter/test_c_clangcheck.vader
Normal file
@ -0,0 +1,37 @@
|
||||
# modified from test_cpp_cppcheck.vader
|
||||
|
||||
Before:
|
||||
call ale#assert#SetUpLinterTest('c', 'clangcheck')
|
||||
|
||||
After:
|
||||
call ale#assert#TearDownLinterTest()
|
||||
|
||||
Execute(The executable should be configurable):
|
||||
AssertLinter 'clang-check',
|
||||
\ ale#Escape('clang-check')
|
||||
\ . ' -analyze %s --extra-arg=-Xclang --extra-arg=-analyzer-output=text --extra-arg=-fno-color-diagnostics'
|
||||
|
||||
let b:ale_c_clangcheck_executable = 'foobar'
|
||||
|
||||
" The extra arguments in the command are used to prevent .plist files from
|
||||
" being generated.
|
||||
AssertLinter 'foobar',
|
||||
\ ale#Escape('foobar')
|
||||
\ . ' -analyze %s --extra-arg=-Xclang --extra-arg=-analyzer-output=text --extra-arg=-fno-color-diagnostics'
|
||||
|
||||
Execute(The options should be configurable):
|
||||
let b:ale_c_clangcheck_options = '--something'
|
||||
|
||||
AssertLinter 'clang-check',
|
||||
\ ale#Escape('clang-check')
|
||||
\ . ' -analyze %s'
|
||||
\ . ' --extra-arg=-Xclang --extra-arg=-analyzer-output=text --extra-arg=-fno-color-diagnostics'
|
||||
\ . ' --something'
|
||||
|
||||
Execute(The build directory should be used when set):
|
||||
let b:ale_c_clangcheck_options = '--something'
|
||||
let b:ale_c_build_dir = '/foo/bar'
|
||||
|
||||
AssertLinter 'clang-check',
|
||||
\ ale#Escape('clang-check')
|
||||
\ . ' -analyze %s --something -p ' . ale#Escape('/foo/bar')
|
Loading…
Reference in New Issue
Block a user