eb6a7b7516
Checkstyle xml configuration is mandatory and not providing one causes the tool to fail with the following error: Must specify a config XML file. Checkstyle itself contains a default configuration as part of its assests named `/google_checks.xml`. Invoking checkstyle with this config works even if such file does not exists in the file system: checkstyle -c /google_checks.xml This should be the default invocation to allow ALE to use checkstyle with zero configuration. Also when a user sets `g:ale_java_checkstyle_config` option, ALE should use it to invoke checkstyle even such file does not exists in the filesystem. This is because checkstyle is able to use configuration files within JAR files defined in the CLASSPATH. The default `/google_checks.xml` is an example of such configuration available within a JAR resource.
71 lines
2.1 KiB
VimL
71 lines
2.1 KiB
VimL
" Author: Devon Meunier <devon.meunier@gmail.com>
|
|
" Description: checkstyle for Java files
|
|
|
|
call ale#Set('java_checkstyle_executable', 'checkstyle')
|
|
call ale#Set('java_checkstyle_config', '/google_checks.xml')
|
|
call ale#Set('java_checkstyle_options', '')
|
|
|
|
function! ale_linters#java#checkstyle#Handle(buffer, lines) abort
|
|
let l:output = []
|
|
|
|
" modern checkstyle versions
|
|
let l:pattern = '\v\[(WARN|ERROR)\] [a-zA-Z]?:?[^:]+:(\d+):(\d+)?:? (.*) \[(.+)\]$'
|
|
|
|
for l:match in ale#util#GetMatches(a:lines, l:pattern)
|
|
call add(l:output, {
|
|
\ 'type': l:match[1] is? 'WARN' ? 'W' : 'E',
|
|
\ 'lnum': l:match[2] + 0,
|
|
\ 'col': l:match[3] + 0,
|
|
\ 'text': l:match[4],
|
|
\ 'code': l:match[5],
|
|
\})
|
|
endfor
|
|
|
|
if !empty(l:output)
|
|
return l:output
|
|
endif
|
|
|
|
" old checkstyle versions
|
|
let l:pattern = '\v(.+):(\d+): ([^:]+): (.+)$'
|
|
|
|
for l:match in ale#util#GetMatches(a:lines, l:pattern)
|
|
call add(l:output, {
|
|
\ 'type': l:match[3] is? 'warning' ? 'W' : 'E',
|
|
\ 'lnum': l:match[2] + 0,
|
|
\ 'text': l:match[4],
|
|
\})
|
|
endfor
|
|
|
|
return l:output
|
|
endfunction
|
|
|
|
function! s:GetConfig(buffer, config) abort
|
|
if ale#path#IsAbsolute(a:config)
|
|
return a:config
|
|
endif
|
|
|
|
let s:file = ale#path#FindNearestFile(a:buffer, a:config)
|
|
|
|
return !empty(s:file) ? s:file : a:config
|
|
endfunction
|
|
|
|
function! ale_linters#java#checkstyle#GetCommand(buffer) abort
|
|
let l:options = ale#Var(a:buffer, 'java_checkstyle_options')
|
|
let l:config_option = ale#Var(a:buffer, 'java_checkstyle_config')
|
|
let l:config = l:options !~# '\v(^| )-c' && !empty(l:config_option)
|
|
\ ? s:GetConfig(a:buffer, l:config_option)
|
|
\ : ''
|
|
|
|
return '%e'
|
|
\ . ale#Pad(l:options)
|
|
\ . (!empty(l:config) ? ' -c ' . ale#Escape(l:config) : '')
|
|
\ . ' %s'
|
|
endfunction
|
|
|
|
call ale#linter#Define('java', {
|
|
\ 'name': 'checkstyle',
|
|
\ 'executable': {b -> ale#Var(b, 'java_checkstyle_executable')},
|
|
\ 'command': function('ale_linters#java#checkstyle#GetCommand'),
|
|
\ 'callback': 'ale_linters#java#checkstyle#Handle',
|
|
\ 'lint_file': 1,
|
|
\})
|