Compare commits
9 commits
Author | SHA1 | Date | |
---|---|---|---|
|
4c3bd8a84f | ||
|
d1224a05c4 | ||
|
0e4a7a7187 | ||
|
36a3932ce8 | ||
|
67b71653f5 | ||
|
229da9b8ef | ||
|
7e4372bd1f | ||
|
f6fc1edcdc | ||
|
6e5a74285c |
14 changed files with 159 additions and 27 deletions
|
@ -4,6 +4,7 @@
|
||||||
call ale#Set('cpp_flawfinder_executable', 'flawfinder')
|
call ale#Set('cpp_flawfinder_executable', 'flawfinder')
|
||||||
call ale#Set('cpp_flawfinder_options', '')
|
call ale#Set('cpp_flawfinder_options', '')
|
||||||
call ale#Set('cpp_flawfinder_minlevel', 1)
|
call ale#Set('cpp_flawfinder_minlevel', 1)
|
||||||
|
call ale#Set('c_flawfinder_error_severity', 6)
|
||||||
|
|
||||||
function! ale_linters#cpp#flawfinder#GetExecutable(buffer) abort
|
function! ale_linters#cpp#flawfinder#GetExecutable(buffer) abort
|
||||||
return ale#Var(a:buffer, 'cpp_flawfinder_executable')
|
return ale#Var(a:buffer, 'cpp_flawfinder_executable')
|
||||||
|
|
|
@ -24,7 +24,7 @@ function! ale_linters#python#pylint#Handle(buffer, lines) abort
|
||||||
" Matches patterns like the following:
|
" Matches patterns like the following:
|
||||||
"
|
"
|
||||||
" test.py:4:4: W0101 (unreachable) Unreachable code
|
" test.py:4:4: W0101 (unreachable) Unreachable code
|
||||||
let l:pattern = '\v^[^:]+:(\d+):(\d+): ([[:alnum:]]+) \(([^(]*)\) (.*)$'
|
let l:pattern = '\v^[a-zA-Z]?:?[^:]+:(\d+):(\d+): ([[:alnum:]]+) \(([^(]*)\) (.*)$'
|
||||||
let l:output = []
|
let l:output = []
|
||||||
|
|
||||||
for l:match in ale#util#GetMatches(a:lines, l:pattern)
|
for l:match in ale#util#GetMatches(a:lines, l:pattern)
|
||||||
|
|
|
@ -33,6 +33,10 @@ endfunction
|
||||||
|
|
||||||
" Return 1 if a file is too large for ALE to handle.
|
" Return 1 if a file is too large for ALE to handle.
|
||||||
function! ale#FileTooLarge() abort
|
function! ale#FileTooLarge() abort
|
||||||
|
if !exists('g:ale_maximum_file_size')
|
||||||
|
return 0
|
||||||
|
endif
|
||||||
|
|
||||||
let l:max = ale#Var(bufnr(''), 'maximum_file_size')
|
let l:max = ale#Var(bufnr(''), 'maximum_file_size')
|
||||||
|
|
||||||
return l:max > 0 ? (line2byte(line('$') + 1) > l:max) : 0
|
return l:max > 0 ? (line2byte(line('$') + 1) > l:max) : 0
|
||||||
|
@ -46,13 +50,18 @@ function! ale#ShouldDoNothing(buffer) abort
|
||||||
" The checks are split into separate if statements to make it possible to
|
" The checks are split into separate if statements to make it possible to
|
||||||
" profile each check individually with Vim's profiling tools.
|
" profile each check individually with Vim's profiling tools.
|
||||||
|
|
||||||
|
" Do nothing if ALE is disabled.
|
||||||
|
if !getbufvar(a:buffer, 'ale_enabled', get(g:, 'ale_enabled', 0))
|
||||||
|
return 1
|
||||||
|
endif
|
||||||
|
|
||||||
" Don't perform any checks when newer NeoVim versions are exiting.
|
" Don't perform any checks when newer NeoVim versions are exiting.
|
||||||
if get(v:, 'exiting', v:null) isnot v:null
|
if get(v:, 'exiting', v:null) isnot v:null
|
||||||
return 1
|
return 1
|
||||||
endif
|
endif
|
||||||
|
|
||||||
" Do nothing for blacklisted files
|
" Do nothing for blacklisted files
|
||||||
if index(g:ale_filetype_blacklist, getbufvar(a:buffer, '&filetype')) >= 0
|
if index(get(g:, 'ale_filetype_blacklist', []), getbufvar(a:buffer, '&filetype')) >= 0
|
||||||
return 1
|
return 1
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
@ -72,11 +81,6 @@ function! ale#ShouldDoNothing(buffer) abort
|
||||||
return 1
|
return 1
|
||||||
endif
|
endif
|
||||||
|
|
||||||
" Do nothing if ALE is disabled.
|
|
||||||
if !ale#Var(a:buffer, 'enabled')
|
|
||||||
return 1
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Do nothing if the file is too large.
|
" Do nothing if the file is too large.
|
||||||
if ale#FileTooLarge()
|
if ale#FileTooLarge()
|
||||||
return 1
|
return 1
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
" Author: eborden <evan@evan-borden.com>
|
" Author: eborden <evan@evan-borden.com>, ifyouseewendy <ifyouseewendy@gmail.com>, aspidiets <emarshall85@gmail.com>
|
||||||
" Description: Integration of brittany with ALE.
|
" Description: Integration of brittany with ALE.
|
||||||
|
|
||||||
call ale#Set('haskell_brittany_executable', 'brittany')
|
call ale#Set('haskell_brittany_executable', 'brittany')
|
||||||
|
@ -8,6 +8,7 @@ function! ale#fixers#brittany#Fix(buffer) abort
|
||||||
|
|
||||||
return {
|
return {
|
||||||
\ 'command': ale#Escape(l:executable)
|
\ 'command': ale#Escape(l:executable)
|
||||||
|
\ . ' --write-mode inplace'
|
||||||
\ . ' %t',
|
\ . ' %t',
|
||||||
\ 'read_temporary_file': 1,
|
\ 'read_temporary_file': 1,
|
||||||
\}
|
\}
|
||||||
|
|
|
@ -13,23 +13,14 @@ function! ale#handlers#textlint#GetExecutable(buffer) abort
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! ale#handlers#textlint#GetCommand(buffer) abort
|
function! ale#handlers#textlint#GetCommand(buffer) abort
|
||||||
let l:cmd_path = ale#path#FindNearestFile(a:buffer, '.textlintrc')
|
let l:executable = ale#handlers#textlint#GetExecutable(a:buffer)
|
||||||
let l:options = ale#Var(a:buffer, 'textlint_options')
|
let l:options = ale#Var(a:buffer, 'textlint_options')
|
||||||
|
|
||||||
if !empty(l:cmd_path)
|
return ale#node#Executable(a:buffer, l:executable)
|
||||||
return 'textlint'
|
|
||||||
\ . ' -c '
|
|
||||||
\ . l:cmd_path
|
|
||||||
\ . (!empty(l:options) ? ' ' . l:options : '')
|
|
||||||
\ . ' -f json %t'
|
|
||||||
endif
|
|
||||||
|
|
||||||
return 'textlint'
|
|
||||||
\ . (!empty(l:options) ? ' ' . l:options : '')
|
\ . (!empty(l:options) ? ' ' . l:options : '')
|
||||||
\ . ' -f json %t'
|
\ . ' -f json --stdin --stdin-filename %s'
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
|
||||||
function! ale#handlers#textlint#HandleTextlintOutput(buffer, lines) abort
|
function! ale#handlers#textlint#HandleTextlintOutput(buffer, lines) abort
|
||||||
let l:res = get(ale#util#FuzzyJSONDecode(a:lines, []), 0, {'messages': []})
|
let l:res = get(ale#util#FuzzyJSONDecode(a:lines, []), 0, {'messages': []})
|
||||||
let l:output = []
|
let l:output = []
|
||||||
|
|
|
@ -208,7 +208,7 @@ function! ale#job#PrepareCommand(buffer, command) abort
|
||||||
return 'cmd /s/c "' . l:command . '"'
|
return 'cmd /s/c "' . l:command . '"'
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if &shell =~? 'fish$'
|
if &shell =~? 'fish$\|pwsh$'
|
||||||
return ['/bin/sh', '-c', l:command]
|
return ['/bin/sh', '-c', l:command]
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
85
test/command_callback/test_textlint_command_callbacks.vader
Normal file
85
test/command_callback/test_textlint_command_callbacks.vader
Normal file
|
@ -0,0 +1,85 @@
|
||||||
|
" Author: januswel, w0rp
|
||||||
|
|
||||||
|
Before:
|
||||||
|
Save g:ale_textlint_executable
|
||||||
|
Save g:ale_textlint_use_global
|
||||||
|
Save g:ale_textlint_options
|
||||||
|
|
||||||
|
unlet! g:ale_textlint_executable
|
||||||
|
unlet! b:ale_textlint_executable
|
||||||
|
unlet! g:ale_textlint_use_global
|
||||||
|
unlet! b:ale_textlint_use_global
|
||||||
|
unlet! g:ale_textlint_options
|
||||||
|
unlet! b:ale_textlint_options
|
||||||
|
|
||||||
|
runtime autoload/ale/handlers/textlint.vim
|
||||||
|
|
||||||
|
call ale#test#SetDirectory('/testplugin/test/command_callback')
|
||||||
|
|
||||||
|
After:
|
||||||
|
Restore
|
||||||
|
|
||||||
|
unlet! b:command_tail
|
||||||
|
unlet! b:ale_textlint_executable
|
||||||
|
unlet! b:ale_textlint_use_global
|
||||||
|
unlet! b:ale_textlint_options
|
||||||
|
|
||||||
|
call ale#test#RestoreDirectory()
|
||||||
|
call ale#linter#Reset()
|
||||||
|
|
||||||
|
Execute(The executable should be configurable):
|
||||||
|
AssertEqual 'textlint', ale#handlers#textlint#GetExecutable(bufnr(''))
|
||||||
|
|
||||||
|
let b:ale_textlint_executable = 'foobar'
|
||||||
|
|
||||||
|
AssertEqual 'foobar', ale#handlers#textlint#GetExecutable(bufnr(''))
|
||||||
|
|
||||||
|
Execute(The executable should be used in the command):
|
||||||
|
AssertEqual
|
||||||
|
\ ale#Escape('textlint') . ' -f json --stdin --stdin-filename %s',
|
||||||
|
\ ale#handlers#textlint#GetCommand(bufnr(''))
|
||||||
|
|
||||||
|
let b:ale_textlint_executable = 'foobar'
|
||||||
|
|
||||||
|
AssertEqual
|
||||||
|
\ ale#Escape('foobar') . ' -f json --stdin --stdin-filename %s',
|
||||||
|
\ ale#handlers#textlint#GetCommand(bufnr(''))
|
||||||
|
\
|
||||||
|
|
||||||
|
Execute(The options should be configurable):
|
||||||
|
let b:ale_textlint_options = '--something'
|
||||||
|
|
||||||
|
AssertEqual
|
||||||
|
\ ale#Escape('textlint') . ' --something -f json --stdin --stdin-filename %s',
|
||||||
|
\ ale#handlers#textlint#GetCommand(bufnr(''))
|
||||||
|
|
||||||
|
Execute(The local executable from .bin should be used if available):
|
||||||
|
call ale#test#SetFilename('textlint_paths/with_bin_path/foo.txt')
|
||||||
|
|
||||||
|
AssertEqual
|
||||||
|
\ ale#path#Simplify(g:dir . '/textlint_paths/with_bin_path/node_modules/.bin/textlint'),
|
||||||
|
\ ale#handlers#textlint#GetExecutable(bufnr(''))
|
||||||
|
|
||||||
|
AssertEqual
|
||||||
|
\ ale#Escape(ale#path#Simplify(g:dir . '/textlint_paths/with_bin_path/node_modules/.bin/textlint'))
|
||||||
|
\ . ' -f json --stdin --stdin-filename %s',
|
||||||
|
\ ale#handlers#textlint#GetCommand(bufnr(''))
|
||||||
|
|
||||||
|
Execute(The local executable from textlint/bin should be used if available):
|
||||||
|
call ale#test#SetFilename('textlint_paths/with_textlint_bin_path/foo.txt')
|
||||||
|
|
||||||
|
AssertEqual
|
||||||
|
\ ale#path#Simplify(g:dir . '/textlint_paths/with_textlint_bin_path/node_modules/textlint/bin/textlint.js'),
|
||||||
|
\ ale#handlers#textlint#GetExecutable(bufnr(''))
|
||||||
|
|
||||||
|
if has('win32')
|
||||||
|
AssertEqual
|
||||||
|
\ ale#Escape('node.exe') . ' ' . ale#Escape(ale#path#Simplify(g:dir . '/textlint_paths/with_textlint_bin_path/node_modules/textlint/bin/textlint.js'))
|
||||||
|
\ . ' -f json --stdin --stdin-filename %s',
|
||||||
|
\ ale#handlers#textlint#GetCommand(bufnr(''))
|
||||||
|
else
|
||||||
|
AssertEqual
|
||||||
|
\ ale#Escape(ale#path#Simplify(g:dir . '/textlint_paths/with_textlint_bin_path/node_modules/textlint/bin/textlint.js'))
|
||||||
|
\ . ' -f json --stdin --stdin-filename %s',
|
||||||
|
\ ale#handlers#textlint#GetCommand(bufnr(''))
|
||||||
|
endif
|
0
test/command_callback/textlint_paths/with_bin_path/node_modules/.bin/textlint
generated
vendored
Executable file
0
test/command_callback/textlint_paths/with_bin_path/node_modules/.bin/textlint
generated
vendored
Executable file
0
test/command_callback/textlint_paths/with_textlint_bin_path/node_modules/textlint/bin/textlint.js
generated
vendored
Executable file
0
test/command_callback/textlint_paths/with_textlint_bin_path/node_modules/textlint/bin/textlint.js
generated
vendored
Executable file
|
@ -18,6 +18,7 @@ Execute(The brittany callback should return the correct default values):
|
||||||
\ {
|
\ {
|
||||||
\ 'read_temporary_file': 1,
|
\ 'read_temporary_file': 1,
|
||||||
\ 'command': ale#Escape('xxxinvalid')
|
\ 'command': ale#Escape('xxxinvalid')
|
||||||
|
\ . ' --write-mode inplace'
|
||||||
\ . ' %t',
|
\ . ' %t',
|
||||||
\ },
|
\ },
|
||||||
\ ale#fixers#brittany#Fix(bufnr(''))
|
\ ale#fixers#brittany#Fix(bufnr(''))
|
||||||
|
|
|
@ -94,3 +94,22 @@ Execute(Ignoring trailing whitespace messages should work):
|
||||||
\ '------------------------------------------------------------------',
|
\ '------------------------------------------------------------------',
|
||||||
\ 'Your code has been rated at 0.00/10 (previous run: 2.50/10, -2.50)',
|
\ 'Your code has been rated at 0.00/10 (previous run: 2.50/10, -2.50)',
|
||||||
\ ])
|
\ ])
|
||||||
|
|
||||||
|
Execute(The pylint handler should parse Windows filenames):
|
||||||
|
AssertEqual
|
||||||
|
\ [
|
||||||
|
\ {
|
||||||
|
\ 'lnum': 13,
|
||||||
|
\ 'col': 6,
|
||||||
|
\ 'text': 'Undefined variable ''x''',
|
||||||
|
\ 'code': 'undefined-variable',
|
||||||
|
\ 'type': 'E',
|
||||||
|
\ },
|
||||||
|
\ ],
|
||||||
|
\ ale_linters#python#pylint#Handle(bufnr(''), [
|
||||||
|
\ '************* Module test',
|
||||||
|
\ 'D:\acm\github\vim\tools\test.py:13:5: E0602 (undefined-variable) Undefined variable ''x''',
|
||||||
|
\ '',
|
||||||
|
\ '------------------------------------------------------------------',
|
||||||
|
\ 'Your code has been rated at 5.83/10 (previous run: 5.83/10, +0.00)',
|
||||||
|
\ ])
|
||||||
|
|
|
@ -1,11 +1,13 @@
|
||||||
Before:
|
Before:
|
||||||
Save g:ale_filetype_blacklist
|
runtime autoload/ale.vim
|
||||||
|
|
||||||
" Delete some variable which should be defined.
|
" Replace one of the key ALE functions and make it throw.
|
||||||
unlet! g:ale_filetype_blacklist
|
function! ale#FileTooLarge() abort
|
||||||
|
throw 'broken'
|
||||||
|
endfunction
|
||||||
|
|
||||||
After:
|
After:
|
||||||
Restore
|
runtime autoload/ale.vim
|
||||||
|
|
||||||
call ale#ResetErrorDelays()
|
call ale#ResetErrorDelays()
|
||||||
|
|
||||||
|
|
|
@ -22,6 +22,23 @@ Execute(sh should be used when the shell is fish):
|
||||||
AssertEqual ['/bin/sh', '-c', 'foobar'], ale#job#PrepareCommand(bufnr(''), 'foobar')
|
AssertEqual ['/bin/sh', '-c', 'foobar'], ale#job#PrepareCommand(bufnr(''), 'foobar')
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
Execute(sh should be used when the shell is powershell):
|
||||||
|
if !has('win32')
|
||||||
|
" Set something else, so we will replace that too.
|
||||||
|
let &shellcmdflag = '-f'
|
||||||
|
let &shell = 'pwsh'
|
||||||
|
|
||||||
|
AssertEqual ['/bin/sh', '-c', 'foobar'], ale#job#PrepareCommand(bufnr(''), 'foobar')
|
||||||
|
|
||||||
|
let &shell = '/usr/bin/pwsh'
|
||||||
|
|
||||||
|
AssertEqual ['/bin/sh', '-c', 'foobar'], ale#job#PrepareCommand(bufnr(''), 'foobar')
|
||||||
|
|
||||||
|
let &shell = '/usr/local/bin/pwsh'
|
||||||
|
|
||||||
|
AssertEqual ['/bin/sh', '-c', 'foobar'], ale#job#PrepareCommand(bufnr(''), 'foobar')
|
||||||
|
endif
|
||||||
|
|
||||||
Execute(Other shells should be used when set):
|
Execute(Other shells should be used when set):
|
||||||
if !has('win32')
|
if !has('win32')
|
||||||
let &shell = '/bin/bash'
|
let &shell = '/bin/bash'
|
||||||
|
|
|
@ -1,4 +1,7 @@
|
||||||
Before:
|
Before:
|
||||||
|
Save g:ale_filetype_blacklist
|
||||||
|
Save g:ale_maximum_file_size
|
||||||
|
Save g:ale_enabled
|
||||||
Save &l:statusline
|
Save &l:statusline
|
||||||
|
|
||||||
call ale#test#SetDirectory('/testplugin/test')
|
call ale#test#SetDirectory('/testplugin/test')
|
||||||
|
@ -12,6 +15,8 @@ Before:
|
||||||
endif
|
endif
|
||||||
|
|
||||||
After:
|
After:
|
||||||
|
Restore
|
||||||
|
|
||||||
call ale#test#RestoreDirectory()
|
call ale#test#RestoreDirectory()
|
||||||
|
|
||||||
if b:funky_command_created
|
if b:funky_command_created
|
||||||
|
@ -21,8 +26,6 @@ After:
|
||||||
|
|
||||||
unlet! b:funky_command_created
|
unlet! b:funky_command_created
|
||||||
|
|
||||||
Restore
|
|
||||||
|
|
||||||
Execute(ALE shouldn't do much of anything for ctrlp-funky buffers):
|
Execute(ALE shouldn't do much of anything for ctrlp-funky buffers):
|
||||||
Assert !ale#ShouldDoNothing(bufnr('')), 'The preliminary check failed'
|
Assert !ale#ShouldDoNothing(bufnr('')), 'The preliminary check failed'
|
||||||
|
|
||||||
|
@ -39,3 +42,11 @@ Execute(ALE shouldn't try to check buffers with '.' as the filename):
|
||||||
silent! noautocmd file .
|
silent! noautocmd file .
|
||||||
|
|
||||||
Assert ale#ShouldDoNothing(bufnr(''))
|
Assert ale#ShouldDoNothing(bufnr(''))
|
||||||
|
|
||||||
|
Execute(The DoNothing check should work if the ALE globals aren't defined):
|
||||||
|
unlet! g:ale_filetype_blacklist
|
||||||
|
unlet! g:ale_maximum_file_size
|
||||||
|
unlet! g:ale_enabled
|
||||||
|
|
||||||
|
" This shouldn't throw exceptions.
|
||||||
|
call ale#ShouldDoNothing(bufnr(''))
|
||||||
|
|
Reference in a new issue