diff options
author | w0rp <devw0rp@gmail.com> | 2016-10-17 23:26:19 +0100 |
---|---|---|
committer | w0rp <devw0rp@gmail.com> | 2016-10-17 23:26:19 +0100 |
commit | bf45ab6d8d4dd3a97905eeaa4610757cf69c956c (patch) | |
tree | 46000746ebeae64c1b979efafa3e87ec65962798 /autoload | |
parent | 654a1724730e181c80cd262a781055c5a9f0ca05 (diff) | |
download | ale-bf45ab6d8d4dd3a97905eeaa4610757cf69c956c.zip |
Add a function for waiting for linters to complete, and add a test which checks that linting updates the loclist.
Diffstat (limited to 'autoload')
-rw-r--r-- | autoload/ale/engine.vim | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/autoload/ale/engine.vim b/autoload/ale/engine.vim index c530c8a3..2df97385 100644 --- a/autoload/ale/engine.vim +++ b/autoload/ale/engine.vim @@ -254,3 +254,39 @@ function! ale#engine#Invoke(buffer, linter) abort endif endif 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 |