diff --git a/README.md b/README.md index 2bb0ef0..dacd93f 100644 --- a/README.md +++ b/README.md @@ -62,7 +62,7 @@ name. That seems to be the fairest way to arrange this table. | Bash | [-n flag](https://www.gnu.org/software/bash/manual/bash.html#index-set), [shellcheck](https://www.shellcheck.net/) | | Bourne Shell | [-n flag](http://linux.die.net/man/1/sh), [shellcheck](https://www.shellcheck.net/) | | C | [cppcheck](http://cppcheck.sourceforge.net), [gcc](https://gcc.gnu.org/), [clang](http://clang.llvm.org/)| -| C++ (filetype cpp) | [clang](http://clang.llvm.org/), [clangtidy](http://clang.llvm.org/extra/clang-tidy/), [cppcheck](http://cppcheck.sourceforge.net), [cpplint](https://github.com/google/styleguide/tree/gh-pages/cpplint), [gcc](https://gcc.gnu.org/)| +| C++ (filetype cpp) | [clang](http://clang.llvm.org/), [clangcheck](http://clang.llvm.org/docs/ClangCheck.html), [clangtidy](http://clang.llvm.org/extra/clang-tidy/), [cppcheck](http://cppcheck.sourceforge.net), [cpplint](https://github.com/google/styleguide/tree/gh-pages/cpplint), [gcc](https://gcc.gnu.org/)| | C# | [mcs](http://www.mono-project.com/docs/about-mono/languages/csharp/) | | Chef | [foodcritic](http://www.foodcritic.io/) | | CMake | [cmakelint](https://github.com/richq/cmake-lint) | diff --git a/ale_linters/cpp/clangcheck.vim b/ale_linters/cpp/clangcheck.vim new file mode 100644 index 0000000..11184cb --- /dev/null +++ b/ale_linters/cpp/clangcheck.vim @@ -0,0 +1,37 @@ +" Author: gagbo +" Description: clang-check linter for cpp files + +" Set this option to manually set some options for clang-check. +let g:ale_cpp_clangcheck_options = get(g:, 'ale_cpp_clangcheck_options', '') + +" Set this option to manually point to the build directory for clang-tidy. +" This will disable all the other clangtidy_options, since compilation +" flags are contained in the json +let g:ale_c_build_dir = get(g:, 'ale_c_build_dir', '') + +function! ale_linters#cpp#clangcheck#GetCommand(buffer) abort + let l:user_options = ale#Var(a:buffer, 'cpp_clangcheck_options') + let l:extra_options = !empty(l:user_options) + \ ? l:user_options + \ : '' + + " Try to find compilation database to link automatically + let l:user_build_dir = ale#Var(a:buffer, 'c_build_dir') + if empty(l:user_build_dir) + let l:user_build_dir = ale#c#FindCompileCommands(a:buffer) + endif + let l:build_options = !empty(l:user_build_dir) + \ ? ' -p ' . ale#Escape(l:user_build_dir) + \ : '' + + return 'clang-check -analyze ' . '%s' . l:extra_options . l:build_options +endfunction + +call ale#linter#Define('cpp', { +\ 'name': 'clangcheck', +\ 'output_stream': 'stderr', +\ 'executable': 'clang-check', +\ 'command_callback': 'ale_linters#cpp#clangcheck#GetCommand', +\ 'callback': 'ale#handlers#gcc#HandleGCCFormat', +\ 'lint_file': 1, +\}) diff --git a/doc/ale-cpp.txt b/doc/ale-cpp.txt index 27e7fe0..0b9b3ae 100644 --- a/doc/ale-cpp.txt +++ b/doc/ale-cpp.txt @@ -44,6 +44,29 @@ g:ale_cpp_clang_options *g:ale_cpp_clang_options* This variable can be changed to modify flags given to clang. +------------------------------------------------------------------------------- +clangcheck *ale-cpp-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_cpp_clangcheck_options *g:ale_cpp_clangcheck_options* + *b:ale_cpp_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. + + ------------------------------------------------------------------------------- clangtidy *ale-cpp-clangtidy* @@ -73,11 +96,15 @@ g:ale_cpp_clangtidy_options *g:ale_cpp_clangtidy_options* This variable can be changed to modify flags given to clang-tidy. - Setting this variable to a non-empty string will cause the `--` argument - to be passed to `clang-tidy`, which will mean that detection of - `compile_commands.json` files for compile command databases will be - disabled. Only set this option if you want to control compiler flags - entirely manually. + - Setting this variable to a non-empty string, + - and working in a buffer where no compilation database is found using + |g:ale_c_build_dir_names| or |g:ale_c_build_dir|, + will cause the `--` argument to be passed to `clang-tidy`, which will mean + that detection of `compile_commands.json` files for compile command + databases will be disabled. + Only set this option if you want to control compiler flags + entirely manually, and no `compile_commands.json` file is in one + of the |g:ale_c_build_dir_names| directories of the project tree. ------------------------------------------------------------------------------- diff --git a/doc/ale.txt b/doc/ale.txt index 2a760ba..351e12c 100644 --- a/doc/ale.txt +++ b/doc/ale.txt @@ -21,6 +21,7 @@ CONTENTS *ale-contents* foodcritic..........................|ale-chef-foodcritic| cpp...................................|ale-cpp-options| clang...............................|ale-cpp-clang| + clangcheck..........................|ale-cpp-clangcheck| clangtidy...........................|ale-cpp-clangtidy| cppcheck............................|ale-cpp-cppcheck| cpplint.............................|ale-cpp-cpplint|