Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add clang-check linter for C #4662

Merged
merged 2 commits into from
Dec 7, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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')