Skip to content

Commit

Permalink
#2492 - Try to fix a deoplete bug again
Browse files Browse the repository at this point in the history
  • Loading branch information
w0rp committed May 12, 2019
1 parent 7943bfa commit bfc79bd
Show file tree
Hide file tree
Showing 4 changed files with 103 additions and 6 deletions.
13 changes: 13 additions & 0 deletions autoload/ale/completion.vim
Original file line number Diff line number Diff line change
Expand Up @@ -549,6 +549,19 @@ function! s:OnReady(linter, lsp_details) abort
endif
endfunction

" This function can be called to check if ALE can provide completion data for
" the current buffer. 1 will be returned if there's a potential source of
" completion data ALE can use, and 0 will be returned otherwise.
function! ale#completion#CanProvideCompletions() abort
for l:linter in ale#linter#Get(&filetype)
if !empty(l:linter.lsp)
return 1
endif
endfor

return 0
endfunction

" This function can be used to manually trigger autocomplete, even when
" g:ale_completion_enabled is set to false
function! ale#completion#GetCompletions(source) abort
Expand Down
6 changes: 5 additions & 1 deletion rplugin/python3/deoplete/sources/ale.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,10 @@ def get_completion_position(self):
return self.vim.call('ale#completion#GetCompletionPosition')

def gather_candidates(self, context):
# Stop early if ALE can't provide completion data for this buffer.
if not self.vim.call('ale#completion#CanProvideCompletions'):
return None

if context.get('is_refresh'):
context['is_async'] = False

Expand All @@ -47,4 +51,4 @@ def gather_candidates(self, context):
# Request some completion results.
self.vim.call('ale#completion#GetCompletions', 'deoplete')

return None
return []
63 changes: 63 additions & 0 deletions test/completion/test_public_completion_api.vader
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
Before:
call ale#linter#Reset()

unlet! b:ale_linters
unlet! b:ale_completion_info
unlet! b:ale_completion_response
unlet! b:ale_completion_parser
unlet! b:ale_completion_result

function! Identity(x) abort
return a:x
endfunction

After:
delfunction Identity

call ale#linter#Reset()

unlet! b:ale_linters
unlet! b:ale_completion_info
unlet! b:ale_completion_response
unlet! b:ale_completion_parser
unlet! b:ale_completion_result

Execute(ale#completion#GetCompletionResult() should return v:null when there are no results):
AssertEqual v:null, ale#completion#GetCompletionResult()

Execute(ale#completion#GetCompletionResult() should parse the result when it has yet to be parsed):
let b:ale_completion_response = [1]
let b:ale_completion_parser = 'Identity'

AssertEqual [1], ale#completion#GetCompletionResult()
Assert !exists('b:ale_completion_response')
Assert !exists('b:ale_completion_parser')
AssertEqual [1], b:ale_completion_result

Execute(ale#completion#GetCompletionResult() should return a result computed previously):
let b:ale_completion_result = [1]

Assert !exists('b:ale_completion_response')
Assert !exists('b:ale_completion_parser')
AssertEqual [1], ale#completion#GetCompletionResult()

Execute(ale#completion#GetCompletionPosition() should return 0 when there is no completion information):
AssertEqual 0, ale#completion#GetCompletionPosition()

Given python(Some Python file):
foo bar

Execute(ale#completion#GetCompletionPosition() should return the position in the file when information is available):
let b:ale_completion_info = {'line': 1, 'column': 6}

" This is the first character of 'bar'
AssertEqual 4, ale#completion#GetCompletionPosition()

Execute(ale#completion#CanProvideCompletions should return 0 when no completion sources are available):
AssertEqual 0, ale#completion#CanProvideCompletions()

Execute(ale#completion#CanProvideCompletions should return 1 when at least one completion source is available):
runtime ale_linters/python/pyls.vim
let b:ale_linters = ['pyls']

AssertEqual 1, ale#completion#CanProvideCompletions()
27 changes: 22 additions & 5 deletions test/python/test_deoplete_source.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ def setUp(self):
super(DeopleteSourceTest, self).setUp()

self.call_list = []
self.call_results = {}
self.call_results = {'ale#completion#CanProvideCompletions': 1}
self.source = ale_module.Source('vim')
self.source.vim = VimMock(self.call_list, self.call_results)

Expand Down Expand Up @@ -59,37 +59,52 @@ def test_completion_position(self):
def test_request_completion_results(self):
context = {'is_async': False}

self.assertIsNone(self.source.gather_candidates(context))
self.assertEqual(self.source.gather_candidates(context), [])
self.assertEqual(context, {'is_async': True})
self.assertEqual(self.call_list, [
('ale#completion#CanProvideCompletions', ()),
('ale#completion#GetCompletions', ('deoplete',)),
])

def test_request_completion_results_from_buffer_without_providers(self):
self.call_results['ale#completion#CanProvideCompletions'] = 0
context = {'is_async': False}

self.assertIsNone(self.source.gather_candidates(context), [])
self.assertEqual(context, {'is_async': False})
self.assertEqual(self.call_list, [
('ale#completion#CanProvideCompletions', ()),
])

def test_refresh_completion_results(self):
context = {'is_async': False}

self.assertIsNone(self.source.gather_candidates(context))
self.assertEqual(self.source.gather_candidates(context), [])
self.assertEqual(context, {'is_async': True})
self.assertEqual(self.call_list, [
('ale#completion#CanProvideCompletions', ()),
('ale#completion#GetCompletions', ('deoplete',)),
])

context = {'is_async': True, 'is_refresh': True}

self.assertIsNone(self.source.gather_candidates(context))
self.assertEqual(self.source.gather_candidates(context), [])
self.assertEqual(context, {'is_async': True, 'is_refresh': True})
self.assertEqual(self.call_list, [
('ale#completion#CanProvideCompletions', ()),
('ale#completion#GetCompletions', ('deoplete',)),
('ale#completion#CanProvideCompletions', ()),
('ale#completion#GetCompletions', ('deoplete',)),
])

def test_poll_no_result(self):
context = {'is_async': True}
self.call_results['ale#completion#GetCompletionResult'] = None

self.assertIsNone(self.source.gather_candidates(context))
self.assertEqual(self.source.gather_candidates(context), [])
self.assertEqual(context, {'is_async': True})
self.assertEqual(self.call_list, [
('ale#completion#CanProvideCompletions', ()),
('ale#completion#GetCompletionResult', ()),
])

Expand All @@ -100,6 +115,7 @@ def test_poll_empty_result_ready(self):
self.assertEqual(self.source.gather_candidates(context), [])
self.assertEqual(context, {'is_async': False})
self.assertEqual(self.call_list, [
('ale#completion#CanProvideCompletions', ()),
('ale#completion#GetCompletionResult', ()),
])

Expand All @@ -126,5 +142,6 @@ def test_poll_non_empty_result_ready(self):
])
self.assertEqual(context, {'is_async': False})
self.assertEqual(self.call_list, [
('ale#completion#CanProvideCompletions', ()),
('ale#completion#GetCompletionResult', ()),
])

0 comments on commit bfc79bd

Please sign in to comment.