From b4513fc4b0381bdff00c52e294e6da6c7f27aa19 Mon Sep 17 00:00:00 2001 From: Nick Gavalas Date: Mon, 10 Sep 2018 18:55:49 -0400 Subject: [PATCH] fix non-. prefix triggers overfiltering results --- autoload/ale/completion.vim | 8 +++--- .../test_completion_filtering.vader | 26 ++++++++++++++----- 2 files changed, 24 insertions(+), 10 deletions(-) diff --git a/autoload/ale/completion.vim b/autoload/ale/completion.vim index e96774c3..2556d50c 100644 --- a/autoload/ale/completion.vim +++ b/autoload/ale/completion.vim @@ -98,14 +98,15 @@ function! ale#completion#GetTriggerCharacter(filetype, prefix) abort return '' endfunction -function! ale#completion#Filter(buffer, suggestions, prefix) abort +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 a:prefix is# '.' + if index(l:triggers, a:prefix) >= 0 let l:filtered_suggestions = a:suggestions else let l:filtered_suggestions = [] @@ -369,7 +370,7 @@ function! ale#completion#ParseLSPCompletions(response) abort endfor if has_key(l:info, 'prefix') - return ale#completion#Filter(l:buffer, l:results, l:info.prefix) + return ale#completion#Filter(l:buffer, &filetype, l:results, l:info.prefix) endif return l:results @@ -390,6 +391,7 @@ function! ale#completion#HandleTSServerResponse(conn_id, response) abort if l:command is# 'completions' let l:names = ale#completion#Filter( \ l:buffer, + \ &filetype, \ ale#completion#ParseTSServerCompletions(a:response), \ b:ale_completion_info.prefix, \)[: g:ale_completion_max_suggestions - 1] diff --git a/test/completion/test_completion_filtering.vader b/test/completion/test_completion_filtering.vader index ae91a952..ffb313ef 100644 --- a/test/completion/test_completion_filtering.vader +++ b/test/completion/test_completion_filtering.vader @@ -12,16 +12,17 @@ After: Execute(Prefix filtering should work for Lists of strings): AssertEqual \ ['FooBar', 'foo'], - \ ale#completion#Filter(bufnr(''), ['FooBar', 'FongBar', 'baz', 'foo'], 'foo') + \ ale#completion#Filter(bufnr(''), '', ['FooBar', 'FongBar', 'baz', 'foo'], 'foo') AssertEqual \ ['FooBar', 'FongBar', 'baz', 'foo'], - \ ale#completion#Filter(bufnr(''), ['FooBar', 'FongBar', 'baz', 'foo'], '.') + \ ale#completion#Filter(bufnr(''), '', ['FooBar', 'FongBar', 'baz', 'foo'], '.') Execute(Prefix filtering should work for completion items): AssertEqual \ [{'word': 'FooBar'}, {'word': 'foo'}], \ ale#completion#Filter( \ bufnr(''), + \ '', \ [ \ {'word': 'FooBar'}, \ {'word': 'FongBar'}, @@ -40,6 +41,7 @@ Execute(Prefix filtering should work for completion items): \ ], \ ale#completion#Filter( \ bufnr(''), + \ '', \ [ \ {'word': 'FooBar'}, \ {'word': 'FongBar'}, @@ -56,6 +58,7 @@ Execute(Excluding words from completion results should work): \ [{'word': 'Italian'}], \ ale#completion#Filter( \ bufnr(''), + \ '', \ [ \ {'word': 'Italian'}, \ {'word': 'it'}, @@ -67,6 +70,7 @@ Execute(Excluding words from completion results should work): \ [{'word': 'Deutsch'}], \ ale#completion#Filter( \ bufnr(''), + \ '', \ [ \ {'word': 'describe'}, \ {'word': 'Deutsch'}, @@ -78,6 +82,7 @@ Execute(Excluding words from completion results should work): \ [{'word': 'Deutsch'}], \ ale#completion#Filter( \ bufnr(''), + \ '', \ [ \ {'word': 'describe'}, \ {'word': 'Deutsch'}, @@ -90,19 +95,26 @@ Execute(Excluding words from completion results should work with lists of String AssertEqual \ ['Italian'], - \ ale#completion#Filter(bufnr(''), ['Italian', 'it'], 'it') + \ ale#completion#Filter(bufnr(''), '', ['Italian', 'it'], 'it') AssertEqual \ ['Deutsch'], - \ ale#completion#Filter(bufnr(''), ['describe', 'Deutsch'], 'de') + \ ale#completion#Filter(bufnr(''), '', ['describe', 'Deutsch'], 'de') AssertEqual \ ['Deutsch'], - \ ale#completion#Filter(bufnr(''), ['describe', 'Deutsch'], '.') + \ ale#completion#Filter(bufnr(''), '', ['describe', 'Deutsch'], '.') Execute(Filtering shouldn't modify the original list): let b:ale_completion_excluded_words = ['it', 'describe'] let b:suggestions = [{'word': 'describe'}] - AssertEqual [], ale#completion#Filter(bufnr(''), b:suggestions, '.') + AssertEqual [], ale#completion#Filter(bufnr(''), '', b:suggestions, '.') AssertEqual b:suggestions, [{'word': 'describe'}] - AssertEqual [], ale#completion#Filter(bufnr(''), b:suggestions, 'de') + AssertEqual [], ale#completion#Filter(bufnr(''), '', b:suggestions, 'de') AssertEqual b:suggestions, [{'word': 'describe'}] + +Execute(Filtering should respect filetype triggers): + let b:suggestions = [{'word': 'describe'}] + + AssertEqual b:suggestions, ale#completion#Filter(bufnr(''), '', b:suggestions, '.') + AssertEqual b:suggestions, ale#completion#Filter(bufnr(''), 'rust', b:suggestions, '.') + AssertEqual b:suggestions, ale#completion#Filter(bufnr(''), 'rust', b:suggestions, '::')