diff options
author | Shane Smith <shane.wm.smith@gmail.com> | 2019-09-17 17:01:52 -0400 |
---|---|---|
committer | Shane Smith <shane.wm.smith@gmail.com> | 2019-10-27 23:24:54 -0400 |
commit | cf7c34dea1080db403464f7b7fd50341597fd42c (patch) | |
tree | d6aad26aa53a61c9d59cc1b6017015edcbea93b3 | |
parent | c222f3e0060f168c7c7ab3e3926efd95d3def39f (diff) | |
download | rneovim-cf7c34dea1080db403464f7b7fd50341597fd42c.tar.gz rneovim-cf7c34dea1080db403464f7b7fd50341597fd42c.tar.bz2 rneovim-cf7c34dea1080db403464f7b7fd50341597fd42c.zip |
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)
https://github.com/vim/vim/commit/87f59b09ea4b9af2712598374a6044f5fa1b54a4
-rw-r--r-- | src/nvim/quickfix.c | 182 | ||||
-rw-r--r-- | src/nvim/testdir/test_quickfix.vim | 6 |
2 files changed, 96 insertions, 92 deletions
diff --git a/src/nvim/quickfix.c b/src/nvim/quickfix.c index c45d60cb3f..731817a2b4 100644 --- a/src/nvim/quickfix.c +++ b/src/nvim/quickfix.c @@ -1899,9 +1899,49 @@ static qf_info_T *ll_get_or_alloc_list(win_T *wp) 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'. -static int copy_loclist_entries(const qf_list_T *from_qfl, - qf_list_T *to_qfl) +static int copy_loclist_entries(const qf_list_T *from_qfl, qf_list_T *to_qfl) FUNC_ATTR_NONNULL_ALL { int i; @@ -3009,14 +3049,10 @@ void qf_list(exarg_T *eap) char_u *arg = eap->arg; int all = eap->forceit; // if not :cl!, only show // recognised errors - qf_info_T *qi = &ql_info; + qf_info_T *qi; - if (is_loclist_cmd(eap->cmdidx)) { - qi = GET_LOC_LIST(curwin); - if (qi == NULL) { - EMSG(_(e_loclist)); - return; - } + if ((qi = qf_cmd_get_stack(eap, true)) == NULL) { + return; } if (qf_stack_empty(qi) || qf_list_empty(qf_get_curlist(qi))) { @@ -3135,15 +3171,11 @@ static void qf_msg(qf_info_T *qi, int which, char *lead) */ void qf_age(exarg_T *eap) { - qf_info_T *qi = &ql_info; + qf_info_T *qi; int count; - if (is_loclist_cmd(eap->cmdidx)) { - qi = GET_LOC_LIST(curwin); - if (qi == NULL) { - EMSG(_(e_loclist)); - return; - } + if ((qi = qf_cmd_get_stack(eap, true)) == NULL) { + return; } if (eap->addr_count != 0) { @@ -3174,12 +3206,9 @@ void qf_age(exarg_T *eap) /// Display the information about all the quickfix/location lists in the stack. void qf_history(exarg_T *eap) { - qf_info_T *qi = &ql_info; + qf_info_T *qi = qf_cmd_get_stack(eap, false); 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))) { MSG(_("No entries")); } else { @@ -3374,14 +3403,12 @@ void qf_view_result(bool split) */ void ex_cwindow(exarg_T *eap) { - qf_info_T *qi = &ql_info; + qf_info_T *qi; qf_list_T *qfl; win_T *win; - if (is_loclist_cmd(eap->cmdidx)) { - qi = GET_LOC_LIST(curwin); - if (qi == NULL) - return; + if ((qi = qf_cmd_get_stack(eap, true)) == NULL) { + return; } qfl = qf_get_curlist(qi); @@ -3411,13 +3438,11 @@ void ex_cwindow(exarg_T *eap) */ void ex_cclose(exarg_T *eap) { - win_T *win = NULL; - qf_info_T *qi = &ql_info; + win_T *win = NULL; + qf_info_T *qi; - if (is_loclist_cmd(eap->cmdidx)) { - qi = GET_LOC_LIST(curwin); - if (qi == NULL) - return; + if ((qi = qf_cmd_get_stack(eap, false)) == NULL) { + return; } /* Find existing quickfix window and close it. */ @@ -3533,18 +3558,14 @@ static void qf_set_title_var(qf_list_T *qfl) */ void ex_copen(exarg_T *eap) { - qf_info_T *qi = &ql_info; + qf_info_T *qi; qf_list_T *qfl; int height; int status = FAIL; int lnum; - if (is_loclist_cmd(eap->cmdidx)) { - qi = GET_LOC_LIST(curwin); - if (qi == NULL) { - EMSG(_(e_loclist)); - return; - } + if ((qi = qf_cmd_get_stack(eap, true)) == NULL) { + return; } incr_quickfix_busy(); @@ -3607,14 +3628,10 @@ static void qf_win_goto(win_T *win, linenr_T lnum) // :cbottom/:lbottom command. void ex_cbottom(exarg_T *eap) { - qf_info_T *qi = &ql_info; + qf_info_T *qi; - if (is_loclist_cmd(eap->cmdidx)) { - qi = GET_LOC_LIST(curwin); - if (qi == NULL) { - EMSG(_(e_loclist)); - return; - } + if ((qi = qf_cmd_get_stack(eap, true)) == NULL) { + return; } win_T *win = qf_find_win(qi); @@ -4162,14 +4179,11 @@ static char_u *get_mef_name(void) size_t qf_get_size(exarg_T *eap) FUNC_ATTR_NONNULL_ALL { - qf_info_T *qi = &ql_info; + qf_info_T *qi; qf_list_T *qfl; - if (is_loclist_cmd(eap->cmdidx)) { - // Location list. - qi = GET_LOC_LIST(curwin); - if (qi == NULL) { - return 0; - } + + if ((qi = qf_cmd_get_stack(eap, false)) == NULL) { + return 0; } int prev_fnum = 0; @@ -4201,14 +4215,10 @@ size_t qf_get_size(exarg_T *eap) size_t qf_get_cur_idx(exarg_T *eap) FUNC_ATTR_NONNULL_ALL { - qf_info_T *qi = &ql_info; + qf_info_T *qi; - if (is_loclist_cmd(eap->cmdidx)) { - // Location list. - qi = GET_LOC_LIST(curwin); - if (qi == NULL) { - return 0; - } + if ((qi = qf_cmd_get_stack(eap, false)) == NULL) { + return 0; } assert(qf_get_curlist(qi)->qf_index >= 0); @@ -4221,14 +4231,10 @@ size_t qf_get_cur_idx(exarg_T *eap) int qf_get_cur_valid_idx(exarg_T *eap) FUNC_ATTR_NONNULL_ALL { - qf_info_T *qi = &ql_info; + qf_info_T *qi; - if (is_loclist_cmd(eap->cmdidx)) { - // Location list. - qi = GET_LOC_LIST(curwin); - if (qi == NULL) { - return 1; - } + if ((qi = qf_cmd_get_stack(eap, false)) == NULL) { + return 1; } qf_list_T *qfl = qf_get_curlist(qi); @@ -4310,14 +4316,10 @@ static size_t qf_get_nth_valid_entry(qf_list_T *qfl, size_t n, int fdo) */ void ex_cc(exarg_T *eap) { - qf_info_T *qi = &ql_info; + qf_info_T *qi; - if (is_loclist_cmd(eap->cmdidx)) { - qi = GET_LOC_LIST(curwin); - if (qi == NULL) { - EMSG(_(e_loclist)); - return; - } + if ((qi = qf_cmd_get_stack(eap, true)) == NULL) { + return; } int errornr; @@ -4369,14 +4371,10 @@ void ex_cc(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)) { - qi = GET_LOC_LIST(curwin); - if (qi == NULL) { - EMSG(_(e_loclist)); - return; - } + if ((qi = qf_cmd_get_stack(eap, true)) == NULL) { + return; } int errornr; @@ -4695,7 +4693,7 @@ void ex_vimgrep(exarg_T *eap) char_u *s; char_u *p; int fi; - qf_info_T *qi = &ql_info; + qf_info_T *qi; qf_list_T *qfl; win_T *wp = NULL; buf_T *buf; @@ -4721,9 +4719,9 @@ void ex_vimgrep(exarg_T *eap) } } - if (is_loclist_cmd(eap->cmdidx)) { - qi = ll_get_or_alloc_list(curwin); - wp = curwin; + qi = qf_cmd_get_or_alloc_stack(eap, &wp); + if (qi == NULL) { + return; } if (eap->addr_count > 0) @@ -6031,7 +6029,7 @@ static int cbuffer_process_args(exarg_T *eap, void ex_cbuffer(exarg_T *eap) { buf_T *buf = NULL; - qf_info_T *qi = &ql_info; + qf_info_T *qi; char_u *au_name = NULL; win_T *wp = NULL; char_u *qf_title; @@ -6047,9 +6045,9 @@ void ex_cbuffer(exarg_T *eap) } // Must come after autocommands. - if (is_loclist_cmd(eap->cmdidx)) { - qi = ll_get_or_alloc_list(curwin); - wp = curwin; + qi = qf_cmd_get_or_alloc_stack(eap, &wp); + if (qi == NULL) { + return; } 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) { - qf_info_T *qi = &ql_info; + qf_info_T *qi; char_u *au_name = NULL; win_T *wp = NULL; @@ -6133,9 +6131,9 @@ void ex_cexpr(exarg_T *eap) } } - if (is_loclist_cmd(eap->cmdidx)) { - qi = ll_get_or_alloc_list(curwin); - wp = curwin; + qi = qf_cmd_get_or_alloc_stack(eap, &wp); + if (qi == NULL) { + return; } /* Evaluate the expression. When the result is a string or a list we can diff --git a/src/nvim/testdir/test_quickfix.vim b/src/nvim/testdir/test_quickfix.vim index 26b43d9818..131e9d72e3 100644 --- a/src/nvim/testdir/test_quickfix.vim +++ b/src/nvim/testdir/test_quickfix.vim @@ -163,6 +163,12 @@ endfunc func XageTests(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}] call g:Xsetlist(list) |