Patch 8.1.0431
Problem: The qf_jump() function is too long.
Solution: Refactor to split it into several functions. (Yegappan Lakshmanan)
Files: src/quickfix.c
*** ../vim-8.1.0430/src/quickfix.c 2018-09-19 21:55:58.681068412 +0200
--- src/quickfix.c 2018-09-24 21:46:42.589868380 +0200
***************
*** 2521,2530 ****
get_nth_valid_entry(
qf_list_T *qfl,
int errornr,
! qfline_T *qf_ptr,
! int *qf_index,
! int dir)
{
qfline_T *prev_qf_ptr;
int prev_index;
static char_u *e_no_more_items = (char_u *)N_("E553: No more items");
--- 2521,2531 ----
get_nth_valid_entry(
qf_list_T *qfl,
int errornr,
! int dir,
! int *new_qfidx)
{
+ qfline_T *qf_ptr = qfl->qf_ptr;
+ int qf_idx = qfl->qf_index;
qfline_T *prev_qf_ptr;
int prev_index;
static char_u *e_no_more_items = (char_u *)N_("E553: No more items");
***************
*** 2533,2548 ****
while (errornr--)
{
prev_qf_ptr = qf_ptr;
! prev_index = *qf_index;
if (dir == FORWARD || dir == FORWARD_FILE)
! qf_ptr = get_next_valid_entry(qfl, qf_ptr, qf_index, dir);
else
! qf_ptr = get_prev_valid_entry(qfl, qf_ptr, qf_index, dir);
if (qf_ptr == NULL)
{
qf_ptr = prev_qf_ptr;
! *qf_index = prev_index;
if (err != NULL)
{
EMSG(_(err));
--- 2534,2549 ----
while (errornr--)
{
prev_qf_ptr = qf_ptr;
! prev_index = qf_idx;
if (dir == FORWARD || dir == FORWARD_FILE)
! qf_ptr = get_next_valid_entry(qfl, qf_ptr, &qf_idx, dir);
else
! qf_ptr = get_prev_valid_entry(qfl, qf_ptr, &qf_idx, dir);
if (qf_ptr == NULL)
{
qf_ptr = prev_qf_ptr;
! qf_idx = prev_index;
if (err != NULL)
{
EMSG(_(err));
***************
*** 2554,2581 ****
err = NULL;
}
return qf_ptr;
}
/*
! * Get n'th (errornr) quickfix entry
*/
static qfline_T *
! get_nth_entry(
! qf_list_T *qfl,
! int errornr,
! qfline_T *qf_ptr,
! int *cur_qfidx)
{
! int qf_idx = *cur_qfidx;
! /* New error number is less than the current error number */
while (errornr < qf_idx && qf_idx > 1 && qf_ptr->qf_prev != NULL)
{
--qf_idx;
qf_ptr = qf_ptr->qf_prev;
}
! /* New error number is greater than the current error number */
while (errornr > qf_idx && qf_idx < qfl->qf_count &&
qf_ptr->qf_next != NULL)
{
--- 2555,2581 ----
err = NULL;
}
+ *new_qfidx = qf_idx;
return qf_ptr;
}
/*
! * Get n'th (errornr) quickfix entry from the current entry in the quickfix
! * list 'qfl'. Returns a pointer to the new entry and the index in 'new_qfidx'
*/
static qfline_T *
! get_nth_entry(qf_list_T *qfl, int errornr, int *new_qfidx)
{
! qfline_T *qf_ptr = qfl->qf_ptr;
! int qf_idx = qfl->qf_index;
! // New error number is less than the current error number
while (errornr < qf_idx && qf_idx > 1 && qf_ptr->qf_prev != NULL)
{
--qf_idx;
qf_ptr = qf_ptr->qf_prev;
}
! // New error number is greater than the current error number
while (errornr > qf_idx && qf_idx < qfl->qf_count &&
qf_ptr->qf_next != NULL)
{
***************
*** 2583,2589 ****
qf_ptr = qf_ptr->qf_next;
}
! *cur_qfidx = qf_idx;
return qf_ptr;
}
--- 2583,2615 ----
qf_ptr = qf_ptr->qf_next;
}
! *new_qfidx = qf_idx;
! 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;
}
***************
*** 2881,2886 ****
--- 2907,2915 ----
/*
* Edit the selected file or help file.
+ * Returns OK if successfully edited the file, FAIL on failing to open the
+ * buffer and NOTDONE if the quickfix/location list was freed by an autocmd
+ * when opening the buffer.
*/
static int
qf_jump_edit_buffer(
***************
*** 2888,2895 ****
qfline_T *qf_ptr,
int forceit,
win_T *oldwin,
! int *opened_window,
! int *abort)
{
qf_list_T *qfl = &qi->qf_lists[qi->qf_curlist];
int retval = OK;
--- 2917,2923 ----
qfline_T *qf_ptr,
int forceit,
win_T *oldwin,
! int *opened_window)
{
qf_list_T *qfl = &qi->qf_lists[qi->qf_curlist];
int retval = OK;
***************
*** 2925,2937 ****
if (!win_valid_any_tab(oldwin))
{
EMSG(_("E924: Current window was closed"));
- *abort = TRUE;
*opened_window = FALSE;
}
else if (!qflist_valid(oldwin, save_qfid))
{
EMSG(_(e_loc_list_changed));
! *abort = TRUE;
}
}
else if (old_qf_curlist != qi->qf_curlist
--- 2953,2965 ----
if (!win_valid_any_tab(oldwin))
{
EMSG(_("E924: Current window was closed"));
*opened_window = FALSE;
+ return NOTDONE;
}
else if (!qflist_valid(oldwin, save_qfid))
{
EMSG(_(e_loc_list_changed));
! return NOTDONE;
}
}
else if (old_qf_curlist != qi->qf_curlist
***************
*** 2941,2951 ****
EMSG(_("E925: Current quickfix was changed"));
else
EMSG(_(e_loc_list_changed));
! *abort = TRUE;
}
-
- if (*abort)
- retval = FAIL;
}
return retval;
--- 2969,2976 ----
EMSG(_("E925: Current quickfix was changed"));
else
EMSG(_(e_loc_list_changed));
! return NOTDONE;
}
}
return retval;
***************
*** 3066,3071 ****
--- 3091,3180 ----
}
/*
+ * 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);
+
+ #ifdef FEAT_FOLDING
+ if ((fdo_flags & FDO_QUICKFIX) && openfold)
+ foldOpenCursor();
+ #endif
+ if (print_message)
+ qf_jump_print_msg(qi, qf_index, qf_ptr, old_curbuf, old_lnum);
+
+ return retval;
+ }
+
+ /*
* jump to a quickfix line
* if dir == FORWARD go "errornr" valid entries forward
* if dir == BACKWARD go "errornr" valid entries backward
***************
*** 3085,3099 ****
qfline_T *old_qf_ptr;
int qf_index;
int old_qf_index;
- buf_T *old_curbuf;
- linenr_T old_lnum;
char_u *old_swb = p_swb;
unsigned old_swb_flags = swb_flags;
int opened_window = FALSE;
win_T *oldwin = curwin;
int print_message = TRUE;
#ifdef FEAT_FOLDING
! int old_KeyTyped = KeyTyped; /* getting file may
reset it */
#endif
int retval = OK;
--- 3194,3206 ----
qfline_T *old_qf_ptr;
int qf_index;
int old_qf_index;
char_u *old_swb = p_swb;
unsigned old_swb_flags = swb_flags;
int opened_window = FALSE;
win_T *oldwin = curwin;
int print_message = TRUE;
#ifdef FEAT_FOLDING
! int old_KeyTyped = KeyTyped; // getting file may
reset it
#endif
int retval = OK;
***************
*** 3113,3208 ****
old_qf_ptr = qf_ptr;
qf_index = qfl->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);
! if (qf_ptr == NULL)
! {
! qf_ptr = old_qf_ptr;
! qf_index = old_qf_index;
! 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;
if (qf_win_pos_update(qi, old_qf_index))
! /* No need to print the error message if it's visible in the error
! * window */
print_message = FALSE;
! /*
! * 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)
! goto theend;
!
! /*
! * 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)
! goto theend;
!
! if (qf_jump_to_usable_window(qf_ptr->qf_fnum, &opened_window) == FAIL)
! goto failed;
}
! /*
! * 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)
! {
! 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);
!
! #ifdef FEAT_FOLDING
! if ((fdo_flags & FDO_QUICKFIX) && old_KeyTyped)
! foldOpenCursor();
! #endif
! if (print_message)
! qf_jump_print_msg(qi, qf_index, qf_ptr, old_curbuf, old_lnum);
! }
! else
{
if (opened_window)
! win_close(curwin, TRUE); /* Close opened window */
if (qf_ptr != NULL && qf_ptr->qf_fnum != 0)
{
! /*
! * Couldn't open file, so put index back where it was. This could
! * happen if the file was readonly and we changed something.
! */
failed:
qf_ptr = old_qf_ptr;
qf_index = old_qf_index;
--- 3220,3263 ----
old_qf_ptr = qf_ptr;
qf_index = qfl->qf_index;
old_qf_index = qf_index;
!
! qf_ptr = qf_get_entry(qfl, errornr, dir, &qf_index);
! if (qf_ptr == NULL)
{
! qf_ptr = old_qf_ptr;
! qf_index = old_qf_index;
! goto theend;
}
qfl->qf_index = qf_index;
if (qf_win_pos_update(qi, old_qf_index))
! // No need to print the error message if it's visible in the error
! // window
print_message = FALSE;
! retval = qf_jump_open_window(qi, qf_ptr, &opened_window);
! if (retval == FAIL)
! goto failed;
! if (retval == NOTDONE)
! goto theend;
!
! retval = qf_jump_to_buffer(qi, qf_index, qf_ptr, forceit, oldwin,
! &opened_window, old_KeyTyped, print_message);
! if (retval == NOTDONE)
! {
! // Quickfix/location list is freed by an autocmd
! qi = NULL;
! qf_ptr = NULL;
}
! if (retval != OK)
{
if (opened_window)
! win_close(curwin, TRUE); // Close opened window
if (qf_ptr != NULL && qf_ptr->qf_fnum != 0)
{
! // Couldn't open file, so put index back where it was. This could
! // happen if the file was readonly and we changed something.
failed:
qf_ptr = old_qf_ptr;
qf_index = old_qf_index;
***************
*** 3216,3223 ****
}
if (p_swb != old_swb && opened_window)
{
! /* Restore old 'switchbuf' value, but not when an autocommand or
! * modeline has changed the value. */
if (p_swb == empty_option)
{
p_swb = old_swb;
--- 3271,3278 ----
}
if (p_swb != old_swb && opened_window)
{
! // Restore old 'switchbuf' value, but not when an autocommand or
! // modeline has changed the value.
if (p_swb == empty_option)
{
p_swb = old_swb;
*** ../vim-8.1.0430/src/version.c 2018-09-24 21:32:07.321727079 +0200
--- src/version.c 2018-09-24 21:47:33.241429809 +0200
***************
*** 796,797 ****
--- 796,799 ----
{ /* Add new patch number below this line */
+ /**/
+ 431,
/**/
--
hundred-and-one symptoms of being an internet addict:
92. It takes you two hours to check all 14 of your mailboxes.
/// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net \\\
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\ an exciting new programming language -- http://www.Zimbu.org ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.