summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--autoload/ale/engine.vim23
-rw-r--r--test/test_lint_file_linters.vader20
2 files changed, 39 insertions, 4 deletions
diff --git a/autoload/ale/engine.vim b/autoload/ale/engine.vim
index b22b1a6d..59ba0fc8 100644
--- a/autoload/ale/engine.vim
+++ b/autoload/ale/engine.vim
@@ -460,6 +460,7 @@ function! s:RunJob(options) abort
let l:output_stream = a:options.output_stream
let l:next_chain_index = a:options.next_chain_index
let l:read_buffer = a:options.read_buffer
+ let l:info = g:ale_buffer_info[l:buffer]
if empty(l:command)
return 0
@@ -515,8 +516,11 @@ function! s:RunJob(options) abort
" Only proceed if the job is being run.
if l:job_id
" Add the job to the list of jobs, so we can track them.
- call add(g:ale_buffer_info[l:buffer].job_list, l:job_id)
- call add(g:ale_buffer_info[l:buffer].active_linter_list, l:linter.name)
+ call add(l:info.job_list, l:job_id)
+
+ if index(l:info.active_linter_list, l:linter.name) < 0
+ call add(l:info.active_linter_list, l:linter.name)
+ endif
let l:status = 'started'
" Store the ID for the job in the map to read back again.
@@ -531,7 +535,7 @@ function! s:RunJob(options) abort
if g:ale_history_enabled
call ale#history#Add(l:buffer, l:status, l:job_id, l:command)
else
- let g:ale_buffer_info[l:buffer].history = []
+ let l:info.history = []
endif
if get(g:, 'ale_run_synchronously') == 1
@@ -624,6 +628,7 @@ endfunction
function! s:StopCurrentJobs(buffer, include_lint_file_jobs) abort
let l:info = get(g:ale_buffer_info, a:buffer, {})
let l:new_job_list = []
+ let l:new_active_linter_list = []
for l:job_id in get(l:info, 'job_list', [])
let l:job_info = get(s:job_info_map, l:job_id, {})
@@ -634,15 +639,23 @@ function! s:StopCurrentJobs(buffer, include_lint_file_jobs) abort
call remove(s:job_info_map, l:job_id)
else
call add(l:new_job_list, l:job_id)
+ " Linters with jobs still running are still active.
+ call add(l:new_active_linter_list, l:job_info.linter.name)
endif
endif
endfor
+ " Remove duplicates from the active linter list.
+ call uniq(sort(l:new_active_linter_list))
+
" Update the List, so it includes only the jobs we still need.
let l:info.job_list = l:new_job_list
+ " Update the active linter list, clearing out anything not running.
+ let l:info.active_linter_list = l:new_active_linter_list
endfunction
function! s:CheckWithLSP(buffer, linter) abort
+ let l:info = g:ale_buffer_info[a:buffer]
let l:lsp_details = ale#linter#StartLSP(
\ a:buffer,
\ a:linter,
@@ -665,7 +678,9 @@ function! s:CheckWithLSP(buffer, linter) abort
let l:request_id = ale#lsp#Send(l:id, l:change_message, l:root)
if l:request_id != 0
- call add(g:ale_buffer_info[a:buffer].active_linter_list, a:linter.name)
+ if index(l:info.active_linter_list, a:linter.name) < 0
+ call add(l:info.active_linter_list, a:linter.name)
+ endif
endif
return l:request_id != 0
diff --git a/test/test_lint_file_linters.vader b/test/test_lint_file_linters.vader
index 2eb9b2e6..cb859790 100644
--- a/test/test_lint_file_linters.vader
+++ b/test/test_lint_file_linters.vader
@@ -79,6 +79,10 @@ Before:
call ale#test#SetFilename(g:filename)
After:
+ if !g:ale_run_synchronously
+ call ale#engine#WaitForJobs(2000)
+ endif
+
Restore
unlet! b:ale_save_event_fired
@@ -267,3 +271,19 @@ Execute(b:ale_save_event_fired should be set to 0 when results are set):
call ale#engine#SetResults(bufnr(''), [])
AssertEqual 0, b:ale_save_event_fired
+
+Execute(lint_file linters should stay running after checking without them):
+ let g:ale_run_synchronously = 0
+
+ " Run all linters, then just the buffer linters.
+ call ale#Queue(0, 'lint_file')
+ call ale#Queue(0)
+
+ " The lint_file linter should still be running.
+ AssertEqual
+ \ ['lint_file_linter', 'buffer_linter'],
+ \ g:ale_buffer_info[bufnr('')].active_linter_list
+ " We should have 1 job for each linter.
+ AssertEqual 2, len(g:ale_buffer_info[bufnr('')].job_list)
+
+ call ale#engine#WaitForJobs(2000)