summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ale_linters/cpp/clangtidy.vim21
-rw-r--r--test/command_callback/test_clang_tidy_command_callback.vader20
2 files changed, 37 insertions, 4 deletions
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'