Skip to content

Commit

Permalink
Add support for selene Lua linter (#4169)
Browse files Browse the repository at this point in the history
  • Loading branch information
deathlyfrantic authored Apr 30, 2022
1 parent 3348222 commit 57e1695
Show file tree
Hide file tree
Showing 7 changed files with 126 additions and 0 deletions.
47 changes: 47 additions & 0 deletions ale_linters/lua/selene.vim
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
call ale#Set('lua_selene_executable', 'selene')
call ale#Set('lua_selene_options', '')

function! ale_linters#lua#selene#GetCommand(buffer) abort
return '%e' . ale#Pad(ale#Var(a:buffer, 'lua_selene_options'))
\ . ' --display-style=json %s'
endfunction

function! ale_linters#lua#selene#Handle(buffer, lines) abort
let l:output = []

for l:line in a:lines
" as of version 0.17.0, selene has no way to suppress summary
" information when outputting json, so stop processing when we hit it
" (PR for this here: https://github.com/Kampfkarren/selene/pull/356)
if l:line is# 'Results:'
break
endif

let l:json = json_decode(l:line)
let l:lint = {
\ 'lnum': l:json.primary_label.span.start_line + 1,
\ 'end_lnum': l:json.primary_label.span.end_line + 1,
\ 'col': l:json.primary_label.span.start_column + 1,
\ 'end_col': l:json.primary_label.span.end_column,
\ 'text': l:json.message,
\ 'code': l:json.code,
\ 'type': l:json.severity is# 'Warning' ? 'W' : 'E',
\}

if has_key(l:json, 'notes') && len(l:json.notes) > 0
let l:lint.detail = l:lint.text . "\n\n" . join(l:json.notes, "\n")
endif

call add(l:output, l:lint)
endfor

return l:output
endfunction

call ale#linter#Define('lua', {
\ 'name': 'selene',
\ 'executable': {b -> ale#Var(b, 'lua_selene_executable')},
\ 'command': function('ale_linters#lua#selene#GetCommand'),
\ 'callback': 'ale_linters#lua#selene#Handle',
\ 'lint_file': 1,
\})
19 changes: 19 additions & 0 deletions doc/ale-lua.txt
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,25 @@ g:ale_lua_luafmt_options *g:ale_lua_luafmt_options*
This variable can be set to pass additional options to the luafmt fixer.


===============================================================================
selene *ale-lua-selene*

g:ale_lua_selene_executable *g:ale_lua_selene_executable*
*b:ale_lua_selene_executable*
Type: |String|
Default: `'selene'`

This variable can be set to use a different executable for selene.


g:ale_lua_selene_options *g:ale_lua_selene_options*
*b:ale_lua_selene_options*
Type: |String|
Default: `''`

This variable can be set to pass additional options to selene.


===============================================================================
stylua *ale-lua-stylua*

Expand Down
1 change: 1 addition & 0 deletions doc/ale-supported-languages-and-tools.txt
Original file line number Diff line number Diff line change
Expand Up @@ -327,6 +327,7 @@ Notes:
* `luac`
* `luacheck`
* `luafmt`
* `selene`
* `stylua`
* Mail
* `alex`
Expand Down
1 change: 1 addition & 0 deletions doc/ale.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2980,6 +2980,7 @@ documented in additional help files.
luac..................................|ale-lua-luac|
luacheck..............................|ale-lua-luacheck|
luafmt................................|ale-lua-luafmt|
selene................................|ale-lua-selene|
stylua................................|ale-lua-stylua|
markdown................................|ale-markdown-options|
cspell................................|ale-markdown-cspell|
Expand Down
1 change: 1 addition & 0 deletions supported-tools.md
Original file line number Diff line number Diff line change
Expand Up @@ -336,6 +336,7 @@ formatting.
* [luac](https://www.lua.org/manual/5.1/luac.html)
* [luacheck](https://github.com/mpeterv/luacheck)
* [luafmt](https://github.com/trixnz/lua-fmt)
* [selene](https://github.com/Kampfkarren/selene)
* [stylua](https://github.com/johnnymorganz/stylua)
* Mail
* [alex](https://github.com/get-alex/alex)
Expand Down
38 changes: 38 additions & 0 deletions test/handler/test_lua_selene_handler.vader
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
Before:
runtime ale_linters/lua/selene.vim

After:
Restore
call ale#linter#Reset()

Execute(The selene handler for Lua should parse input correctly):
AssertEqual
\ [
\ {
\ 'lnum': 1,
\ 'end_lnum': 2,
\ 'col': 1,
\ 'end_col': 3,
\ 'text': 'empty if block',
\ 'code': 'empty_if',
\ 'type': 'W',
\ },
\ {
\ 'lnum': 1,
\ 'end_lnum': 1,
\ 'col': 4,
\ 'end_col': 11,
\ 'text': 'comparing things to nan directly is not allowed',
\ 'code': 'compare_nan',
\ 'type': 'E',
\ 'detail': "comparing things to nan directly is not allowed\n\ntry: `x ~= x` instead"
\ },
\ ],
\ ale_linters#lua#selene#Handle(0, [
\ '{"severity":"Warning","code":"empty_if","message":"empty if block","primary_label":{"span":{"start":0,"start_line":0,"start_column":0,"end":20,"end_line":1,"end_column":3},"message":""},"notes":[],"secondary_labels":[]}',
\ '{"severity":"Error","code":"compare_nan","message":"comparing things to nan directly is not allowed","primary_label":{"span":{"start":3,"start_line":0,"start_column":3,"end":11,"end_line":0,"end_column":11},"message":""},"notes":["try: `x ~= x` instead"],"secondary_labels":[]}',
\ 'Results:',
\ '1 errors',
\ '1 warnings',
\ '0 parse errors',
\ ])
19 changes: 19 additions & 0 deletions test/linter/test_lua_selene.vader
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
Before:
call ale#assert#SetUpLinterTest('lua', 'selene')

After:
call ale#assert#TearDownLinterTest()

Execute(The lua selene command callback should return the correct default string):
AssertLinter 'selene', ale#Escape('selene') . ' --display-style=json %s'

Execute(The lua selene command callback should let you set options):
let g:ale_lua_selene_options = '--num-threads 2'

AssertLinter 'selene',
\ ale#Escape('selene') . ' --num-threads 2 --display-style=json %s'

Execute(The selene executable should be configurable):
let g:ale_lua_selene_executable = 'selene.sh'

AssertLinter 'selene.sh', ale#Escape('selene.sh') . ' --display-style=json %s'

0 comments on commit 57e1695

Please sign in to comment.