Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Make order of 'info' in completion_info consistent #12971

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
69 changes: 39 additions & 30 deletions src/insexpand.c
Original file line number Diff line number Diff line change
Expand Up @@ -3040,6 +3040,43 @@
}
}

static int
info_add_completion_info(list_T *li)
{
compl_T *match;

if (compl_first_match == NULL)
return OK;

// Skip the element with the CP_ORIGINAL_TEXT flag at the beginning, in case of
// forward completion, or at the end, in case of backward completion.
match = compl_dir_forward()
? compl_first_match->cp_next : compl_first_match->cp_prev->cp_prev;
while (match != NULL && !match_at_original_text(match))
{
dict_T *di = dict_alloc();

if (di == NULL)
return FAIL;

Check warning on line 3060 in src/insexpand.c

View check run for this annotation

Codecov / codecov/patch

src/insexpand.c#L3060

Added line #L3060 was not covered by tests
if (list_append_dict(li, di) == FAIL)
return FAIL;

Check warning on line 3062 in src/insexpand.c

View check run for this annotation

Codecov / codecov/patch

src/insexpand.c#L3062

Added line #L3062 was not covered by tests
dict_add_string(di, "word", match->cp_str);
dict_add_string(di, "abbr", match->cp_text[CPT_ABBR]);
dict_add_string(di, "menu", match->cp_text[CPT_MENU]);
dict_add_string(di, "kind", match->cp_text[CPT_KIND]);
dict_add_string(di, "info", match->cp_text[CPT_INFO]);
if (match->cp_user_data.v_type == VAR_UNKNOWN)
// Add an empty string for backwards compatibility
dict_add_string(di, "user_data", (char_u *)"");
else
dict_add_tv(di, "user_data", &match->cp_user_data);

match = compl_dir_forward() ? match->cp_next : match->cp_prev;
}

return OK;
}

/*
* Get complete information
*/
Expand Down Expand Up @@ -3088,41 +3125,13 @@
if (ret == OK && (what_flag & CI_WHAT_ITEMS))
{
list_T *li;
dict_T *di;
compl_T *match;

li = list_alloc();
if (li == NULL)
return;
ret = dict_add_list(retdict, "items", li);
if (ret == OK && compl_first_match != NULL)
{
match = compl_first_match;
do
{
if (!match_at_original_text(match))
{
di = dict_alloc();
if (di == NULL)
return;
ret = list_append_dict(li, di);
if (ret != OK)
return;
dict_add_string(di, "word", match->cp_str);
dict_add_string(di, "abbr", match->cp_text[CPT_ABBR]);
dict_add_string(di, "menu", match->cp_text[CPT_MENU]);
dict_add_string(di, "kind", match->cp_text[CPT_KIND]);
dict_add_string(di, "info", match->cp_text[CPT_INFO]);
if (match->cp_user_data.v_type == VAR_UNKNOWN)
// Add an empty string for backwards compatibility
dict_add_string(di, "user_data", (char_u *)"");
else
dict_add_tv(di, "user_data", &match->cp_user_data);
}
match = match->cp_next;
}
while (match != NULL && !is_first_match(match));
}
if (ret == OK)
ret = info_add_completion_info(li);
}

if (ret == OK && (what_flag & CI_WHAT_SELECTED))
Expand Down
38 changes: 38 additions & 0 deletions src/testdir/test_ins_complete.vim
Original file line number Diff line number Diff line change
Expand Up @@ -2243,5 +2243,43 @@ func Test_ins_complete_popup_position()
call StopVimInTerminal(buf)
endfunc

func GetCompleteInfo()
let g:compl_info = complete_info()
return ''
endfunc

func Test_complete_info_index()
new
call setline(1, ["aaa", "bbb", "ccc", "ddd", "eee", "fff"])
inoremap <buffer><F5> <C-R>=GetCompleteInfo()<CR>

" Ensure 'index' in complete_info() is coherent with the 'items' array.

set completeopt=menu,preview
" Search forward.
call feedkeys("Go\<C-X>\<C-N>\<F5>\<Esc>_dd", 'tx')
call assert_equal("aaa", g:compl_info['items'][g:compl_info['selected']]['word'])
call feedkeys("Go\<C-X>\<C-N>\<C-N>\<F5>\<Esc>_dd", 'tx')
call assert_equal("bbb", g:compl_info['items'][g:compl_info['selected']]['word'])

" Search backward.
call feedkeys("Go\<C-X>\<C-P>\<F5>\<Esc>_dd", 'tx')
call assert_equal("fff", g:compl_info['items'][g:compl_info['selected']]['word'])
call feedkeys("Go\<C-X>\<C-P>\<C-P>\<F5>\<Esc>_dd", 'tx')
call assert_equal("eee", g:compl_info['items'][g:compl_info['selected']]['word'])

" Add 'noselect', check that 'selected' is -1 when nothing is selected.
set completeopt+=noselect
" Search forward.
call feedkeys("Go\<C-X>\<C-N>\<F5>\<Esc>_dd", 'tx')
call assert_equal(-1, g:compl_info['selected'])

" Search backward.
call feedkeys("Go\<C-X>\<C-P>\<F5>\<Esc>_dd", 'tx')
call assert_equal(-1, g:compl_info['selected'])

set completeopt&
bwipe!
endfunc

" vim: shiftwidth=2 sts=2 expandtab
Loading