Add a linter for clojure using clj-kondo (#2377)
This commit is contained in:
parent
16b43a5708
commit
4813165614
6 changed files with 119 additions and 0 deletions
34
ale_linters/clojure/clj_kondo.vim
Normal file
34
ale_linters/clojure/clj_kondo.vim
Normal file
|
@ -0,0 +1,34 @@
|
|||
" Author: Masashi Iizuka <liquidz.uo@gmail.com>
|
||||
" Description: linter for clojure using clj-kondo https://github.com/borkdude/clj-kondo
|
||||
|
||||
function! ale_linters#clojure#clj_kondo#HandleCljKondoFormat(buffer, lines) abort
|
||||
" output format
|
||||
" <filename>:<line>:<column>: <issue type>: <message>
|
||||
let l:pattern = '\v^[a-zA-Z]?:?[^:]+:(\d+):(\d+):? ((Exception|error|warning): ?(.+))$'
|
||||
let l:output = []
|
||||
|
||||
for l:match in ale#util#GetMatches(a:lines, l:pattern)
|
||||
let l:type = 'E'
|
||||
|
||||
if l:match[4] is? 'warning'
|
||||
let l:type = 'W'
|
||||
endif
|
||||
|
||||
call add(l:output, {
|
||||
\ 'lnum': l:match[1] + 0,
|
||||
\ 'col': l:match[2] + 0,
|
||||
\ 'text': l:match[3],
|
||||
\ 'type': l:type,
|
||||
\})
|
||||
endfor
|
||||
|
||||
return l:output
|
||||
endfunction
|
||||
|
||||
call ale#linter#Define('clojure', {
|
||||
\ 'name': 'clj-kondo',
|
||||
\ 'output_stream': 'stdout',
|
||||
\ 'executable': 'clj-kondo',
|
||||
\ 'command': 'clj-kondo --lint %t',
|
||||
\ 'callback': 'ale_linters#clojure#clj_kondo#HandleCljKondoFormat',
|
||||
\})
|
|
@ -2,6 +2,13 @@
|
|||
ALE Clojure Integration *ale-clojure-options*
|
||||
|
||||
|
||||
===============================================================================
|
||||
clj-kondo *ale-clojure-clj-kondo*
|
||||
|
||||
A minimal and opinionated linter for code that sparks joy.
|
||||
|
||||
https://github.com/borkdude/clj-kondo
|
||||
|
||||
===============================================================================
|
||||
joker *ale-clojure-joker*
|
||||
|
||||
|
|
|
@ -74,6 +74,7 @@ Notes:
|
|||
* `cookstyle`
|
||||
* `foodcritic`
|
||||
* Clojure
|
||||
* `clj-kondo`
|
||||
* `joker`
|
||||
* CloudFormation
|
||||
* `cfn-python-lint`
|
||||
|
|
|
@ -1867,6 +1867,7 @@ documented in additional help files.
|
|||
cookstyle.............................|ale-chef-cookstyle|
|
||||
foodcritic............................|ale-chef-foodcritic|
|
||||
clojure.................................|ale-clojure-options|
|
||||
clj-kondo.............................|ale-clojure-clj-kondo|
|
||||
joker.................................|ale-clojure-joker|
|
||||
cloudformation..........................|ale-cloudformation-options|
|
||||
cfn-python-lint.......................|ale-cloudformation-cfn-python-lint|
|
||||
|
|
|
@ -83,6 +83,7 @@ formatting.
|
|||
* [cookstyle](https://docs.chef.io/cookstyle.html)
|
||||
* [foodcritic](http://www.foodcritic.io/)
|
||||
* Clojure
|
||||
* [clj-kondo](https://github.com/borkdude/clj-kondo)
|
||||
* [joker](https://github.com/candid82/joker)
|
||||
* CloudFormation
|
||||
* [cfn-python-lint](https://github.com/awslabs/cfn-python-lint)
|
||||
|
|
75
test/handler/test_clojure_clj_kondo_handler.vader
Normal file
75
test/handler/test_clojure_clj_kondo_handler.vader
Normal file
|
@ -0,0 +1,75 @@
|
|||
Before:
|
||||
runtime ale_linters/clojure/clj_kondo.vim
|
||||
|
||||
After:
|
||||
call ale#linter#Reset()
|
||||
|
||||
Execute(the clojure clj-kondo handler should be able to handle errors):
|
||||
AssertEqual
|
||||
\ [
|
||||
\ {
|
||||
\ 'lnum': 123,
|
||||
\ 'col': 44,
|
||||
\ 'type': 'E',
|
||||
\ 'text': 'error: Unexpected )',
|
||||
\ },
|
||||
\ ],
|
||||
\ ale_linters#clojure#clj_kondo#HandleCljKondoFormat(0, [
|
||||
\ 'test.clj:123:44: error: Unexpected )',
|
||||
\ ])
|
||||
|
||||
Execute(the clojure clj-kondo handler should be able to handle warnings):
|
||||
AssertEqual
|
||||
\ [
|
||||
\ {
|
||||
\ 'lnum': 654,
|
||||
\ 'col': 321,
|
||||
\ 'type': 'W',
|
||||
\ 'text': 'warning: inline def',
|
||||
\ }
|
||||
\ ],
|
||||
\ ale_linters#clojure#clj_kondo#HandleCljKondoFormat(0, [
|
||||
\ 'test.clj:654:321: warning: inline def'
|
||||
\ ])
|
||||
|
||||
Execute(the clojure clj-kondo handler should be able to handle exceptions):
|
||||
AssertEqual
|
||||
\ [
|
||||
\ {
|
||||
\ 'lnum': 123,
|
||||
\ 'col': 321,
|
||||
\ 'type': 'E',
|
||||
\ 'text': 'Exception: something horrible happen',
|
||||
\ }
|
||||
\ ],
|
||||
\ ale_linters#clojure#clj_kondo#HandleCljKondoFormat(0, [
|
||||
\ 'test.clj:123:321: Exception: something horrible happen'
|
||||
\ ])
|
||||
|
||||
Execute(the clojure clj-kondo handler should be able to handle errors from stdin):
|
||||
AssertEqual
|
||||
\ [
|
||||
\ {
|
||||
\ 'lnum': 16,
|
||||
\ 'col': 1,
|
||||
\ 'type': 'E',
|
||||
\ 'text': 'error: Unexpected )',
|
||||
\ },
|
||||
\ ],
|
||||
\ ale_linters#clojure#clj_kondo#HandleCljKondoFormat(0, [
|
||||
\ '<stdin>:16:1: error: Unexpected )',
|
||||
\ ])
|
||||
|
||||
Execute(the clojure clj-kondo handler should be able to handle windows files):
|
||||
AssertEqual
|
||||
\ [
|
||||
\ {
|
||||
\ 'lnum': 123,
|
||||
\ 'col': 44,
|
||||
\ 'type': 'E',
|
||||
\ 'text': 'error: Unexpected )',
|
||||
\ }
|
||||
\ ],
|
||||
\ ale_linters#clojure#clj_kondo#HandleCljKondoFormat(0, [
|
||||
\ 'C:\my\operating\system\is\silly\core.clj:123:44: error: Unexpected )',
|
||||
\ ])
|
Reference in a new issue