vim-patch:8.1.1112: duplicate code in quickfix file

Problem:    Duplicate code in quickfix file.
Solution:   Move code into functions. (Yegappan Lakshmanan, closes vim/vim#4207)
87f59b09ea
This commit is contained in:
Shane Smith
2019-09-17 17:01:52 -04:00
parent c222f3e006
commit cf7c34dea1
2 changed files with 96 additions and 92 deletions

View File

@@ -1899,9 +1899,49 @@ static qf_info_T *ll_get_or_alloc_list(win_T *wp)
return wp->w_llist; return wp->w_llist;
} }
// Get the quickfix/location list stack to use for the specified Ex command.
// For a location list command, returns the stack for the current window. If
// the location list is not found, then returns NULL and prints an error
// message if 'print_emsg' is TRUE.
static qf_info_T * qf_cmd_get_stack(exarg_T *eap, int print_emsg)
{
qf_info_T *qi = &ql_info;
if (is_loclist_cmd(eap->cmdidx)) {
qi = GET_LOC_LIST(curwin);
if (qi == NULL) {
if (print_emsg) {
EMSG(_(e_loclist));
}
return NULL;
}
}
return qi;
}
// Get the quickfix/location list stack to use for the specified Ex command.
// For a location list command, returns the stack for the current window.
// If the location list is not present, then allocates a new one.
// Returns NULL if the allocation fails. For a location list command, sets
// 'pwinp' to curwin.
static qf_info_T * qf_cmd_get_or_alloc_stack(exarg_T *eap, win_T **pwinp)
{
qf_info_T *qi = &ql_info;
if (is_loclist_cmd(eap->cmdidx)) {
qi = ll_get_or_alloc_list(curwin);
if (qi == NULL) {
return NULL;
}
*pwinp = curwin;
}
return qi;
}
// Copy location list entries from 'from_qfl' to 'to_qfl'. // Copy location list entries from 'from_qfl' to 'to_qfl'.
static int copy_loclist_entries(const qf_list_T *from_qfl, static int copy_loclist_entries(const qf_list_T *from_qfl, qf_list_T *to_qfl)
qf_list_T *to_qfl)
FUNC_ATTR_NONNULL_ALL FUNC_ATTR_NONNULL_ALL
{ {
int i; int i;
@@ -3009,15 +3049,11 @@ void qf_list(exarg_T *eap)
char_u *arg = eap->arg; char_u *arg = eap->arg;
int all = eap->forceit; // if not :cl!, only show int all = eap->forceit; // if not :cl!, only show
// recognised errors // recognised errors
qf_info_T *qi = &ql_info; qf_info_T *qi;
if (is_loclist_cmd(eap->cmdidx)) { if ((qi = qf_cmd_get_stack(eap, true)) == NULL) {
qi = GET_LOC_LIST(curwin);
if (qi == NULL) {
EMSG(_(e_loclist));
return; return;
} }
}
if (qf_stack_empty(qi) || qf_list_empty(qf_get_curlist(qi))) { if (qf_stack_empty(qi) || qf_list_empty(qf_get_curlist(qi))) {
EMSG(_(e_quickfix)); EMSG(_(e_quickfix));
@@ -3135,16 +3171,12 @@ static void qf_msg(qf_info_T *qi, int which, char *lead)
*/ */
void qf_age(exarg_T *eap) void qf_age(exarg_T *eap)
{ {
qf_info_T *qi = &ql_info; qf_info_T *qi;
int count; int count;
if (is_loclist_cmd(eap->cmdidx)) { if ((qi = qf_cmd_get_stack(eap, true)) == NULL) {
qi = GET_LOC_LIST(curwin);
if (qi == NULL) {
EMSG(_(e_loclist));
return; return;
} }
}
if (eap->addr_count != 0) { if (eap->addr_count != 0) {
assert(eap->line2 <= INT_MAX); assert(eap->line2 <= INT_MAX);
@@ -3174,12 +3206,9 @@ void qf_age(exarg_T *eap)
/// Display the information about all the quickfix/location lists in the stack. /// Display the information about all the quickfix/location lists in the stack.
void qf_history(exarg_T *eap) void qf_history(exarg_T *eap)
{ {
qf_info_T *qi = &ql_info; qf_info_T *qi = qf_cmd_get_stack(eap, false);
int i; int i;
if (is_loclist_cmd(eap->cmdidx)) {
qi = GET_LOC_LIST(curwin);
}
if (qf_stack_empty(qi) || qf_list_empty(qf_get_curlist(qi))) { if (qf_stack_empty(qi) || qf_list_empty(qf_get_curlist(qi))) {
MSG(_("No entries")); MSG(_("No entries"));
} else { } else {
@@ -3374,13 +3403,11 @@ void qf_view_result(bool split)
*/ */
void ex_cwindow(exarg_T *eap) void ex_cwindow(exarg_T *eap)
{ {
qf_info_T *qi = &ql_info; qf_info_T *qi;
qf_list_T *qfl; qf_list_T *qfl;
win_T *win; win_T *win;
if (is_loclist_cmd(eap->cmdidx)) { if ((qi = qf_cmd_get_stack(eap, true)) == NULL) {
qi = GET_LOC_LIST(curwin);
if (qi == NULL)
return; return;
} }
@@ -3412,11 +3439,9 @@ void ex_cwindow(exarg_T *eap)
void ex_cclose(exarg_T *eap) void ex_cclose(exarg_T *eap)
{ {
win_T *win = NULL; win_T *win = NULL;
qf_info_T *qi = &ql_info; qf_info_T *qi;
if (is_loclist_cmd(eap->cmdidx)) { if ((qi = qf_cmd_get_stack(eap, false)) == NULL) {
qi = GET_LOC_LIST(curwin);
if (qi == NULL)
return; return;
} }
@@ -3533,19 +3558,15 @@ static void qf_set_title_var(qf_list_T *qfl)
*/ */
void ex_copen(exarg_T *eap) void ex_copen(exarg_T *eap)
{ {
qf_info_T *qi = &ql_info; qf_info_T *qi;
qf_list_T *qfl; qf_list_T *qfl;
int height; int height;
int status = FAIL; int status = FAIL;
int lnum; int lnum;
if (is_loclist_cmd(eap->cmdidx)) { if ((qi = qf_cmd_get_stack(eap, true)) == NULL) {
qi = GET_LOC_LIST(curwin);
if (qi == NULL) {
EMSG(_(e_loclist));
return; return;
} }
}
incr_quickfix_busy(); incr_quickfix_busy();
@@ -3607,15 +3628,11 @@ static void qf_win_goto(win_T *win, linenr_T lnum)
// :cbottom/:lbottom command. // :cbottom/:lbottom command.
void ex_cbottom(exarg_T *eap) void ex_cbottom(exarg_T *eap)
{ {
qf_info_T *qi = &ql_info; qf_info_T *qi;
if (is_loclist_cmd(eap->cmdidx)) { if ((qi = qf_cmd_get_stack(eap, true)) == NULL) {
qi = GET_LOC_LIST(curwin);
if (qi == NULL) {
EMSG(_(e_loclist));
return; return;
} }
}
win_T *win = qf_find_win(qi); win_T *win = qf_find_win(qi);
@@ -4162,15 +4179,12 @@ static char_u *get_mef_name(void)
size_t qf_get_size(exarg_T *eap) size_t qf_get_size(exarg_T *eap)
FUNC_ATTR_NONNULL_ALL FUNC_ATTR_NONNULL_ALL
{ {
qf_info_T *qi = &ql_info; qf_info_T *qi;
qf_list_T *qfl; qf_list_T *qfl;
if (is_loclist_cmd(eap->cmdidx)) {
// Location list. if ((qi = qf_cmd_get_stack(eap, false)) == NULL) {
qi = GET_LOC_LIST(curwin);
if (qi == NULL) {
return 0; return 0;
} }
}
int prev_fnum = 0; int prev_fnum = 0;
size_t sz = 0; size_t sz = 0;
@@ -4201,15 +4215,11 @@ size_t qf_get_size(exarg_T *eap)
size_t qf_get_cur_idx(exarg_T *eap) size_t qf_get_cur_idx(exarg_T *eap)
FUNC_ATTR_NONNULL_ALL FUNC_ATTR_NONNULL_ALL
{ {
qf_info_T *qi = &ql_info; qf_info_T *qi;
if (is_loclist_cmd(eap->cmdidx)) { if ((qi = qf_cmd_get_stack(eap, false)) == NULL) {
// Location list.
qi = GET_LOC_LIST(curwin);
if (qi == NULL) {
return 0; return 0;
} }
}
assert(qf_get_curlist(qi)->qf_index >= 0); assert(qf_get_curlist(qi)->qf_index >= 0);
return (size_t)qf_get_curlist(qi)->qf_index; return (size_t)qf_get_curlist(qi)->qf_index;
@@ -4221,15 +4231,11 @@ size_t qf_get_cur_idx(exarg_T *eap)
int qf_get_cur_valid_idx(exarg_T *eap) int qf_get_cur_valid_idx(exarg_T *eap)
FUNC_ATTR_NONNULL_ALL FUNC_ATTR_NONNULL_ALL
{ {
qf_info_T *qi = &ql_info; qf_info_T *qi;
if (is_loclist_cmd(eap->cmdidx)) { if ((qi = qf_cmd_get_stack(eap, false)) == NULL) {
// Location list.
qi = GET_LOC_LIST(curwin);
if (qi == NULL) {
return 1; return 1;
} }
}
qf_list_T *qfl = qf_get_curlist(qi); qf_list_T *qfl = qf_get_curlist(qi);
@@ -4310,15 +4316,11 @@ static size_t qf_get_nth_valid_entry(qf_list_T *qfl, size_t n, int fdo)
*/ */
void ex_cc(exarg_T *eap) void ex_cc(exarg_T *eap)
{ {
qf_info_T *qi = &ql_info; qf_info_T *qi;
if (is_loclist_cmd(eap->cmdidx)) { if ((qi = qf_cmd_get_stack(eap, true)) == NULL) {
qi = GET_LOC_LIST(curwin);
if (qi == NULL) {
EMSG(_(e_loclist));
return; return;
} }
}
int errornr; int errornr;
if (eap->addr_count > 0) { if (eap->addr_count > 0) {
@@ -4369,15 +4371,11 @@ void ex_cc(exarg_T *eap)
*/ */
void ex_cnext(exarg_T *eap) void ex_cnext(exarg_T *eap)
{ {
qf_info_T *qi = &ql_info; qf_info_T *qi;
if (is_loclist_cmd(eap->cmdidx)) { if ((qi = qf_cmd_get_stack(eap, true)) == NULL) {
qi = GET_LOC_LIST(curwin);
if (qi == NULL) {
EMSG(_(e_loclist));
return; return;
} }
}
int errornr; int errornr;
if (eap->addr_count > 0 if (eap->addr_count > 0
@@ -4695,7 +4693,7 @@ void ex_vimgrep(exarg_T *eap)
char_u *s; char_u *s;
char_u *p; char_u *p;
int fi; int fi;
qf_info_T *qi = &ql_info; qf_info_T *qi;
qf_list_T *qfl; qf_list_T *qfl;
win_T *wp = NULL; win_T *wp = NULL;
buf_T *buf; buf_T *buf;
@@ -4721,9 +4719,9 @@ void ex_vimgrep(exarg_T *eap)
} }
} }
if (is_loclist_cmd(eap->cmdidx)) { qi = qf_cmd_get_or_alloc_stack(eap, &wp);
qi = ll_get_or_alloc_list(curwin); if (qi == NULL) {
wp = curwin; return;
} }
if (eap->addr_count > 0) if (eap->addr_count > 0)
@@ -6031,7 +6029,7 @@ static int cbuffer_process_args(exarg_T *eap,
void ex_cbuffer(exarg_T *eap) void ex_cbuffer(exarg_T *eap)
{ {
buf_T *buf = NULL; buf_T *buf = NULL;
qf_info_T *qi = &ql_info; qf_info_T *qi;
char_u *au_name = NULL; char_u *au_name = NULL;
win_T *wp = NULL; win_T *wp = NULL;
char_u *qf_title; char_u *qf_title;
@@ -6047,9 +6045,9 @@ void ex_cbuffer(exarg_T *eap)
} }
// Must come after autocommands. // Must come after autocommands.
if (is_loclist_cmd(eap->cmdidx)) { qi = qf_cmd_get_or_alloc_stack(eap, &wp);
qi = ll_get_or_alloc_list(curwin); if (qi == NULL) {
wp = curwin; return;
} }
if (cbuffer_process_args(eap, &buf, &line1, &line2) == FAIL) { if (cbuffer_process_args(eap, &buf, &line1, &line2) == FAIL) {
@@ -6121,7 +6119,7 @@ static char_u * cexpr_get_auname(cmdidx_T cmdidx)
*/ */
void ex_cexpr(exarg_T *eap) void ex_cexpr(exarg_T *eap)
{ {
qf_info_T *qi = &ql_info; qf_info_T *qi;
char_u *au_name = NULL; char_u *au_name = NULL;
win_T *wp = NULL; win_T *wp = NULL;
@@ -6133,9 +6131,9 @@ void ex_cexpr(exarg_T *eap)
} }
} }
if (is_loclist_cmd(eap->cmdidx)) { qi = qf_cmd_get_or_alloc_stack(eap, &wp);
qi = ll_get_or_alloc_list(curwin); if (qi == NULL) {
wp = curwin; return;
} }
/* Evaluate the expression. When the result is a string or a list we can /* Evaluate the expression. When the result is a string or a list we can

View File

@@ -163,6 +163,12 @@ endfunc
func XageTests(cchar) func XageTests(cchar)
call s:setup_commands(a:cchar) call s:setup_commands(a:cchar)
if a:cchar == 'l'
" No location list for the current window
call assert_fails('lolder', 'E776:')
call assert_fails('lnewer', 'E776:')
endif
let list = [{'bufnr': bufnr('%'), 'lnum': 1}] let list = [{'bufnr': bufnr('%'), 'lnum': 1}]
call g:Xsetlist(list) call g:Xsetlist(list)