diff --git a/autoload/ale/engine.vim b/autoload/ale/engine.vim index 005bca4..933be2a 100644 --- a/autoload/ale/engine.vim +++ b/autoload/ale/engine.vim @@ -72,22 +72,39 @@ function! s:StopPreviousJobs(buffer, linter) abort let g:ale_buffer_info[a:buffer].job_list = l:new_job_list endfunction -function! s:GatherOutput(job, data) abort +function! s:GatherOutputVim(channel, data) abort + let l:job_id = s:GetJobID(ch_getjob(a:channel)) + + if !has_key(s:job_info_map, l:job_id) + return + endif + + call add(s:job_info_map[l:job_id].output, a:data) +endfunction + +function! s:GatherOutputNeoVim(job, data, event) abort let l:job_id = s:GetJobID(a:job) if !has_key(s:job_info_map, l:job_id) return endif - call extend(s:job_info_map[l:job_id].output, a:data) + " Join the lines passed to ale, because Neovim splits them up. + " a:data is a list of strings, where every item is a new line, except the + " first one, which is the continuation of the last item passed last time. + call ale#engine#JoinNeovimOutput(s:job_info_map[l:job_id].output, a:data) endfunction -function! s:GatherOutputVim(channel, data) abort - call s:GatherOutput(ch_getjob(a:channel), [a:data]) -endfunction +function! ale#engine#JoinNeovimOutput(output, data) abort + if empty(a:output) + call extend(a:output, a:data) + else + " Extend the previous line, which can be continued. + let a:output[-1] .= get(a:data, 0, '') -function! s:GatherOutputNeoVim(job, data, event) abort - call s:GatherOutput(a:job, a:data) + " Add the new lines. + call extend(a:output, a:data[1:]) + endif endfunction function! s:HandleExit(job) abort diff --git a/test/test_line_join.vader b/test/test_line_join.vader new file mode 100644 index 0000000..26abb7c --- /dev/null +++ b/test/test_line_join.vader @@ -0,0 +1,23 @@ +Before: + let g:test_output = [ + \ ['one', 'two', 'thr'], + \ ['ee', ''], + \ ['fou'], + \ [''], + \ ['r', 'five'], + \ [], + \ ['', 'six'] + \] + + let g:expected_result = ['one', 'two', 'three', 'four', 'five', 'six'] + +After: + unlet g:test_output + unlet g:expected_result + +Execute (Join the lines): + let joined_result = [] + for item in g:test_output + call ale#engine#JoinNeovimOutput(joined_result, item) + endfor + AssertEqual g:expected_result, joined_result