-
Notifications
You must be signed in to change notification settings - Fork 1.4k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add support for selene Lua linter (#4169)
- Loading branch information
1 parent
3348222
commit 57e1695
Showing
7 changed files
with
126 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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, | ||
\}) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -327,6 +327,7 @@ Notes: | |
* `luac` | ||
* `luacheck` | ||
* `luafmt` | ||
* `selene` | ||
* `stylua` | ||
* `alex` | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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', | ||
\ ]) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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' |