summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJerko Steiner <jerko.steiner@gmail.com>2019-01-08 15:09:59 +0100
committerJerko Steiner <jerko.steiner@gmail.com>2019-01-08 15:10:03 +0100
commitb1b05e6e66f84e93ebf521444e3d21500a87bcdf (patch)
treecfa2a901c8c0342af9e862715c2eaff9c5a3cc3c
parent9bcf8a2336ff6f98e5032d30e17c2671d66946fe (diff)
downloadale-b1b05e6e66f84e93ebf521444e3d21500a87bcdf.zip
Optimize ale#completion#Filter when prefix is ""
-rw-r--r--autoload/ale/completion.vim62
-rw-r--r--plugin/ale.vim2
-rw-r--r--test/completion/test_completion_filtering.vader3
-rw-r--r--test/test_ale_complete_command.vader6
4 files changed, 44 insertions, 29 deletions
diff --git a/autoload/ale/completion.vim b/autoload/ale/completion.vim
index b0981f37..157cac36 100644
--- a/autoload/ale/completion.vim
+++ b/autoload/ale/completion.vim
@@ -89,6 +89,10 @@ function! ale#completion#GetPrefix(filetype, line, column) abort
endfunction
function! ale#completion#GetTriggerCharacter(filetype, prefix) abort
+ if empty(a:prefix)
+ return ''
+ endif
+
let l:char_list = s:GetFiletypeValue(s:trigger_character_map, a:filetype)
if index(l:char_list, a:prefix) >= 0
@@ -100,33 +104,38 @@ endfunction
function! ale#completion#Filter(buffer, filetype, suggestions, prefix) abort
let l:excluded_words = ale#Var(a:buffer, 'completion_excluded_words')
- let l:triggers = s:GetFiletypeValue(s:trigger_character_map, a:filetype)
- " For completing...
- " foo.
- " ^
- " We need to include all of the given suggestions.
- if index(l:triggers, a:prefix) >= 0 || empty(a:prefix)
+ if empty(a:prefix)
let l:filtered_suggestions = a:suggestions
else
- let l:filtered_suggestions = []
-
- " Filter suggestions down to those starting with the prefix we used for
- " finding suggestions in the first place.
- "
- " Some completion tools will include suggestions which don't even start
- " with the characters we have already typed.
- for l:item in a:suggestions
- " A List of String values or a List of completion item Dictionaries
- " is accepted here.
- let l:word = type(l:item) is v:t_string ? l:item : l:item.word
-
- " Add suggestions if the suggestion starts with a case-insensitive
- " match for the prefix.
- if l:word[: len(a:prefix) - 1] is? a:prefix
- call add(l:filtered_suggestions, l:item)
- endif
- endfor
+ let l:triggers = s:GetFiletypeValue(s:trigger_character_map, a:filetype)
+
+ " For completing...
+ " foo.
+ " ^
+ " We need to include all of the given suggestions.
+ if index(l:triggers, a:prefix) >= 0 || empty(a:prefix)
+ let l:filtered_suggestions = a:suggestions
+ else
+ let l:filtered_suggestions = []
+
+ " Filter suggestions down to those starting with the prefix we
+ " used for finding suggestions in the first place.
+ "
+ " Some completion tools will include suggestions which don't even
+ " start with the characters we have already typed.
+ for l:item in a:suggestions
+ " A List of String values or a List of completion item
+ " Dictionaries is accepted here.
+ let l:word = type(l:item) is v:t_string ? l:item : l:item.word
+
+ " Add suggestions if the suggestion starts with a
+ " case-insensitive match for the prefix.
+ if l:word[: len(a:prefix) - 1] is? a:prefix
+ call add(l:filtered_suggestions, l:item)
+ endif
+ endfor
+ endif
endif
if !empty(l:excluded_words)
@@ -514,13 +523,12 @@ endfunction
" This function can be used to manually trigger autocomplete, even when
" g:ale_completion_enabled is set to false
-function! ale#completion#AlwaysGetCompletions(...) abort
- let l:need_prefix = get(a:, 1, 0)
+function! ale#completion#AlwaysGetCompletions(need_prefix) abort
let [l:line, l:column] = getcurpos()[1:2]
let l:prefix = ale#completion#GetPrefix(&filetype, l:line, l:column)
- if l:need_prefix && empty(l:prefix)
+ if a:need_prefix && empty(l:prefix)
return
endif
diff --git a/plugin/ale.vim b/plugin/ale.vim
index 4af59a91..15e50e9f 100644
--- a/plugin/ale.vim
+++ b/plugin/ale.vim
@@ -204,7 +204,7 @@ command! -bar ALEDocumentation :call ale#hover#ShowDocumentationAtCursor()
" Search for appearances of a symbol, such as a type name or function name.
command! -nargs=1 ALESymbolSearch :call ale#symbol#Search(<q-args>)
-command! -bar ALEComplete :call ale#completion#AlwaysGetCompletions()
+command! -bar ALEComplete :call ale#completion#AlwaysGetCompletions(0)
" <Plug> mappings for commands
nnoremap <silent> <Plug>(ale_previous) :ALEPrevious<Return>
diff --git a/test/completion/test_completion_filtering.vader b/test/completion/test_completion_filtering.vader
index 1122ab60..c5f14266 100644
--- a/test/completion/test_completion_filtering.vader
+++ b/test/completion/test_completion_filtering.vader
@@ -105,6 +105,9 @@ Execute(Excluding words from completion results should work with lists of String
AssertEqual
\ ['Deutsch'],
\ ale#completion#Filter(bufnr(''), '', ['describe', 'Deutsch'], '.')
+ AssertEqual
+ \ ['Deutsch'],
+ \ ale#completion#Filter(bufnr(''), '', ['Deutsch'], '')
Execute(Filtering shouldn't modify the original list):
let b:ale_completion_excluded_words = ['it', 'describe']
diff --git a/test/test_ale_complete_command.vader b/test/test_ale_complete_command.vader
index c6ef8bf5..11f781c2 100644
--- a/test/test_ale_complete_command.vader
+++ b/test/test_ale_complete_command.vader
@@ -1,9 +1,11 @@
Before:
function! MockAlwaysGetCompletions() abort
let g:get_completions_called = 0
+ let g:always_get_completions_argument = -1
- function! ale#completion#AlwaysGetCompletions() abort
+ function! ale#completion#AlwaysGetCompletions(need_prefix) abort
let g:get_completions_called = 1
+ let g:always_get_completions_argument = a:need_prefix
endfunction
endfunction
@@ -11,6 +13,7 @@ Before:
After:
unlet! g:get_completions_called
+ unlet! g:always_get_completions_argument
delfunction MockAlwaysGetCompletions
delfunction ale#completion#AlwaysGetCompletions
@@ -20,3 +23,4 @@ Execute(ale#completion#AlwaysGetCompletions should be called when ALEComplete is
AssertEqual 0, g:get_completions_called
ALEComplete
AssertEqual 1, g:get_completions_called
+ AssertEqual 0, g:always_get_completions_argument