summaryrefslogtreecommitdiff
path: root/autoload
diff options
context:
space:
mode:
authorw0rp <devw0rp@gmail.com>2017-07-13 11:59:28 +0100
committerw0rp <devw0rp@gmail.com>2017-07-13 11:59:33 +0100
commitf7f6f6541dcc7f05d9c31e116e70cb5067c65afa (patch)
treebab9f2445e3e1713a998a2862aa121bb10559d00 /autoload
parentbc97735b6d8778add601e5e71ccbb99237da95eb (diff)
downloadale-f7f6f6541dcc7f05d9c31e116e70cb5067c65afa.zip
Make tsserver completion more reliable, but not quite ready for documentation yet
Diffstat (limited to 'autoload')
-rw-r--r--autoload/ale/completion.vim54
1 files changed, 41 insertions, 13 deletions
diff --git a/autoload/ale/completion.vim b/autoload/ale/completion.vim
index c14dcd14..9792fc53 100644
--- a/autoload/ale/completion.vim
+++ b/autoload/ale/completion.vim
@@ -49,25 +49,32 @@ function! ale#completion#OmniFunc(findstart, base) abort
return l:column - len(l:match) - 1
else
- " Reset the settings now
- let &omnifunc = b:ale_old_omnifunc
- let &completeopt = b:ale_old_completeopt
- let l:response = b:ale_completion_response
- let l:parser = b:ale_completion_parser
+ " Parse a new response if there is one.
+ if exists('b:ale_completion_response')
+ \&& exists('b:ale_completion_parser')
+ let l:response = b:ale_completion_response
+ let l:parser = b:ale_completion_parser
- unlet b:ale_completion_response
- unlet b:ale_completion_parser
- unlet b:ale_old_omnifunc
- unlet b:ale_old_completeopt
+ unlet b:ale_completion_response
+ unlet b:ale_completion_parser
+
+ let b:ale_completion_result = function(l:parser)(l:response)
+ endif
- return function(l:parser)(l:response)
+ return get(b:, 'ale_completion_result', [])
endif
endfunction
function! ale#completion#Show(response, completion_parser) abort
- " Remember the old omnifunc value.
- if !exists('b:ale_old_omnifunc')
+ " Remember the old omnifunc value, if there is one.
+ " If we don't store an old one, we'll just never reset the option.
+ " This will stop some random exceptions from appearing.
+ if !exists('b:ale_old_omnifunc') && !empty(&omnifunc)
let b:ale_old_omnifunc = &omnifunc
+ endif
+
+ " Remember the old completion options, if they are set.
+ if !exists('b:ale_old_completeopt') && !empty(&completeopt)
let b:ale_old_completeopt = &completeopt
endif
@@ -248,6 +255,12 @@ endfunction
function! ale#completion#Queue() abort
let s:timer_pos = getcurpos()[1:2]
+ " If we changed the text again while we're still waiting for a response,
+ " then invalidate the requests before the timer ticks again.
+ if exists('b:ale_completion_info')
+ let b:ale_completion_info.request_id = 0
+ endif
+
if s:timer_id != -1
call timer_stop(s:timer_id)
endif
@@ -255,13 +268,28 @@ function! ale#completion#Queue() abort
let s:timer_id = timer_start(g:ale_completion_delay, function('s:TimerHandler'))
endfunction
+function! ale#completion#Done() abort
+ silent! pclose
+
+ " Reset settings when completion is done.
+ if exists('b:ale_old_omnifunc')
+ let &omnifunc = b:ale_old_omnifunc
+ unlet b:ale_old_omnifunc
+ endif
+
+ if exists('b:ale_old_completeopt')
+ let &completeopt = b:ale_old_completeopt
+ unlet b:ale_old_completeopt
+ endif
+endfunction
+
function! s:Setup(enabled) abort
augroup ALECompletionGroup
autocmd!
if a:enabled
autocmd TextChangedI * call ale#completion#Queue()
- autocmd CompleteDone * silent! pclose
+ autocmd CompleteDone * call ale#completion#Done()
endif
augroup END