From 9baae52d1afab8af832c4249eefc19e7dd28a251 Mon Sep 17 00:00:00 2001 From: Devon Meunier Date: Fri, 12 May 2017 09:42:32 -0400 Subject: [PATCH] Add checkstyle linter --- README.md | 2 +- ale_linters/java/checkstyle.vim | 46 ++++++++++++++++++++++ doc/ale-java.txt | 12 ++++++ doc/ale.txt | 1 + test/handler/test_checkstyle_handler.vader | 21 ++++++++++ 5 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 ale_linters/java/checkstyle.vim create mode 100644 test/handler/test_checkstyle_handler.vader diff --git a/README.md b/README.md index d3fb431..b98c8f8 100644 --- a/README.md +++ b/README.md @@ -78,7 +78,7 @@ name. That seems to be the fairest way to arrange this table. | Handlebars | [ember-template-lint](https://github.com/rwjblue/ember-template-lint) | | Haskell | [ghc](https://www.haskell.org/ghc/), [hlint](https://hackage.haskell.org/package/hlint), [hdevtools](https://hackage.haskell.org/package/hdevtools) | | HTML | [HTMLHint](http://htmlhint.com/), [proselint](http://proselint.com/), [tidy](http://www.html-tidy.org/) | -| Java | [javac](http://www.oracle.com/technetwork/java/javase/downloads/index.html) | +| Java | [checkstyle](http://checkstyle.sourceforge.net), [javac](http://www.oracle.com/technetwork/java/javase/downloads/index.html) | | JavaScript | [eslint](http://eslint.org/), [jscs](http://jscs.info/), [jshint](http://jshint.com/), [flow](https://flowtype.org/), [standard](http://standardjs.com/), [xo](https://github.com/sindresorhus/xo) | JSON | [jsonlint](http://zaa.ch/jsonlint/) | | Kotlin | [kotlinc](https://kotlinlang.org) see `:help ale-integration-kotlin` for configuration instructions diff --git a/ale_linters/java/checkstyle.vim b/ale_linters/java/checkstyle.vim new file mode 100644 index 0000000..d3d4884 --- /dev/null +++ b/ale_linters/java/checkstyle.vim @@ -0,0 +1,46 @@ +" Author: Devon Meunier +" Description: checkstyle for Java files + +function! ale_linters#java#checkstyle#Handle(buffer, lines) abort + let l:patterns = [ + \ '\v\[(WARN|ERROR)\] .*:(\d+):(\d+): (.*)', + \ '\v\[(WARN|ERROR)\] .*:(\d+): (.*)', + \] + let l:output = [] + + for l:match in ale#util#GetMatches(a:lines, l:patterns) + let l:args = { + \ 'lnum': l:match[2] + 0, + \ 'type': l:match[1] =~? 'WARN' ? 'W' : 'E' + \ } + + let l:col = l:match[3] + 0 + if l:col > 0 + let l:args['col'] = l:col + let l:args['text'] = l:match[4] + else + let l:args['text'] = l:match[3] + endif + + call add(l:output, l:args) + endfor + + return l:output +endfunction + +function! ale_linters#java#checkstyle#GetCommand(buffer) abort + return 'checkstyle ' + \ . ale#Var(a:buffer, 'java_checkstyle_options') + \ . ' %t' +endfunction + +if !exists('g:ale_java_checkstyle_options') + let g:ale_java_checkstyle_options = '-c /google_checks.xml' +endif + +call ale#linter#Define('java', { +\ 'name': 'checkstyle', +\ 'executable': 'checkstyle', +\ 'command_callback': 'ale_linters#java#checkstyle#GetCommand', +\ 'callback': 'ale_linters#java#checkstyle#Handle', +\}) diff --git a/doc/ale-java.txt b/doc/ale-java.txt index cbfd4e2..7fb695e 100644 --- a/doc/ale-java.txt +++ b/doc/ale-java.txt @@ -2,6 +2,18 @@ ALE Java Integration *ale-java-options* +------------------------------------------------------------------------------- +checkstyle ale-java-checkstyle + +g:ale_java_checkstyle_options g:ale_java_checkstyle_options + b:ale_java_checkstyle_options + + Type: String + Default: '-c /google_checks.xml' + + This variable can be changed to modify flags given to checkstyle. + + ------------------------------------------------------------------------------- javac *ale-java-javac* diff --git a/doc/ale.txt b/doc/ale.txt index d4d7517..483ce8e 100644 --- a/doc/ale.txt +++ b/doc/ale.txt @@ -39,6 +39,7 @@ CONTENTS *ale-contents* htmlhint............................|ale-html-htmlhint| tidy................................|ale-html-tidy| java..................................|ale-java-options| + checkstyle..........................|ale-java-checkstyle| javac...............................|ale-java-javac| javascript............................|ale-javascript-options| eslint..............................|ale-javascript-eslint| diff --git a/test/handler/test_checkstyle_handler.vader b/test/handler/test_checkstyle_handler.vader new file mode 100644 index 0000000..6234b84 --- /dev/null +++ b/test/handler/test_checkstyle_handler.vader @@ -0,0 +1,21 @@ +Execute(The checkstyle handler should parse lines correctly): + runtime ale_linters/java/checkstyle.vim + + AssertEqual + \ [ + \ { + \ 'lnum': 101, + \ 'text': "'method def rcurly' has incorrect indentation level 4, expected level should be 2. [Indentation]", + \ 'type': 'W', + \ }, + \ { + \ 'lnum': 63, + \ 'col': 3, + \ 'text': "Missing a Javadoc comment. [JavadocMethod]", + \ 'type': 'W', + \ }, + \ ], + \ ale_linters#java#checkstyle#Handle(666, [ + \ "[WARN] whatever:101: 'method def rcurly' has incorrect indentation level 4, expected level should be 2. [Indentation]", + \ "[WARN] whatever:63:3: Missing a Javadoc comment. [JavadocMethod]", + \ ])