mirror of
https://github.com/neovim/neovim.git
synced 2025-10-05 17:36:29 +00:00
vim-patch:8.1.0431: the qf_jump() function is too long
Problem: The qf_jump() function is too long.
Solution: Refactor to split it into several functions. (Yegappan Lakshmanan)
6dae96ef7a
This commit is contained in:
@@ -2348,25 +2348,27 @@ static qfline_T *get_prev_valid_entry(qf_list_T *qfl, qfline_T *qf_ptr,
|
|||||||
/// dir == FORWARD or FORWARD_FILE: next valid entry
|
/// dir == FORWARD or FORWARD_FILE: next valid entry
|
||||||
/// dir == BACKWARD or BACKWARD_FILE: previous valid entry
|
/// dir == BACKWARD or BACKWARD_FILE: previous valid entry
|
||||||
static qfline_T *get_nth_valid_entry(qf_list_T *qfl, int errornr,
|
static qfline_T *get_nth_valid_entry(qf_list_T *qfl, int errornr,
|
||||||
qfline_T *qf_ptr, int *qf_index, int dir)
|
int dir, int *new_qfidx)
|
||||||
{
|
{
|
||||||
|
qfline_T *qf_ptr = qfl->qf_ptr;
|
||||||
|
int qf_idx = qfl->qf_index;
|
||||||
qfline_T *prev_qf_ptr;
|
qfline_T *prev_qf_ptr;
|
||||||
int prev_index;
|
int prev_index;
|
||||||
char_u *err = e_no_more_items;
|
char_u *err = e_no_more_items;
|
||||||
|
|
||||||
while (errornr--) {
|
while (errornr--) {
|
||||||
prev_qf_ptr = qf_ptr;
|
prev_qf_ptr = qf_ptr;
|
||||||
prev_index = *qf_index;
|
prev_index = qf_idx;
|
||||||
|
|
||||||
if (dir == FORWARD || dir == FORWARD_FILE) {
|
if (dir == FORWARD || dir == FORWARD_FILE) {
|
||||||
qf_ptr = get_next_valid_entry(qfl, qf_ptr, qf_index, dir);
|
qf_ptr = get_next_valid_entry(qfl, qf_ptr, &qf_idx, dir);
|
||||||
} else {
|
} else {
|
||||||
qf_ptr = get_prev_valid_entry(qfl, qf_ptr, qf_index, dir);
|
qf_ptr = get_prev_valid_entry(qfl, qf_ptr, &qf_idx, dir);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (qf_ptr == NULL) {
|
if (qf_ptr == NULL) {
|
||||||
qf_ptr = prev_qf_ptr;
|
qf_ptr = prev_qf_ptr;
|
||||||
*qf_index = prev_index;
|
qf_idx = prev_index;
|
||||||
if (err != NULL) {
|
if (err != NULL) {
|
||||||
EMSG(_(err));
|
EMSG(_(err));
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -2377,14 +2379,16 @@ static qfline_T *get_nth_valid_entry(qf_list_T *qfl, int errornr,
|
|||||||
err = NULL;
|
err = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
*new_qfidx = qf_idx;
|
||||||
return qf_ptr;
|
return qf_ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get n'th (errornr) quickfix entry
|
/// Get n'th (errornr) quickfix entry from the current entry in the quickfix
|
||||||
static qfline_T *get_nth_entry(qf_list_T *qfl, int errornr, qfline_T *qf_ptr,
|
/// list 'qfl'. Returns a pointer to the new entry and the index in 'new_qfidx'
|
||||||
int *cur_qfidx)
|
static qfline_T *get_nth_entry(qf_list_T *qfl, int errornr, int *new_qfidx)
|
||||||
{
|
{
|
||||||
int qf_idx = *cur_qfidx;
|
qfline_T *qf_ptr = qfl->qf_ptr;
|
||||||
|
int qf_idx = qfl->qf_index;;
|
||||||
|
|
||||||
// New error number is less than the current error number
|
// New error number is less than the current error number
|
||||||
while (errornr < qf_idx && qf_idx > 1 && qf_ptr->qf_prev != NULL) {
|
while (errornr < qf_idx && qf_idx > 1 && qf_ptr->qf_prev != NULL) {
|
||||||
@@ -2400,10 +2404,31 @@ static qfline_T *get_nth_entry(qf_list_T *qfl, int errornr, qfline_T *qf_ptr,
|
|||||||
qf_ptr = qf_ptr->qf_next;
|
qf_ptr = qf_ptr->qf_next;
|
||||||
}
|
}
|
||||||
|
|
||||||
*cur_qfidx = qf_idx;
|
*new_qfidx = qf_idx;
|
||||||
return qf_ptr;
|
return qf_ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Get a entry specied by 'errornr' and 'dir' from the current
|
||||||
|
/// quickfix/location list. 'errornr' specifies the index of the entry and 'dir'
|
||||||
|
/// specifies the direction (FORWARD/BACKWARD/FORWARD_FILE/BACKWARD_FILE).
|
||||||
|
/// Returns a pointer to the entry and the index of the new entry is stored in
|
||||||
|
/// 'new_qfidx'.
|
||||||
|
static qfline_T * qf_get_entry(qf_list_T *qfl, int errornr,
|
||||||
|
int dir, int *new_qfidx)
|
||||||
|
{
|
||||||
|
qfline_T *qf_ptr = qfl->qf_ptr;
|
||||||
|
int qfidx = qfl->qf_index;
|
||||||
|
|
||||||
|
if (dir != 0) { // next/prev valid entry
|
||||||
|
qf_ptr = get_nth_valid_entry(qfl, errornr, dir, &qfidx);
|
||||||
|
} else if (errornr != 0) { // go to specified number
|
||||||
|
qf_ptr = get_nth_entry(qfl, errornr, &qfidx);
|
||||||
|
}
|
||||||
|
|
||||||
|
*new_qfidx = qfidx;
|
||||||
|
return qf_ptr;
|
||||||
|
}
|
||||||
|
|
||||||
// Find a window displaying a Vim help file.
|
// Find a window displaying a Vim help file.
|
||||||
static win_T *qf_find_help_win(void)
|
static win_T *qf_find_help_win(void)
|
||||||
FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT
|
FUNC_ATTR_PURE FUNC_ATTR_WARN_UNUSED_RESULT
|
||||||
@@ -2672,7 +2697,7 @@ static int qf_jump_to_usable_window(int qf_fnum, int *opened_window)
|
|||||||
|
|
||||||
/// Edit the selected file or help file.
|
/// Edit the selected file or help file.
|
||||||
static int qf_jump_edit_buffer(qf_info_T *qi, qfline_T *qf_ptr, int forceit,
|
static int qf_jump_edit_buffer(qf_info_T *qi, qfline_T *qf_ptr, int forceit,
|
||||||
win_T *oldwin, int *opened_window, int *abort)
|
win_T *oldwin, int *opened_window)
|
||||||
{
|
{
|
||||||
qf_list_T *qfl = qf_get_curlist(qi);
|
qf_list_T *qfl = qf_get_curlist(qi);
|
||||||
qfltype_T qfl_type = qfl->qfl_type;
|
qfltype_T qfl_type = qfl->qfl_type;
|
||||||
@@ -2700,11 +2725,11 @@ static int qf_jump_edit_buffer(qf_info_T *qi, qfline_T *qf_ptr, int forceit,
|
|||||||
// present and the list is still valid.
|
// present and the list is still valid.
|
||||||
if (!win_valid_any_tab(oldwin)) {
|
if (!win_valid_any_tab(oldwin)) {
|
||||||
EMSG(_("E924: Current window was closed"));
|
EMSG(_("E924: Current window was closed"));
|
||||||
*abort = true;
|
|
||||||
*opened_window = false;
|
*opened_window = false;
|
||||||
|
return NOTDONE;
|
||||||
} else if (!qflist_valid(oldwin, save_qfid)) {
|
} else if (!qflist_valid(oldwin, save_qfid)) {
|
||||||
EMSG(_(e_loc_list_changed));
|
EMSG(_(e_loc_list_changed));
|
||||||
*abort = true;
|
return NOTDONE;
|
||||||
}
|
}
|
||||||
} else if (!is_qf_entry_present(qfl, qf_ptr)) {
|
} else if (!is_qf_entry_present(qfl, qf_ptr)) {
|
||||||
if (qfl_type == QFLT_QUICKFIX) {
|
if (qfl_type == QFLT_QUICKFIX) {
|
||||||
@@ -2712,11 +2737,7 @@ static int qf_jump_edit_buffer(qf_info_T *qi, qfline_T *qf_ptr, int forceit,
|
|||||||
} else {
|
} else {
|
||||||
EMSG(_(e_loc_list_changed));
|
EMSG(_(e_loc_list_changed));
|
||||||
}
|
}
|
||||||
*abort = true;
|
return NOTDONE;
|
||||||
}
|
|
||||||
|
|
||||||
if (*abort) {
|
|
||||||
retval = FAIL;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2792,7 +2813,84 @@ static void qf_jump_print_msg(qf_info_T *qi, int qf_index, qfline_T *qf_ptr,
|
|||||||
msg_scroll = (int)i;
|
msg_scroll = (int)i;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// jump to a quickfix line
|
/// Find a usable window for opening a file from the quickfix/location list. If
|
||||||
|
/// a window is not found then open a new window.
|
||||||
|
/// Returns OK if successfully jumped or opened a window. Returns FAIL if not
|
||||||
|
/// able to jump/open a window. Returns NOTDONE if a file is not associated
|
||||||
|
/// with the entry.
|
||||||
|
static int qf_jump_open_window(qf_info_T *qi, qfline_T *qf_ptr,
|
||||||
|
int *opened_window)
|
||||||
|
{
|
||||||
|
// For ":helpgrep" find a help window or open one.
|
||||||
|
if (qf_ptr->qf_type == 1 && (!bt_help(curwin->w_buffer) || cmdmod.tab != 0)) {
|
||||||
|
if (jump_to_help_window(qi, opened_window) == FAIL) {
|
||||||
|
return FAIL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If currently in the quickfix window, find another window to show the
|
||||||
|
// file in.
|
||||||
|
if (bt_quickfix(curbuf) && !*opened_window) {
|
||||||
|
// If there is no file specified, we don't know where to go.
|
||||||
|
// But do advance, otherwise ":cn" gets stuck.
|
||||||
|
if (qf_ptr->qf_fnum == 0) {
|
||||||
|
return NOTDONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (qf_jump_to_usable_window(qf_ptr->qf_fnum, opened_window) == FAIL) {
|
||||||
|
return FAIL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Edit a selected file from the quickfix/location list and jump to a
|
||||||
|
/// particular line/column, adjust the folds and display a message about the
|
||||||
|
/// jump.
|
||||||
|
/// Returns OK on success and FAIL on failing to open the file/buffer. Returns
|
||||||
|
/// NOTDONE if the quickfix/location list is freed by an autocmd when opening
|
||||||
|
/// the file.
|
||||||
|
static int qf_jump_to_buffer(qf_info_T *qi, int qf_index, qfline_T *qf_ptr,
|
||||||
|
int forceit, win_T *oldwin, int *opened_window,
|
||||||
|
int openfold, int print_message)
|
||||||
|
{
|
||||||
|
buf_T *old_curbuf;
|
||||||
|
linenr_T old_lnum;
|
||||||
|
int retval = OK;
|
||||||
|
|
||||||
|
// If there is a file name, read the wanted file if needed, and check
|
||||||
|
// autowrite etc.
|
||||||
|
old_curbuf = curbuf;
|
||||||
|
old_lnum = curwin->w_cursor.lnum;
|
||||||
|
|
||||||
|
if (qf_ptr->qf_fnum != 0) {
|
||||||
|
retval = qf_jump_edit_buffer(qi, qf_ptr, forceit, oldwin,
|
||||||
|
opened_window);
|
||||||
|
if (retval != OK) {
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// When not switched to another buffer, still need to set pc mark
|
||||||
|
if (curbuf == old_curbuf) {
|
||||||
|
setpcmark();
|
||||||
|
}
|
||||||
|
|
||||||
|
qf_jump_goto_line(qf_ptr->qf_lnum, qf_ptr->qf_col, qf_ptr->qf_viscol,
|
||||||
|
qf_ptr->qf_pattern);
|
||||||
|
|
||||||
|
if ((fdo_flags & FDO_QUICKFIX) && openfold) {
|
||||||
|
foldOpenCursor();
|
||||||
|
}
|
||||||
|
if (print_message) {
|
||||||
|
qf_jump_print_msg(qi, qf_index, qf_ptr, old_curbuf, old_lnum);
|
||||||
|
}
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// jump to a quickfix ltne
|
||||||
/// if dir == FORWARD go "errornr" valid entries forward
|
/// if dir == FORWARD go "errornr" valid entries forward
|
||||||
/// if dir == BACKWARD go "errornr" valid entries backward
|
/// if dir == BACKWARD go "errornr" valid entries backward
|
||||||
/// if dir == FORWARD_FILE go "errornr" valid entries files backward
|
/// if dir == FORWARD_FILE go "errornr" valid entries files backward
|
||||||
@@ -2806,8 +2904,6 @@ void qf_jump(qf_info_T *qi, int dir, int errornr, int forceit)
|
|||||||
qfline_T *old_qf_ptr;
|
qfline_T *old_qf_ptr;
|
||||||
int qf_index;
|
int qf_index;
|
||||||
int old_qf_index;
|
int old_qf_index;
|
||||||
buf_T *old_curbuf;
|
|
||||||
linenr_T old_lnum;
|
|
||||||
char_u *old_swb = p_swb;
|
char_u *old_swb = p_swb;
|
||||||
unsigned old_swb_flags = swb_flags;
|
unsigned old_swb_flags = swb_flags;
|
||||||
int opened_window = false;
|
int opened_window = false;
|
||||||
@@ -2830,15 +2926,12 @@ void qf_jump(qf_info_T *qi, int dir, int errornr, int forceit)
|
|||||||
old_qf_ptr = qf_ptr;
|
old_qf_ptr = qf_ptr;
|
||||||
qf_index = qfl->qf_index;
|
qf_index = qfl->qf_index;
|
||||||
old_qf_index = qf_index;
|
old_qf_index = qf_index;
|
||||||
if (dir != 0) { // next/prev valid entry
|
|
||||||
qf_ptr = get_nth_valid_entry(qfl, errornr, qf_ptr, &qf_index, dir);
|
qf_ptr = qf_get_entry(qfl, errornr, dir, &qf_index);
|
||||||
if (qf_ptr == NULL) {
|
if (qf_ptr == NULL) {
|
||||||
qf_ptr = old_qf_ptr;
|
qf_ptr = old_qf_ptr;
|
||||||
qf_index = old_qf_index;
|
qf_index = old_qf_index;
|
||||||
goto theend; // The horror... the horror...
|
goto theend;
|
||||||
}
|
|
||||||
} else if (errornr != 0) { // go to specified number
|
|
||||||
qf_ptr = get_nth_entry(qfl, errornr, qf_ptr, &qf_index);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
qfl->qf_index = qf_index;
|
qfl->qf_index = qf_index;
|
||||||
@@ -2848,58 +2941,23 @@ void qf_jump(qf_info_T *qi, int dir, int errornr, int forceit)
|
|||||||
print_message = false;
|
print_message = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// For ":helpgrep" find a help window or open one.
|
retval = qf_jump_open_window(qi, qf_ptr, &opened_window);
|
||||||
if (qf_ptr->qf_type == 1 && (!bt_help(curwin->w_buffer) || cmdmod.tab != 0)) {
|
if (retval == FAIL) {
|
||||||
if (jump_to_help_window(qi, &opened_window) == FAIL) {
|
goto failed;
|
||||||
goto theend;
|
}
|
||||||
}
|
if (retval == NOTDONE) {
|
||||||
|
goto theend;
|
||||||
}
|
}
|
||||||
|
|
||||||
// If currently in the quickfix window, find another window to show the
|
retval = qf_jump_to_buffer(qi, qf_index, qf_ptr, forceit, oldwin,
|
||||||
// file in.
|
&opened_window, old_KeyTyped, print_message);
|
||||||
if (bt_quickfix(curbuf) && !opened_window) {
|
if (retval == NOTDONE) {
|
||||||
// If there is no file specified, we don't know where to go.
|
// Quickfix/location list is freed by an autocmd
|
||||||
// But do advance, otherwise ":cn" gets stuck.
|
qi = NULL;
|
||||||
if (qf_ptr->qf_fnum == 0) {
|
qf_ptr = NULL;
|
||||||
goto theend;
|
|
||||||
}
|
|
||||||
if (qf_jump_to_usable_window(qf_ptr->qf_fnum, &opened_window) == FAIL) {
|
|
||||||
goto failed;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// If there is a file name,
|
if (retval != OK) {
|
||||||
// read the wanted file if needed, and check autowrite etc.
|
|
||||||
old_curbuf = curbuf;
|
|
||||||
old_lnum = curwin->w_cursor.lnum;
|
|
||||||
|
|
||||||
if (qf_ptr->qf_fnum != 0) {
|
|
||||||
int abort = false;
|
|
||||||
retval = qf_jump_edit_buffer(qi, qf_ptr, forceit, oldwin, &opened_window,
|
|
||||||
&abort);
|
|
||||||
if (abort) {
|
|
||||||
qi = NULL;
|
|
||||||
qf_ptr = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (retval == OK) {
|
|
||||||
// When not switched to another buffer, still need to set pc mark
|
|
||||||
if (curbuf == old_curbuf) {
|
|
||||||
setpcmark();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (qf_ptr != NULL) {
|
|
||||||
qf_jump_goto_line(qf_ptr->qf_lnum, qf_ptr->qf_col, qf_ptr->qf_viscol,
|
|
||||||
qf_ptr->qf_pattern);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((fdo_flags & FDO_QUICKFIX) && old_KeyTyped)
|
|
||||||
foldOpenCursor();
|
|
||||||
if (print_message) {
|
|
||||||
qf_jump_print_msg(qi, qf_index, qf_ptr, old_curbuf, old_lnum);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (opened_window) {
|
if (opened_window) {
|
||||||
win_close(curwin, true); // Close opened window
|
win_close(curwin, true); // Close opened window
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user