Skip to content

Commit

Permalink
Add clang-check linter for C (#4662)
Browse files Browse the repository at this point in the history
* Close #976 - add clang-check to C linters

* Update docs
  • Loading branch information
Jorenar authored Dec 7, 2023
1 parent 1ccd99e commit fc45a93
Show file tree
Hide file tree
Showing 6 changed files with 112 additions and 3 deletions.
38 changes: 38 additions & 0 deletions ale_linters/c/clangcheck.vim
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
" Author: gagbo <[email protected]>
" : luibo <[email protected]>
" : Jorengarenar <[email protected]>
" 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,
\})
37 changes: 34 additions & 3 deletions doc/ale-c.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand Down Expand Up @@ -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*

Expand Down Expand Up @@ -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'`
Expand Down
1 change: 1 addition & 0 deletions doc/ale-supported-languages-and-tools.txt
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ Notes:
* `ccls`
* `clang` (`cc`)
* `clang-format`
* `clangcheck`!!
* `clangd`
* `clangtidy`!!
* `cppcheck`
Expand Down
1 change: 1 addition & 0 deletions doc/ale.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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|
Expand Down
1 change: 1 addition & 0 deletions supported-tools.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
37 changes: 37 additions & 0 deletions test/linter/test_c_clangcheck.vader
Original file line number Diff line number Diff line change
@@ -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')

0 comments on commit fc45a93

Please sign in to comment.