#2017 Simplify lint cycles for supporting other sources later
This commit is contained in:
parent
9dbebf1cb3
commit
2846e86217
106
autoload/ale.vim
106
autoload/ale.vim
@ -10,8 +10,7 @@ let g:ale_echo_msg_warning_str = get(g:, 'ale_echo_msg_warning_str', 'Warning')
|
|||||||
let g:ale_linters_ignore = get(g:, 'ale_linters_ignore', {})
|
let g:ale_linters_ignore = get(g:, 'ale_linters_ignore', {})
|
||||||
|
|
||||||
let s:lint_timer = -1
|
let s:lint_timer = -1
|
||||||
let s:queued_buffer_number = -1
|
let s:getcmdwintype_exists = exists('*getcmdwintype')
|
||||||
let s:should_lint_file_for_buffer = {}
|
|
||||||
|
|
||||||
" 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(buffer) abort
|
function! ale#FileTooLarge(buffer) abort
|
||||||
@ -20,8 +19,6 @@ function! ale#FileTooLarge(buffer) abort
|
|||||||
return l:max > 0 ? (line2byte(line('$') + 1) > l:max) : 0
|
return l:max > 0 ? (line2byte(line('$') + 1) > l:max) : 0
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
let s:getcmdwintype_exists = exists('*getcmdwintype')
|
|
||||||
|
|
||||||
" A function for checking various conditions whereby ALE just shouldn't
|
" A function for checking various conditions whereby ALE just shouldn't
|
||||||
" attempt to do anything, say if particular buffer types are open in Vim.
|
" attempt to do anything, say if particular buffer types are open in Vim.
|
||||||
function! ale#ShouldDoNothing(buffer) abort
|
function! ale#ShouldDoNothing(buffer) abort
|
||||||
@ -86,18 +83,39 @@ function! ale#ShouldDoNothing(buffer) abort
|
|||||||
return 0
|
return 0
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
function! s:Lint(buffer, should_lint_file, timer_id) abort
|
||||||
|
" Use the filetype from the buffer
|
||||||
|
let l:filetype = getbufvar(a:buffer, '&filetype')
|
||||||
|
let l:linters = ale#linter#Get(l:filetype)
|
||||||
|
|
||||||
|
" Apply ignore lists for linters only if needed.
|
||||||
|
let l:ignore_config = ale#Var(a:buffer, 'linters_ignore')
|
||||||
|
let l:linters = !empty(l:ignore_config)
|
||||||
|
\ ? ale#engine#ignore#Exclude(l:filetype, l:linters, l:ignore_config)
|
||||||
|
\ : l:linters
|
||||||
|
|
||||||
|
" Don't set up buffer data and so on if there are no linters to run.
|
||||||
|
if !has_key(g:ale_buffer_info, a:buffer) && empty(l:linters)
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
" Clear lint_file linters, or only run them if the file exists.
|
||||||
|
let l:lint_file = empty(l:linters)
|
||||||
|
\ || (a:should_lint_file && filereadable(expand('#' . a:buffer . ':p')))
|
||||||
|
|
||||||
|
call ale#engine#RunLinters(a:buffer, l:linters, l:lint_file)
|
||||||
|
endfunction
|
||||||
|
|
||||||
" (delay, [linting_flag, buffer_number])
|
" (delay, [linting_flag, buffer_number])
|
||||||
function! ale#Queue(delay, ...) abort
|
function! ale#Queue(delay, ...) abort
|
||||||
if a:0 > 2
|
if a:0 > 2
|
||||||
throw 'too many arguments!'
|
throw 'too many arguments!'
|
||||||
endif
|
endif
|
||||||
|
|
||||||
" Default linting_flag to ''
|
let l:buffer = get(a:000, 1, v:null)
|
||||||
let l:linting_flag = get(a:000, 0, '')
|
|
||||||
let l:buffer = get(a:000, 1, bufnr(''))
|
|
||||||
|
|
||||||
if l:linting_flag isnot# '' && l:linting_flag isnot# 'lint_file'
|
if l:buffer is v:null
|
||||||
throw "linting_flag must be either '' or 'lint_file'"
|
let l:buffer = bufnr('')
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if type(l:buffer) isnot v:t_number
|
if type(l:buffer) isnot v:t_number
|
||||||
@ -108,80 +126,24 @@ function! ale#Queue(delay, ...) abort
|
|||||||
return
|
return
|
||||||
endif
|
endif
|
||||||
|
|
||||||
" Remember that we want to check files for this buffer.
|
" Default linting_flag to ''
|
||||||
" We will remember this until we finally run the linters, via any event.
|
let l:should_lint_file = get(a:000, 0) is# 'lint_file'
|
||||||
if l:linting_flag is# 'lint_file'
|
|
||||||
let s:should_lint_file_for_buffer[l:buffer] = 1
|
|
||||||
endif
|
|
||||||
|
|
||||||
if s:lint_timer != -1
|
if s:lint_timer != -1
|
||||||
call timer_stop(s:lint_timer)
|
call timer_stop(s:lint_timer)
|
||||||
let s:lint_timer = -1
|
let s:lint_timer = -1
|
||||||
endif
|
endif
|
||||||
|
|
||||||
let l:linters = ale#linter#Get(getbufvar(l:buffer, '&filetype'))
|
|
||||||
|
|
||||||
" Don't set up buffer data and so on if there are no linters to run.
|
|
||||||
if empty(l:linters)
|
|
||||||
" If we have some previous buffer data, then stop any jobs currently
|
|
||||||
" running and clear everything.
|
|
||||||
if has_key(g:ale_buffer_info, l:buffer)
|
|
||||||
call ale#engine#RunLinters(l:buffer, [], 1)
|
|
||||||
endif
|
|
||||||
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
|
|
||||||
if a:delay > 0
|
if a:delay > 0
|
||||||
let s:queued_buffer_number = l:buffer
|
let s:lint_timer = timer_start(
|
||||||
let s:lint_timer = timer_start(a:delay, function('ale#Lint'))
|
\ a:delay,
|
||||||
|
\ function('s:Lint', [l:buffer, l:should_lint_file])
|
||||||
|
\)
|
||||||
else
|
else
|
||||||
call ale#Lint(-1, l:buffer)
|
call s:Lint(l:buffer, l:should_lint_file, 0)
|
||||||
endif
|
endif
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! ale#Lint(...) abort
|
|
||||||
if a:0 > 1
|
|
||||||
" Use the buffer number given as the optional second argument.
|
|
||||||
let l:buffer = a:2
|
|
||||||
elseif a:0 > 0 && a:1 == s:lint_timer
|
|
||||||
" Use the buffer number for the buffer linting was queued for.
|
|
||||||
let l:buffer = s:queued_buffer_number
|
|
||||||
else
|
|
||||||
" Use the current buffer number.
|
|
||||||
let l:buffer = bufnr('')
|
|
||||||
endif
|
|
||||||
|
|
||||||
if ale#ShouldDoNothing(l:buffer)
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Use the filetype from the buffer
|
|
||||||
let l:filetype = getbufvar(l:buffer, '&filetype')
|
|
||||||
let l:linters = ale#linter#Get(l:filetype)
|
|
||||||
let l:should_lint_file = 0
|
|
||||||
|
|
||||||
" Check if we previously requested checking the file.
|
|
||||||
if has_key(s:should_lint_file_for_buffer, l:buffer)
|
|
||||||
unlet s:should_lint_file_for_buffer[l:buffer]
|
|
||||||
" Lint files if they exist.
|
|
||||||
let l:should_lint_file = filereadable(expand('#' . l:buffer . ':p'))
|
|
||||||
endif
|
|
||||||
|
|
||||||
" Apply ignore lists for linters only if needed.
|
|
||||||
let l:ignore_config = ale#Var(l:buffer, 'linters_ignore')
|
|
||||||
let l:linters = !empty(l:ignore_config)
|
|
||||||
\ ? ale#engine#ignore#Exclude(l:filetype, l:linters, l:ignore_config)
|
|
||||||
\ : l:linters
|
|
||||||
|
|
||||||
call ale#engine#RunLinters(l:buffer, l:linters, l:should_lint_file)
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
" Reset flags indicating that files should be checked for all buffers.
|
|
||||||
function! ale#ResetLintFileMarkers() abort
|
|
||||||
let s:should_lint_file_for_buffer = {}
|
|
||||||
endfunction
|
|
||||||
|
|
||||||
let g:ale_has_override = get(g:, 'ale_has_override', {})
|
let g:ale_has_override = get(g:, 'ale_has_override', {})
|
||||||
|
|
||||||
" Call has(), but check a global Dictionary so we can force flags on or off
|
" Call has(), but check a global Dictionary so we can force flags on or off
|
||||||
|
@ -65,7 +65,7 @@ Execute(Linters should run with the default options):
|
|||||||
" Try the test a few times over in NeoVim 0.3 or Windows,
|
" Try the test a few times over in NeoVim 0.3 or Windows,
|
||||||
" where tests fail randomly.
|
" where tests fail randomly.
|
||||||
for g:i in range(has('nvim-0.3') || has('win32') ? 5 : 1)
|
for g:i in range(has('nvim-0.3') || has('win32') ? 5 : 1)
|
||||||
call ale#Lint()
|
call ale#Queue(0, '')
|
||||||
call ale#engine#WaitForJobs(2000)
|
call ale#engine#WaitForJobs(2000)
|
||||||
|
|
||||||
let g:results = ale#test#GetLoclistWithoutModule()
|
let g:results = ale#test#GetLoclistWithoutModule()
|
||||||
@ -109,7 +109,7 @@ Execute(Linters should run in PowerShell too):
|
|||||||
\ 'command': 'echo foo && echo bar',
|
\ 'command': 'echo foo && echo bar',
|
||||||
\})
|
\})
|
||||||
|
|
||||||
call ale#Lint()
|
call ale#Queue(0, '')
|
||||||
call ale#engine#WaitForJobs(4000)
|
call ale#engine#WaitForJobs(4000)
|
||||||
|
|
||||||
AssertEqual [
|
AssertEqual [
|
||||||
@ -139,7 +139,7 @@ Execute(Linters should run in PowerShell too):
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
Execute(Previous errors should be removed when linters change):
|
Execute(Previous errors should be removed when linters change):
|
||||||
call ale#Lint()
|
call ale#Queue(0, '')
|
||||||
call ale#engine#WaitForJobs(2000)
|
call ale#engine#WaitForJobs(2000)
|
||||||
|
|
||||||
call ale#linter#Reset()
|
call ale#linter#Reset()
|
||||||
@ -166,7 +166,7 @@ Execute(Previous errors should be removed when linters change):
|
|||||||
" Try the test a few times over in NeoVim 0.3 or Windows,
|
" Try the test a few times over in NeoVim 0.3 or Windows,
|
||||||
" where tests fail randomly.
|
" where tests fail randomly.
|
||||||
for g:i in range(has('nvim-0.3') || has('win32') ? 5 : 1)
|
for g:i in range(has('nvim-0.3') || has('win32') ? 5 : 1)
|
||||||
call ale#Lint()
|
call ale#Queue(0, '')
|
||||||
call ale#engine#WaitForJobs(2000)
|
call ale#engine#WaitForJobs(2000)
|
||||||
|
|
||||||
let g:results = ale#test#GetLoclistWithoutModule()
|
let g:results = ale#test#GetLoclistWithoutModule()
|
||||||
|
@ -14,7 +14,7 @@ After:
|
|||||||
catch
|
catch
|
||||||
endtry
|
endtry
|
||||||
|
|
||||||
Given foobar(An empty file):
|
Given testft(An empty file):
|
||||||
Execute(Run a lint cycle, and check that a variable is set in the autocmd):
|
Execute(Run a lint cycle, and check that a variable is set in the autocmd):
|
||||||
augroup VaderTest
|
augroup VaderTest
|
||||||
autocmd!
|
autocmd!
|
||||||
@ -22,7 +22,7 @@ Execute(Run a lint cycle, and check that a variable is set in the autocmd):
|
|||||||
autocmd User ALELintPost let g:post_success = 1
|
autocmd User ALELintPost let g:post_success = 1
|
||||||
augroup end
|
augroup end
|
||||||
|
|
||||||
call ale#Lint()
|
call ale#Queue(0)
|
||||||
|
|
||||||
AssertEqual g:pre_success, 1
|
AssertEqual g:pre_success, 1
|
||||||
AssertEqual g:post_success, 1
|
AssertEqual g:post_success, 1
|
||||||
@ -30,10 +30,10 @@ Execute(Run a lint cycle, and check that a variable is set in the autocmd):
|
|||||||
Execute(b:ale_linted should be increased after each lint cycle):
|
Execute(b:ale_linted should be increased after each lint cycle):
|
||||||
AssertEqual get(b:, 'ale_linted'), 0
|
AssertEqual get(b:, 'ale_linted'), 0
|
||||||
|
|
||||||
call ale#Lint()
|
call ale#Queue(0)
|
||||||
|
|
||||||
AssertEqual get(b:, 'ale_linted'), 1
|
AssertEqual get(b:, 'ale_linted'), 1
|
||||||
|
|
||||||
call ale#Lint()
|
call ale#Queue(0)
|
||||||
|
|
||||||
AssertEqual get(b:, 'ale_linted'), 2
|
AssertEqual get(b:, 'ale_linted'), 2
|
||||||
|
@ -62,7 +62,7 @@ Given foobar (Some imaginary filetype):
|
|||||||
|
|
||||||
Execute(Check the results of running the chain):
|
Execute(Check the results of running the chain):
|
||||||
AssertEqual 'foobar', &filetype
|
AssertEqual 'foobar', &filetype
|
||||||
call ale#Lint()
|
call ale#Queue(0)
|
||||||
|
|
||||||
Assert g:first_echo_called, 'The first chain item was not called'
|
Assert g:first_echo_called, 'The first chain item was not called'
|
||||||
Assert g:second_echo_called, 'The second chain item was not called'
|
Assert g:second_echo_called, 'The second chain item was not called'
|
||||||
|
@ -73,7 +73,7 @@ Execute(History should be set when commands are run):
|
|||||||
" Retry this test until it works. This one can randomly fail.
|
" Retry this test until it works. This one can randomly fail.
|
||||||
for g:i in range(has('nvim-0.3') || has('win32') ? 5 : 1)
|
for g:i in range(has('nvim-0.3') || has('win32') ? 5 : 1)
|
||||||
let b:ale_history = []
|
let b:ale_history = []
|
||||||
call ale#Lint()
|
call ale#Queue(0)
|
||||||
call ale#engine#WaitForJobs(2000)
|
call ale#engine#WaitForJobs(2000)
|
||||||
|
|
||||||
let g:history = filter(
|
let g:history = filter(
|
||||||
@ -106,7 +106,7 @@ Execute(History should be not set when disabled):
|
|||||||
|
|
||||||
let g:ale_history_enabled = 0
|
let g:ale_history_enabled = 0
|
||||||
|
|
||||||
call ale#Lint()
|
call ale#Queue(0)
|
||||||
call ale#engine#WaitForJobs(2000)
|
call ale#engine#WaitForJobs(2000)
|
||||||
|
|
||||||
AssertEqual [], ale#history#Get(bufnr(''))
|
AssertEqual [], ale#history#Get(bufnr(''))
|
||||||
@ -120,7 +120,7 @@ Execute(History should include command output if logging is enabled):
|
|||||||
" Retry this test until it works. This one can randomly fail.
|
" Retry this test until it works. This one can randomly fail.
|
||||||
for g:i in range(has('nvim-0.3') || has('win32') ? 5 : 1)
|
for g:i in range(has('nvim-0.3') || has('win32') ? 5 : 1)
|
||||||
let b:ale_history = []
|
let b:ale_history = []
|
||||||
call ale#Lint()
|
call ale#Queue(0)
|
||||||
call ale#engine#WaitForJobs(2000)
|
call ale#engine#WaitForJobs(2000)
|
||||||
|
|
||||||
let g:history = ale#history#Get(bufnr(''))
|
let g:history = ale#history#Get(bufnr(''))
|
||||||
|
@ -138,6 +138,9 @@ After:
|
|||||||
|
|
||||||
Given foobar(An empty file):
|
Given foobar(An empty file):
|
||||||
Execute(Global ignore lists should be applied for linters):
|
Execute(Global ignore lists should be applied for linters):
|
||||||
|
" We have to set up buffer info so RunLinters is called.
|
||||||
|
let g:ale_buffer_info = {bufnr(''): {}}
|
||||||
|
|
||||||
ALELint
|
ALELint
|
||||||
Assert g:run_linters_called, "The mock callback wasn't called"
|
Assert g:run_linters_called, "The mock callback wasn't called"
|
||||||
AssertEqual ['testlinter'], map(g:linters, 'v:val.name')
|
AssertEqual ['testlinter'], map(g:linters, 'v:val.name')
|
||||||
@ -147,6 +150,9 @@ Execute(Global ignore lists should be applied for linters):
|
|||||||
AssertEqual [], g:linters
|
AssertEqual [], g:linters
|
||||||
|
|
||||||
Execute(buffer ignore lists should be applied for linters):
|
Execute(buffer ignore lists should be applied for linters):
|
||||||
|
" We have to set up buffer info so RunLinters is called.
|
||||||
|
let g:ale_buffer_info = {bufnr(''): {}}
|
||||||
|
|
||||||
ALELint
|
ALELint
|
||||||
Assert g:run_linters_called, "The mock callback wasn't called"
|
Assert g:run_linters_called, "The mock callback wasn't called"
|
||||||
AssertEqual ['testlinter'], map(g:linters, 'v:val.name')
|
AssertEqual ['testlinter'], map(g:linters, 'v:val.name')
|
||||||
|
@ -10,7 +10,6 @@ Before:
|
|||||||
let g:ale_run_synchronously = 1
|
let g:ale_run_synchronously = 1
|
||||||
let g:ale_set_lists_synchronously = 1
|
let g:ale_set_lists_synchronously = 1
|
||||||
let b:ale_save_event_fired = 0
|
let b:ale_save_event_fired = 0
|
||||||
call ale#ResetLintFileMarkers()
|
|
||||||
|
|
||||||
let g:buffer_result = [
|
let g:buffer_result = [
|
||||||
\ {
|
\ {
|
||||||
|
@ -10,7 +10,7 @@ Given unite (A Unite.vim file):
|
|||||||
anything
|
anything
|
||||||
|
|
||||||
Execute(Running ALE on a blacklisted file shouldn't change anything):
|
Execute(Running ALE on a blacklisted file shouldn't change anything):
|
||||||
call ale#Lint()
|
call ale#Queue(0)
|
||||||
call ale#engine#WaitForJobs(2000)
|
call ale#engine#WaitForJobs(2000)
|
||||||
|
|
||||||
AssertEqual {}, g:ale_buffer_info
|
AssertEqual {}, g:ale_buffer_info
|
||||||
|
@ -47,7 +47,6 @@ Execute(ALE shouldn't blow up when run from a sandbox):
|
|||||||
|
|
||||||
sandbox call ale#Queue(0)
|
sandbox call ale#Queue(0)
|
||||||
sandbox call ale#Queue(1)
|
sandbox call ale#Queue(1)
|
||||||
sandbox call ale#Lint()
|
|
||||||
|
|
||||||
Execute(ALE shouldn't blow up if file cleanup happens in a sandbox):
|
Execute(ALE shouldn't blow up if file cleanup happens in a sandbox):
|
||||||
" Make a call to an engine function first, so the function will be defined
|
" Make a call to an engine function first, so the function will be defined
|
||||||
|
@ -67,7 +67,7 @@ Given foobar (Some imaginary filetype):
|
|||||||
Execute(ALE should delete managed files/directories appropriately after linting):
|
Execute(ALE should delete managed files/directories appropriately after linting):
|
||||||
AssertEqual 'foobar', &filetype
|
AssertEqual 'foobar', &filetype
|
||||||
|
|
||||||
call ale#Lint()
|
call ale#Queue(0)
|
||||||
call ale#engine#WaitForJobs(2000)
|
call ale#engine#WaitForJobs(2000)
|
||||||
|
|
||||||
Assert !filereadable(g:filename), 'The temporary file was not deleted'
|
Assert !filereadable(g:filename), 'The temporary file was not deleted'
|
||||||
@ -79,7 +79,7 @@ Execute(ALE should delete managed files even if no command is run):
|
|||||||
|
|
||||||
let g:command = ''
|
let g:command = ''
|
||||||
|
|
||||||
call ale#Lint()
|
call ale#Queue(0)
|
||||||
call ale#engine#WaitForJobs(2000)
|
call ale#engine#WaitForJobs(2000)
|
||||||
|
|
||||||
Assert !filereadable(g:filename), 'The temporary file was not deleted'
|
Assert !filereadable(g:filename), 'The temporary file was not deleted'
|
||||||
|
@ -12,7 +12,7 @@ Execute(Set Verilog Verilator linter additional options to `-sv --default-langua
|
|||||||
" Additional args for the linter
|
" Additional args for the linter
|
||||||
let g:ale_verilog_verilator_options = '-sv --default-language "1800-2012"'
|
let g:ale_verilog_verilator_options = '-sv --default-language "1800-2012"'
|
||||||
|
|
||||||
call ale#Lint()
|
call ale#Queue(0)
|
||||||
|
|
||||||
let g:run_cmd = ale_linters#verilog#verilator#GetCommand(bufnr(''))
|
let g:run_cmd = ale_linters#verilog#verilator#GetCommand(bufnr(''))
|
||||||
let g:matched = match(g:run_cmd, '\s' . g:ale_verilog_verilator_options . '\s')
|
let g:matched = match(g:run_cmd, '\s' . g:ale_verilog_verilator_options . '\s')
|
||||||
|
Loading…
x
Reference in New Issue
Block a user