]> granicus.if.org Git - vim/commitdiff
patch 8.0.1812: the qf_jump_to_usable_window() function is too long v8.0.1812
authorBram Moolenaar <Bram@vim.org>
Thu, 10 May 2018 16:55:28 +0000 (18:55 +0200)
committerBram Moolenaar <Bram@vim.org>
Thu, 10 May 2018 16:55:28 +0000 (18:55 +0200)
Problem:    The qf_jump_to_usable_window() function is too long.
Solution:   Split it in parts. (Yegappan Lakshmanan, closes #2891)

src/quickfix.c
src/version.c

index dbd42ee4a1e61288b95644af21b1f5b487609edb..9e21191e705f1faeceda6f340a28e68363866227 100644 (file)
@@ -2027,7 +2027,7 @@ qf_clean_dir_stack(struct dir_stack_T **stackptr)
  * Cleans up intermediate directory entries.
  *
  * TODO: How to solve the following problem?
- * If we have the this directory tree:
+ * If we have this directory tree:
  *     ./
  *     ./aa
  *     ./aa/bb
@@ -2079,7 +2079,7 @@ qf_guess_filepath(qf_info_T *qi, int qf_idx, char_u *filename)
        vim_free(ds_tmp);
     }
 
-    return ds_ptr==NULL? NULL: ds_ptr->dirname;
+    return ds_ptr == NULL ? NULL : ds_ptr->dirname;
 }
 
 /*
@@ -2108,7 +2108,7 @@ qflist_valid (win_T *wp, int_u qf_id)
 /*
  * When loading a file from the quickfix, the auto commands may modify it.
  * This may invalidate the current quickfix entry.  This function checks
- * whether a entry is still present in the quickfix.
+ * whether an entry is still present in the quickfix list.
  * Similar to location list.
  */
     static int
@@ -2272,6 +2272,21 @@ get_nth_entry(
     return qf_ptr;
 }
 
+/*
+ * Find a window displaying a Vim help file.
+ */
+    static win_T *
+qf_find_help_win(void)
+{
+    win_T *wp;
+
+    FOR_ALL_WINDOWS(wp)
+       if (bt_help(wp->w_buffer))
+           return wp;
+
+    return NULL;
+}
+
 /*
  * Find a help window or open one.
  */
@@ -2284,9 +2299,7 @@ jump_to_help_window(qf_info_T *qi, int *opened_window)
     if (cmdmod.tab != 0)
        wp = NULL;
     else
-       FOR_ALL_WINDOWS(wp)
-           if (bt_help(wp->w_buffer))
-               break;
+       wp = qf_find_help_win();
     if (wp != NULL && wp->w_buffer->b_nwindows > 0)
        win_enter(wp, TRUE);
     else
@@ -2325,8 +2338,175 @@ jump_to_help_window(qf_info_T *qi, int *opened_window)
 }
 
 /*
- * Find a suitable window for opening a file (qf_fnum) and jump to it.
- * If the file is already opened in a window, jump to it.
+ * Find a non-quickfix window using the given location list.
+ * Returns NULL if a matching window is not found.
+ */
+    static win_T *
+qf_find_win_with_loclist(qf_info_T *ll)
+{
+    win_T      *wp;
+
+    FOR_ALL_WINDOWS(wp)
+       if (wp->w_llist == ll && !bt_quickfix(wp->w_buffer))
+           return wp;
+
+    return NULL;
+}
+
+/*
+ * Find a window containing a normal buffer
+ */
+    static win_T *
+qf_find_win_with_normal_buf(void)
+{
+    win_T      *wp;
+
+    FOR_ALL_WINDOWS(wp)
+       if (wp->w_buffer->b_p_bt[0] == NUL)
+           return wp;
+
+    return NULL;
+}
+
+/*
+ * Go to a window in any tabpage containing the specified file.  Returns TRUE
+ * if successfully jumped to the window. Otherwise returns FALSE.
+ */
+    static int
+qf_goto_tabwin_with_file(int fnum)
+{
+    tabpage_T  *tp;
+    win_T      *wp;
+
+    FOR_ALL_TAB_WINDOWS(tp, wp)
+       if (wp->w_buffer->b_fnum == fnum)
+       {
+           goto_tabpage_win(tp, wp);
+           return TRUE;
+       }
+
+    return FALSE;
+}
+
+/*
+ * Create a new window to show a file above the quickfix window. Called when
+ * only the quickfix window is present.
+ */
+    static int
+qf_open_new_file_win(qf_info_T *ll_ref)
+{
+    int                flags;
+
+    flags = WSP_ABOVE;
+    if (ll_ref != NULL)
+       flags |= WSP_NEWLOC;
+    if (win_split(0, flags) == FAIL)
+       return FAIL;            /* not enough room for window */
+    p_swb = empty_option;      /* don't split again */
+    swb_flags = 0;
+    RESET_BINDING(curwin);
+    if (ll_ref != NULL)
+    {
+       /* The new window should use the location list from the
+        * location list window */
+       curwin->w_llist = ll_ref;
+       ll_ref->qf_refcount++;
+    }
+    return OK;
+}
+
+/*
+ * Go to a window that shows the right buffer. If the window is not found, go
+ * to the window just above the location list window. This is used for opening
+ * a file from a location window and not from a quickfix window. If some usable
+ * window is previously found, then it is supplied in 'use_win'.
+ */
+    static void
+qf_goto_win_with_ll_file(win_T *use_win, int qf_fnum, qf_info_T *ll_ref)
+{
+    win_T      *win = use_win;
+
+    if (win == NULL)
+    {
+       /* Find the window showing the selected file */
+       FOR_ALL_WINDOWS(win)
+           if (win->w_buffer->b_fnum == qf_fnum)
+               break;
+       if (win == NULL)
+       {
+           /* Find a previous usable window */
+           win = curwin;
+           do
+           {
+               if (win->w_buffer->b_p_bt[0] == NUL)
+                   break;
+               if (win->w_prev == NULL)
+                   win = lastwin;      /* wrap around the top */
+               else
+                   win = win->w_prev; /* go to previous window */
+           } while (win != curwin);
+       }
+    }
+    win_goto(win);
+
+    /* If the location list for the window is not set, then set it
+     * to the location list from the location window */
+    if (win->w_llist == NULL)
+    {
+       win->w_llist = ll_ref;
+       ll_ref->qf_refcount++;
+    }
+}
+
+/*
+ * Go to a window that shows the specified file. If a window is not found, go
+ * to the window just above the quickfix window. This is used for opening a
+ * file from a quickfix window and not from a location window.
+ */
+    static void
+qf_goto_win_with_qfl_file(int qf_fnum)
+{
+    win_T      *win;
+    win_T      *altwin;
+
+    win = curwin;
+    altwin = NULL;
+    for (;;)
+    {
+       if (win->w_buffer->b_fnum == qf_fnum)
+           break;
+       if (win->w_prev == NULL)
+           win = lastwin;      /* wrap around the top */
+       else
+           win = win->w_prev;  /* go to previous window */
+
+       if (IS_QF_WINDOW(win))
+       {
+           /* Didn't find it, go to the window before the quickfix
+            * window. */
+           if (altwin != NULL)
+               win = altwin;
+           else if (curwin->w_prev != NULL)
+               win = curwin->w_prev;
+           else
+               win = curwin->w_next;
+           break;
+       }
+
+       /* Remember a usable window. */
+       if (altwin == NULL && !win->w_p_pvw
+               && win->w_buffer->b_p_bt[0] == NUL)
+           altwin = win;
+    }
+
+    win_goto(win);
+}
+
+/*
+ * Find a suitable window for opening a file (qf_fnum) from the
+ * quickfix/location list and jump to it.  If the file is already opened in a
+ * window, jump to it. Otherwise open a new window to display the file. This is
+ * called from either a quickfix or a location list window.
  */
     static int
 qf_jump_to_usable_window(int qf_fnum, int *opened_window)
@@ -2334,35 +2514,25 @@ qf_jump_to_usable_window(int qf_fnum, int *opened_window)
     win_T      *usable_win_ptr = NULL;
     int                usable_win;
     qf_info_T  *ll_ref;
-    int                flags;
     win_T      *win;
-    win_T      *altwin;
 
     usable_win = 0;
 
     ll_ref = curwin->w_llist_ref;
     if (ll_ref != NULL)
     {
-       /* Find a window using the same location list that is not a
-        * quickfix window. */
-       FOR_ALL_WINDOWS(usable_win_ptr)
-           if (usable_win_ptr->w_llist == ll_ref
-                   && !bt_quickfix(usable_win_ptr->w_buffer))
-           {
-               usable_win = 1;
-               break;
-           }
+       /* Find a non-quickfix window with this location list */
+       usable_win_ptr = qf_find_win_with_loclist(ll_ref);
+       if (usable_win_ptr != NULL)
+           usable_win = 1;
     }
 
     if (!usable_win)
     {
        /* Locate a window showing a normal buffer */
-       FOR_ALL_WINDOWS(win)
-           if (win->w_buffer->b_p_bt[0] == NUL)
-           {
-               usable_win = 1;
-               break;
-           }
+       win = qf_find_win_with_normal_buf();
+       if (win != NULL)
+           usable_win = 1;
     }
 
     /*
@@ -2370,21 +2540,7 @@ qf_jump_to_usable_window(int qf_fnum, int *opened_window)
      * then search in other tabs.
      */
     if (!usable_win && (swb_flags & SWB_USETAB))
-    {
-       tabpage_T       *tp;
-       win_T   *wp;
-
-       FOR_ALL_TAB_WINDOWS(tp, wp)
-       {
-           if (wp->w_buffer->b_fnum == qf_fnum)
-           {
-               goto_tabpage_win(tp, wp);
-               usable_win = 1;
-               goto win_found;
-           }
-       }
-    }
-win_found:
+       usable_win = qf_goto_tabwin_with_file(qf_fnum);
 
     /*
      * If there is only one window and it is the quickfix window, create a
@@ -2392,99 +2548,16 @@ win_found:
      */
     if ((ONE_WINDOW && bt_quickfix(curbuf)) || !usable_win)
     {
-       flags = WSP_ABOVE;
-       if (ll_ref != NULL)
-           flags |= WSP_NEWLOC;
-       if (win_split(0, flags) == FAIL)
-           return FAIL;                /* not enough room for window */
+       if (qf_open_new_file_win(ll_ref) != OK)
+           return FAIL;
        *opened_window = TRUE;  /* close it when fail */
-       p_swb = empty_option;   /* don't split again */
-       swb_flags = 0;
-       RESET_BINDING(curwin);
-       if (ll_ref != NULL)
-       {
-           /* The new window should use the location list from the
-            * location list window */
-           curwin->w_llist = ll_ref;
-           ll_ref->qf_refcount++;
-       }
     }
     else
     {
-       if (curwin->w_llist_ref != NULL)
-       {
-           /* In a location window */
-           win = usable_win_ptr;
-           if (win == NULL)
-           {
-               /* Find the window showing the selected file */
-               FOR_ALL_WINDOWS(win)
-                   if (win->w_buffer->b_fnum == qf_fnum)
-                       break;
-               if (win == NULL)
-               {
-                   /* Find a previous usable window */
-                   win = curwin;
-                   do
-                   {
-                       if (win->w_buffer->b_p_bt[0] == NUL)
-                           break;
-                       if (win->w_prev == NULL)
-                           win = lastwin;      /* wrap around the top */
-                       else
-                           win = win->w_prev; /* go to previous window */
-                   } while (win != curwin);
-               }
-           }
-           win_goto(win);
-
-           /* If the location list for the window is not set, then set it
-            * to the location list from the location window */
-           if (win->w_llist == NULL)
-           {
-               win->w_llist = ll_ref;
-               ll_ref->qf_refcount++;
-           }
-       }
-       else
-       {
-
-           /*
-            * Try to find a window that shows the right buffer.
-            * Default to the window just above the quickfix buffer.
-            */
-           win = curwin;
-           altwin = NULL;
-           for (;;)
-           {
-               if (win->w_buffer->b_fnum == qf_fnum)
-                   break;
-               if (win->w_prev == NULL)
-                   win = lastwin;      /* wrap around the top */
-               else
-                   win = win->w_prev;  /* go to previous window */
-
-               if (IS_QF_WINDOW(win))
-               {
-                   /* Didn't find it, go to the window before the quickfix
-                    * window. */
-                   if (altwin != NULL)
-                       win = altwin;
-                   else if (curwin->w_prev != NULL)
-                       win = curwin->w_prev;
-                   else
-                       win = curwin->w_next;
-                   break;
-               }
-
-               /* Remember a usable window. */
-               if (altwin == NULL && !win->w_p_pvw
-                       && win->w_buffer->b_p_bt[0] == NUL)
-                   altwin = win;
-           }
-
-           win_goto(win);
-       }
+       if (curwin->w_llist_ref != NULL)        /* In a location window */
+           qf_goto_win_with_ll_file(usable_win_ptr, qf_fnum, ll_ref);
+       else                                    /* In a quickfix window */
+           qf_goto_win_with_qfl_file(qf_fnum);
     }
 
     return OK;
@@ -2562,8 +2635,8 @@ qf_jump_edit_buffer(
 }
 
 /*
- * Goto the error line in the current file using either line/column number or a
- * search pattern.
+ * Go to the error line in the current file using either line/column number or
+ * search pattern.
  */
     static void
 qf_jump_goto_line(
@@ -5779,7 +5852,7 @@ qf_setprop_context(qf_info_T *qi, int qf_idx, dictitem_T *di)
 /*
  * Set quickfix/location list properties (title, items, context).
  * Also used to add items from parsing a list of lines.
- * Used by the setqflist() and setloclist() VimL functions.
+ * Used by the setqflist() and setloclist() Vim script functions.
  */
     static int
 qf_set_properties(qf_info_T *qi, dict_T *what, int action, char_u *title)
@@ -6162,9 +6235,7 @@ hgr_get_ll(int *new_ll)
        wp = curwin;
     else
        /* Find an existing help window */
-       FOR_ALL_WINDOWS(wp)
-           if (bt_help(wp->w_buffer))
-               break;
+       wp = qf_find_help_win();
 
     if (wp == NULL)        /* Help window not found */
        qi = NULL;
index d8819ae5b44c3a52915d47d432eff951dff388ab..a2644f1a375de24493fb494aad5d332114f8eac9 100644 (file)
@@ -761,6 +761,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1812,
 /**/
     1811,
 /**/