Add a function for waiting for linters to complete, and add a test which checks that linting updates the loclist.

This commit is contained in:
w0rp 2016-10-17 23:26:19 +01:00
parent 654a172473
commit bf45ab6d8d
3 changed files with 64 additions and 0 deletions

11
.eslintrc.js Normal file
View file

@ -0,0 +1,11 @@
module.exports = {
parserOptions: {
ecmaVersion: 6,
sourceType: "module",
},
rules: {
semi: 'error',
'space-infix-ops': 'warn',
radix: 'error',
}
}

View file

@ -254,3 +254,39 @@ function! ale#engine#Invoke(buffer, linter) abort
endif endif
endif endif
endfunction endfunction
" This function can be called with a timeout to wait for all jobs to finish.
" If the jobs to not finish in the given number of milliseconds,
" an exception will be thrown.
"
" The time taken will be a very rough approximation, and more time may be
" permitted than is specified.
function! ale#engine#WaitForJobs(deadline) abort
let l:time_ticked = 0
let l:job_list = []
for l:job_id in keys(s:job_info_map)
call add(l:job_list, s:job_info_map[l:job_id].linter.job)
endfor
let l:should_wait_more = 1
while l:should_wait_more
let l:should_wait_more = 0
for l:job in l:job_list
if job_status(l:job) ==# 'run'
if l:time_ticked > a:deadline
" Stop waiting after a timeout, so we don't wait forever.
throw 'Jobs did not complete on time!'
endif
" Wait another 10 milliseconds
let l:time_ticked += 10
let l:should_wait_more = 1
sleep 10ms
break
endif
endfor
endwhile
endfunction

View file

@ -0,0 +1,17 @@
Given javascript (Some JavaScript with problems):
var y = 3+3;
var y = 3
Before:
let g:ale_buffer_loclist_map = {}
let g:expected_data = {bufnr('%'): [{'lnum': 1, 'bufnr': bufnr('%'), 'vcol': 0, 'linter_name': 'eslint', 'nr': -1, 'type': 'W', 'col': 10, 'text': 'Infix operators must be spaced. (space-infix-ops)'}, {'lnum': 2, 'bufnr': bufnr('%'), 'vcol': 0, 'linter_name': 'eslint', 'nr': -1, 'type': 'E', 'col': 10, 'text': 'Missing semicolon. (semi)'}]}
After:
let g:ale_buffer_loclist_map = {}
unlet g:expected_data
Execute(The loclist should be updated after linting is done):
call ale#Lint()
call ale#engine#WaitForJobs(2000)
AssertEqual g:expected_data, g:ale_buffer_loclist_map