mirror of
https://github.com/neovim/neovim.git
synced 2025-10-06 09:56:31 +00:00
vim-patch:9.0.2018: complete_info() returns wrong index (#25607)
Problem: complete_info() returns wrong index
Solution: Make order of 'info' in completion_info consistent
Start the iteration from the same point and follow the same direction as
done when assigning the completion numbers. This way we remove the
dependence on the completion direction and make the order of 'info'
consistent.
closes: vim/vim#12230
closes: vim/vim#12971
69fb5afb3b
Co-authored-by: LemonBoy <thatlemon@gmail.com>
This commit is contained in:
@@ -2693,6 +2693,38 @@ static void ins_compl_update_sequence_numbers(void)
|
||||
}
|
||||
}
|
||||
|
||||
static int info_add_completion_info(list_T *li)
|
||||
{
|
||||
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.
|
||||
compl_T *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 = tv_dict_alloc();
|
||||
|
||||
tv_list_append_dict(li, di);
|
||||
tv_dict_add_str(di, S_LEN("word"), EMPTY_IF_NULL(match->cp_str));
|
||||
tv_dict_add_str(di, S_LEN("abbr"), EMPTY_IF_NULL(match->cp_text[CPT_ABBR]));
|
||||
tv_dict_add_str(di, S_LEN("menu"), EMPTY_IF_NULL(match->cp_text[CPT_MENU]));
|
||||
tv_dict_add_str(di, S_LEN("kind"), EMPTY_IF_NULL(match->cp_text[CPT_KIND]));
|
||||
tv_dict_add_str(di, S_LEN("info"), EMPTY_IF_NULL(match->cp_text[CPT_INFO]));
|
||||
if (match->cp_user_data.v_type == VAR_UNKNOWN) {
|
||||
// Add an empty string for backwards compatibility
|
||||
tv_dict_add_str(di, S_LEN("user_data"), "");
|
||||
} else {
|
||||
tv_dict_add_tv(di, S_LEN("user_data"), &match->cp_user_data);
|
||||
}
|
||||
|
||||
match = compl_dir_forward() ? match->cp_next : match->cp_prev;
|
||||
}
|
||||
|
||||
return OK;
|
||||
}
|
||||
|
||||
/// Get complete information
|
||||
static void get_complete_info(list_T *what_list, dict_T *retdict)
|
||||
{
|
||||
@@ -2738,29 +2770,9 @@ static void get_complete_info(list_T *what_list, dict_T *retdict)
|
||||
|
||||
if (ret == OK && (what_flag & CI_WHAT_ITEMS)) {
|
||||
list_T *li = tv_list_alloc(get_compl_len());
|
||||
|
||||
ret = tv_dict_add_list(retdict, S_LEN("items"), li);
|
||||
if (ret == OK && compl_first_match != NULL) {
|
||||
compl_T *match = compl_first_match;
|
||||
do {
|
||||
if (!match_at_original_text(match)) {
|
||||
dict_T *di = tv_dict_alloc();
|
||||
|
||||
tv_list_append_dict(li, di);
|
||||
tv_dict_add_str(di, S_LEN("word"), EMPTY_IF_NULL(match->cp_str));
|
||||
tv_dict_add_str(di, S_LEN("abbr"), EMPTY_IF_NULL(match->cp_text[CPT_ABBR]));
|
||||
tv_dict_add_str(di, S_LEN("menu"), EMPTY_IF_NULL(match->cp_text[CPT_MENU]));
|
||||
tv_dict_add_str(di, S_LEN("kind"), EMPTY_IF_NULL(match->cp_text[CPT_KIND]));
|
||||
tv_dict_add_str(di, S_LEN("info"), EMPTY_IF_NULL(match->cp_text[CPT_INFO]));
|
||||
if (match->cp_user_data.v_type == VAR_UNKNOWN) {
|
||||
// Add an empty string for backwards compatibility
|
||||
tv_dict_add_str(di, S_LEN("user_data"), "");
|
||||
} else {
|
||||
tv_dict_add_tv(di, S_LEN("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);
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user