diff --git a/ale_linters/cpp/clangtidy.vim b/ale_linters/cpp/clangtidy.vim index 5ff345fd..1d5fb77a 100644 --- a/ale_linters/cpp/clangtidy.vim +++ b/ale_linters/cpp/clangtidy.vim @@ -14,15 +14,28 @@ function! ale_linters#cpp#clangtidy#GetExecutable(buffer) abort return ale#Var(a:buffer, 'cpp_clangtidy_executable') endfunction -function! ale_linters#cpp#clangtidy#GetCommand(buffer) abort - let l:checks = join(ale#Var(a:buffer, 'cpp_clangtidy_checks'), ',') +function! s:GetBuildDirectory(buffer) abort + " Don't include build directory for header files, as compile_commands.json + " files don't consider headers to be translation units, and provide no + " commands for compiling header files. + if expand('#' . a:buffer) =~# '\v\.(h|hpp)$' + return '' + endif + let l:build_dir = ale#Var(a:buffer, 'c_build_dir') " c_build_dir has the priority if defined - if empty(l:build_dir) - let l:build_dir = ale#c#FindCompileCommands(a:buffer) + if !empty(l:build_dir) + return l:build_dir endif + return ale#c#FindCompileCommands(a:buffer) +endfunction + +function! ale_linters#cpp#clangtidy#GetCommand(buffer) abort + let l:checks = join(ale#Var(a:buffer, 'cpp_clangtidy_checks'), ',') + let l:build_dir = s:GetBuildDirectory(a:buffer) + " Get the extra options if we couldn't find a build directory. let l:options = empty(l:build_dir) \ ? ale#Var(a:buffer, 'cpp_clangtidy_options') diff --git a/test/command_callback/test_clang_tidy_command_callback.vader b/test/command_callback/test_clang_tidy_command_callback.vader index dc66859a..f9e5781c 100644 --- a/test/command_callback/test_clang_tidy_command_callback.vader +++ b/test/command_callback/test_clang_tidy_command_callback.vader @@ -12,6 +12,8 @@ Before: runtime ale_linters/cpp/clangtidy.vim + call ale#test#SetFilename('test.cpp') + After: unlet! b:ale_c_build_dir unlet! b:ale_cpp_clangtidy_checks @@ -68,6 +70,24 @@ Execute(The build directory setting should override the options): \ . ' -checks=''*'' %s -p ' . ale#Escape('/foo/bar'), \ ale_linters#cpp#clangtidy#GetCommand(bufnr('')) +Execute(The build directory should be ignored for header files): + call ale#test#SetFilename('test.h') + + let b:ale_c_build_dir = '/foo/bar' + let b:ale_cpp_clangtidy_options = '-Wall' + + AssertEqual + \ ale#Escape('clang-tidy') + \ . ' -checks=''*'' %s -- -Wall', + \ ale_linters#cpp#clangtidy#GetCommand(bufnr('')) + \ + call ale#test#SetFilename('test.hpp') + + AssertEqual + \ ale#Escape('clang-tidy') + \ . ' -checks=''*'' %s -- -Wall', + \ ale_linters#cpp#clangtidy#GetCommand(bufnr('')) + Execute(The executable should be configurable): let b:ale_cpp_clangtidy_executable = 'foobar'