Patch 8.0.1389
Problem:    getqflist() items are missing if not set, that makes it more
            difficult to handle the values.
Solution:   When a value is not available return zero or another invalid
            value. (Yegappan Lakshmanan, closes #2430)
Files:      runtime/doc/eval.txt, src/quickfix.c,
            src/testdir/test_quickfix.vim


*** ../vim-8.0.1388/runtime/doc/eval.txt        2017-12-10 21:06:17.739851817 
+0100
--- runtime/doc/eval.txt        2017-12-12 22:37:45.533011369 +0100
***************
*** 2331,2343 ****
  setcmdpos({pos})              Number  set cursor position in command-line
  setfperm({fname}, {mode})     Number  set {fname} file permissions to {mode}
  setline({lnum}, {line})               Number  set line {lnum} to {line}
! setloclist({nr}, {list}[, {action}[, {what}]])
                                Number  modify location list using {list}
  setmatches({list})            Number  restore a list of matches
  setpos({expr}, {list})                Number  set the {expr} position to 
{list}
! setqflist({list}[, {action}[, {what}]])
                                Number  modify quickfix list using {list}
! setreg({n}, {v}[, {opt}])     Number  set register to value and type
  settabvar({nr}, {varname}, {val}) none        set {varname} in tab page {nr} 
to {val}
  settabwinvar({tabnr}, {winnr}, {varname}, {val})
                                none    set {varname} in window {winnr} in tab
--- 2331,2343 ----
  setcmdpos({pos})              Number  set cursor position in command-line
  setfperm({fname}, {mode})     Number  set {fname} file permissions to {mode}
  setline({lnum}, {line})               Number  set line {lnum} to {line}
! setloclist({nr}, {list} [, {action} [, {what}]])
                                Number  modify location list using {list}
  setmatches({list})            Number  restore a list of matches
  setpos({expr}, {list})                Number  set the {expr} position to 
{list}
! setqflist({list} [, {action} [, {what}]])
                                Number  modify quickfix list using {list}
! setreg({n}, {v} [, {opt}])    Number  set register to value and type
  settabvar({nr}, {varname}, {val}) none        set {varname} in tab page {nr} 
to {val}
  settabwinvar({tabnr}, {winnr}, {varname}, {val})
                                none    set {varname} in window {winnr} in tab
***************
*** 4564,4570 ****
  
  <             To get lines from another buffer see |getbufline()|
  
! getloclist({nr}[, {what}])                            *getloclist()*
                Returns a list with all the entries in the location list for
                window {nr}.  {nr} can be the window number or the |window-ID|.
                When {nr} is zero the current window is used.
--- 4574,4580 ----
  
  <             To get lines from another buffer see |getbufline()|
  
! getloclist({nr} [, {what}])                           *getloclist()*
                Returns a list with all the entries in the location list for
                window {nr}.  {nr} can be the window number or the |window-ID|.
                When {nr} is zero the current window is used.
***************
*** 4677,4683 ****
                        winid   get the quickfix |window-ID|
                        all     all of the above quickfix properties
                Non-string items in {what} are ignored. To get the value of a
!               particular item, set it to one.
                If "nr" is not present then the current quickfix list is used.
                If both "nr" and a non-zero "id" are specified, then the list
                specified by "id" is used.
--- 4687,4693 ----
                        winid   get the quickfix |window-ID|
                        all     all of the above quickfix properties
                Non-string items in {what} are ignored. To get the value of a
!               particular item, set it to zero.
                If "nr" is not present then the current quickfix list is used.
                If both "nr" and a non-zero "id" are specified, then the list
                specified by "id" is used.
***************
*** 4687,4703 ****
                When "lines" is specified, all the other items except "efm"
                are ignored.  The returned dictionary contains the entry
                "items" with the list of entries.
-               In case of error processing {what}, an empty dictionary is
-               returned.
  
                The returned dictionary contains the following entries:
!                       context context information stored with |setqflist()|
!                       id      quickfix list ID |quickfix-ID|
!                       idx     index of the current entry in the list
!                       items   quickfix list entries
!                       nr      quickfix list number
!                       size    number of entries in the quickfix list
!                       title   quickfix list title text
                        winid   quickfix |window-ID|. If not present, set to 0
  
                Examples: >
--- 4697,4717 ----
                When "lines" is specified, all the other items except "efm"
                are ignored.  The returned dictionary contains the entry
                "items" with the list of entries.
  
                The returned dictionary contains the following entries:
!                       context context information stored with |setqflist()|.
!                               If not present, set to "".
!                       id      quickfix list ID |quickfix-ID|. If not
!                               present, set to 0.
!                       idx     index of the current entry in the list. If not
!                               present, set to 0.
!                       items   quickfix list entries. If not present, set to
!                               an empty list.
!                       nr      quickfix list number. If not present, set to 0
!                       size    number of entries in the quickfix list. If not
!                               present, set to 0.
!                       title   quickfix list title text. If not present, set
!                               to "".
                        winid   quickfix |window-ID|. If not present, set to 0
  
                Examples: >
*** ../vim-8.0.1388/src/quickfix.c      2017-12-10 15:25:12.510523225 +0100
--- src/quickfix.c      2017-12-12 22:37:45.533011369 +0100
***************
*** 4863,4932 ****
      if (wp != NULL)
        qi = GET_LOC_LIST(wp);
  
-     /* List is not present or is empty */
-     if (qi == NULL || qi->qf_listcount == 0)
-     {
-       /* If querying for the size of the list, return 0 */
-       if (((di = dict_find(what, (char_u *)"nr", -1)) != NULL)
-               && (di->di_tv.v_type == VAR_STRING)
-               && (STRCMP(di->di_tv.vval.v_string, "$") == 0))
-           return dict_add_nr_str(retdict, "nr", 0, NULL);
-       return FAIL;
-     }
- 
-     qf_idx = qi->qf_curlist;          /* default is the current list */
-     if ((di = dict_find(what, (char_u *)"nr", -1)) != NULL)
-     {
-       /* Use the specified quickfix/location list */
-       if (di->di_tv.v_type == VAR_NUMBER)
-       {
-           /* for zero use the current list */
-           if (di->di_tv.vval.v_number != 0)
-           {
-               qf_idx = di->di_tv.vval.v_number - 1;
-               if (qf_idx < 0 || qf_idx >= qi->qf_listcount)
-                   return FAIL;
-           }
-       }
-       else if ((di->di_tv.v_type == VAR_STRING)
-               && (STRCMP(di->di_tv.vval.v_string, "$") == 0))
-           /* Get the last quickfix list number */
-           qf_idx = qi->qf_listcount - 1;
-       else
-           return FAIL;
-       flags |= QF_GETLIST_NR;
-     }
- 
-     if ((di = dict_find(what, (char_u *)"id", -1)) != NULL)
-     {
-       /* Look for a list with the specified id */
-       if (di->di_tv.v_type == VAR_NUMBER)
-       {
-           /* For zero, use the current list or the list specifed by 'nr' */
-           if (di->di_tv.vval.v_number != 0)
-           {
-               qf_idx = qf_id2nr(qi, di->di_tv.vval.v_number);
-               if (qf_idx == -1)
-                   return FAIL;            /* List not found */
-           }
-           flags |= QF_GETLIST_ID;
-       }
-       else
-           return FAIL;
-     }
- 
      if (dict_find(what, (char_u *)"all", -1) != NULL)
        flags |= QF_GETLIST_ALL;
  
      if (dict_find(what, (char_u *)"title", -1) != NULL)
        flags |= QF_GETLIST_TITLE;
  
      if (dict_find(what, (char_u *)"winid", -1) != NULL)
        flags |= QF_GETLIST_WINID;
  
      if (dict_find(what, (char_u *)"context", -1) != NULL)
        flags |= QF_GETLIST_CONTEXT;
  
      if (dict_find(what, (char_u *)"items", -1) != NULL)
        flags |= QF_GETLIST_ITEMS;
  
--- 4863,4886 ----
      if (wp != NULL)
        qi = GET_LOC_LIST(wp);
  
      if (dict_find(what, (char_u *)"all", -1) != NULL)
        flags |= QF_GETLIST_ALL;
  
      if (dict_find(what, (char_u *)"title", -1) != NULL)
        flags |= QF_GETLIST_TITLE;
  
+     if (dict_find(what, (char_u *)"nr", -1) != NULL)
+       flags |= QF_GETLIST_NR;
+ 
      if (dict_find(what, (char_u *)"winid", -1) != NULL)
        flags |= QF_GETLIST_WINID;
  
      if (dict_find(what, (char_u *)"context", -1) != NULL)
        flags |= QF_GETLIST_CONTEXT;
  
+     if (dict_find(what, (char_u *)"id", -1) != NULL)
+       flags |= QF_GETLIST_ID;
+ 
      if (dict_find(what, (char_u *)"items", -1) != NULL)
        flags |= QF_GETLIST_ITEMS;
  
***************
*** 4936,4941 ****
--- 4890,4966 ----
      if (dict_find(what, (char_u *)"size", -1) != NULL)
        flags |= QF_GETLIST_SIZE;
  
+     if (qi != NULL && qi->qf_listcount != 0)
+     {
+       qf_idx = qi->qf_curlist;        /* default is the current list */
+       if ((di = dict_find(what, (char_u *)"nr", -1)) != NULL)
+       {
+           /* Use the specified quickfix/location list */
+           if (di->di_tv.v_type == VAR_NUMBER)
+           {
+               /* for zero use the current list */
+               if (di->di_tv.vval.v_number != 0)
+               {
+                   qf_idx = di->di_tv.vval.v_number - 1;
+                   if (qf_idx < 0 || qf_idx >= qi->qf_listcount)
+                       qf_idx = -1;
+               }
+           }
+           else if ((di->di_tv.v_type == VAR_STRING)
+                   && (STRCMP(di->di_tv.vval.v_string, "$") == 0))
+               /* Get the last quickfix list number */
+               qf_idx = qi->qf_listcount - 1;
+           else
+               qf_idx = -1;
+           flags |= QF_GETLIST_NR;
+       }
+ 
+       if ((di = dict_find(what, (char_u *)"id", -1)) != NULL)
+       {
+           /* Look for a list with the specified id */
+           if (di->di_tv.v_type == VAR_NUMBER)
+           {
+               /*
+                * For zero, use the current list or the list specifed by 'nr'
+                */
+               if (di->di_tv.vval.v_number != 0)
+                   qf_idx = qf_id2nr(qi, di->di_tv.vval.v_number);
+               flags |= QF_GETLIST_ID;
+           }
+           else
+               qf_idx = -1;
+       }
+     }
+ 
+     /* List is not present or is empty */
+     if (qi == NULL || qi->qf_listcount == 0 || qf_idx == -1)
+     {
+       if (flags & QF_GETLIST_TITLE)
+           status = dict_add_nr_str(retdict, "title", 0L, (char_u *)"");
+       if ((status == OK) && (flags & QF_GETLIST_ITEMS))
+       {
+           list_T      *l = list_alloc();
+           if (l != NULL)
+               status = dict_add_list(retdict, "items", l);
+           else
+               status = FAIL;
+       }
+       if ((status == OK) && (flags & QF_GETLIST_NR))
+           status = dict_add_nr_str(retdict, "nr", 0L, NULL);
+       if ((status == OK) && (flags & QF_GETLIST_WINID))
+           status = dict_add_nr_str(retdict, "winid", 0L, NULL);
+       if ((status == OK) && (flags & QF_GETLIST_CONTEXT))
+           status = dict_add_nr_str(retdict, "context", 0L, (char_u *)"");
+       if ((status == OK) && (flags & QF_GETLIST_ID))
+           status = dict_add_nr_str(retdict, "id", 0L, NULL);
+       if ((status == OK) && (flags & QF_GETLIST_IDX))
+           status = dict_add_nr_str(retdict, "idx", 0L, NULL);
+       if ((status == OK) && (flags & QF_GETLIST_SIZE))
+           status = dict_add_nr_str(retdict, "size", 0L, NULL);
+ 
+       return status;
+     }
+ 
      if (flags & QF_GETLIST_TITLE)
      {
        char_u  *t;
*** ../vim-8.0.1388/src/testdir/test_quickfix.vim       2017-12-10 
15:25:12.510523225 +0100
--- src/testdir/test_quickfix.vim       2017-12-12 22:37:45.537011341 +0100
***************
*** 1833,1840 ****
      call assert_equal(-1, s)
  
      call assert_equal({}, g:Xgetlist({'abc':1}))
!     call assert_equal({}, g:Xgetlist({'nr':99, 'title':1}))
!     call assert_equal({}, g:Xgetlist({'nr':[], 'title':1}))
  
      if a:cchar == 'l'
        call assert_equal({}, getloclist(99, {'title': 1}))
--- 1833,1840 ----
      call assert_equal(-1, s)
  
      call assert_equal({}, g:Xgetlist({'abc':1}))
!     call assert_equal('', g:Xgetlist({'nr':99, 'title':1}).title)
!     call assert_equal('', g:Xgetlist({'nr':[], 'title':1}).title)
  
      if a:cchar == 'l'
        call assert_equal({}, getloclist(99, {'title': 1}))
***************
*** 1870,1876 ****
        call assert_equal([1, 2], getloclist(w2_id, {'context':1}).context)
        only
        call setloclist(0, [], 'f')
!       call assert_equal({}, getloclist(0, {'context':1}))
      endif
  
      " Test for changing the context of previous quickfix lists
--- 1870,1876 ----
        call assert_equal([1, 2], getloclist(w2_id, {'context':1}).context)
        only
        call setloclist(0, [], 'f')
!       call assert_equal('', getloclist(0, {'context':1}).context)
      endif
  
      " Test for changing the context of previous quickfix lists
***************
*** 2383,2390 ****
  
    call g:Xsetlist([], 'f')
    call assert_equal(0, g:Xgetlist({'nr':'$'}).nr)
!   call assert_equal(1, len(g:Xgetlist({'nr':'$', 'all':1})))
!   call assert_equal(0, len(g:Xgetlist({'nr':0})))
  
    Xexpr "File1:10:Line1"
    Xexpr "File2:20:Line2"
--- 2383,2390 ----
  
    call g:Xsetlist([], 'f')
    call assert_equal(0, g:Xgetlist({'nr':'$'}).nr)
!   call assert_equal('', g:Xgetlist({'nr':'$', 'all':1}).title)
!   call assert_equal(0, g:Xgetlist({'nr':0}).nr)
  
    Xexpr "File1:10:Line1"
    Xexpr "File2:20:Line2"
***************
*** 2754,2760 ****
    call s:setup_commands(a:cchar)
  
    call g:Xsetlist([], 'f')
!   call assert_equal({}, g:Xgetlist({'id':0}))
    Xexpr ''
    let start_id = g:Xgetlist({'id' : 0}).id
    Xexpr '' | Xexpr ''
--- 2754,2760 ----
    call s:setup_commands(a:cchar)
  
    call g:Xsetlist([], 'f')
!   call assert_equal(0, g:Xgetlist({'id':0}).id)
    Xexpr ''
    let start_id = g:Xgetlist({'id' : 0}).id
    Xexpr '' | Xexpr ''
***************
*** 2762,2771 ****
    call assert_equal(start_id, g:Xgetlist({'id':0, 'nr':1}).id)
    call assert_equal(start_id + 1, g:Xgetlist({'id':0, 'nr':0}).id)
    call assert_equal(start_id + 2, g:Xgetlist({'id':0, 'nr':'$'}).id)
!   call assert_equal({}, g:Xgetlist({'id':0, 'nr':99}))
    call assert_equal(2, g:Xgetlist({'id':start_id + 1, 'nr':0}).nr)
!   call assert_equal({}, g:Xgetlist({'id':99, 'nr':0}))
!   call assert_equal({}, g:Xgetlist({'id':"abc", 'nr':0}))
  
    call g:Xsetlist([], 'a', {'id':start_id, 'context':[1,2]})
    call assert_equal([1,2], g:Xgetlist({'nr':1, 'context':1}).context)
--- 2762,2771 ----
    call assert_equal(start_id, g:Xgetlist({'id':0, 'nr':1}).id)
    call assert_equal(start_id + 1, g:Xgetlist({'id':0, 'nr':0}).id)
    call assert_equal(start_id + 2, g:Xgetlist({'id':0, 'nr':'$'}).id)
!   call assert_equal(0, g:Xgetlist({'id':0, 'nr':99}).id)
    call assert_equal(2, g:Xgetlist({'id':start_id + 1, 'nr':0}).nr)
!   call assert_equal(0, g:Xgetlist({'id':99, 'nr':0}).id)
!   call assert_equal(0, g:Xgetlist({'id':"abc", 'nr':0}).id)
  
    call g:Xsetlist([], 'a', {'id':start_id, 'context':[1,2]})
    call assert_equal([1,2], g:Xgetlist({'nr':1, 'context':1}).context)
***************
*** 2776,2782 ****
  
    let qfid = g:Xgetlist({'id':0, 'nr':0})
    call g:Xsetlist([], 'f')
!   call assert_equal({}, g:Xgetlist({'id':qfid, 'nr':0}))
  endfunc
  
  func Test_qf_id()
--- 2776,2782 ----
  
    let qfid = g:Xgetlist({'id':0, 'nr':0})
    call g:Xsetlist([], 'f')
!   call assert_equal(0, g:Xgetlist({'id':qfid, 'nr':0}).id)
  endfunc
  
  func Test_qf_id()
***************
*** 2880,2882 ****
--- 2880,2941 ----
    call Xqfjump_tests('c')
    call Xqfjump_tests('l')
  endfunc
+ 
+ " Tests for the getqflist() and getloclist() functions when the list is not
+ " present or is empty
+ func Xgetlist_empty_tests(cchar)
+   call s:setup_commands(a:cchar)
+ 
+   " Empty quickfix stack
+   call g:Xsetlist([], 'f')
+   call assert_equal('', g:Xgetlist({'context' : 0}).context)
+   call assert_equal(0, g:Xgetlist({'id' : 0}).id)
+   call assert_equal(0, g:Xgetlist({'idx' : 0}).idx)
+   call assert_equal([], g:Xgetlist({'items' : 0}).items)
+   call assert_equal(0, g:Xgetlist({'nr' : 0}).nr)
+   call assert_equal(0, g:Xgetlist({'size' : 0}).size)
+   call assert_equal('', g:Xgetlist({'title' : 0}).title)
+   call assert_equal(0, g:Xgetlist({'winid' : 0}).winid)
+   call assert_equal({'context' : '', 'id' : 0, 'idx' : 0, 'items' : [], 'nr' 
: 0, 'size' : 0, 'title' : '', 'winid' : 0}, g:Xgetlist({'all' : 0}))
+ 
+   " Empty quickfix list
+   Xexpr ""
+   call assert_equal('', g:Xgetlist({'context' : 0}).context)
+   call assert_notequal(0, g:Xgetlist({'id' : 0}).id)
+   call assert_equal(0, g:Xgetlist({'idx' : 0}).idx)
+   call assert_equal([], g:Xgetlist({'items' : 0}).items)
+   call assert_notequal(0, g:Xgetlist({'nr' : 0}).nr)
+   call assert_equal(0, g:Xgetlist({'size' : 0}).size)
+   call assert_notequal('', g:Xgetlist({'title' : 0}).title)
+   call assert_equal(0, g:Xgetlist({'winid' : 0}).winid)
+ 
+   let qfid = g:Xgetlist({'id' : 0}).id
+   call g:Xsetlist([], 'f')
+ 
+   " Non-existing quickfix identifier
+   call assert_equal('', g:Xgetlist({'id' : qfid, 'context' : 0}).context)
+   call assert_equal(0, g:Xgetlist({'id' : qfid}).id)
+   call assert_equal(0, g:Xgetlist({'id' : qfid, 'idx' : 0}).idx)
+   call assert_equal([], g:Xgetlist({'id' : qfid, 'items' : 0}).items)
+   call assert_equal(0, g:Xgetlist({'id' : qfid, 'nr' : 0}).nr)
+   call assert_equal(0, g:Xgetlist({'id' : qfid, 'size' : 0}).size)
+   call assert_equal('', g:Xgetlist({'id' : qfid, 'title' : 0}).title)
+   call assert_equal(0, g:Xgetlist({'id' : qfid, 'winid' : 0}).winid)
+   call assert_equal({'context' : '', 'id' : 0, 'idx' : 0, 'items' : [], 'nr' 
: 0, 'size' : 0, 'title' : '', 'winid' : 0}, g:Xgetlist({'id' : qfid, 'all' : 
0}))
+ 
+   " Non-existing quickfix list number
+   call assert_equal('', g:Xgetlist({'nr' : 5, 'context' : 0}).context)
+   call assert_equal(0, g:Xgetlist({'nr' : 5}).nr)
+   call assert_equal(0, g:Xgetlist({'nr' : 5, 'idx' : 0}).idx)
+   call assert_equal([], g:Xgetlist({'nr' : 5, 'items' : 0}).items)
+   call assert_equal(0, g:Xgetlist({'nr' : 5, 'id' : 0}).id)
+   call assert_equal(0, g:Xgetlist({'nr' : 5, 'size' : 0}).size)
+   call assert_equal('', g:Xgetlist({'nr' : 5, 'title' : 0}).title)
+   call assert_equal(0, g:Xgetlist({'nr' : 5, 'winid' : 0}).winid)
+   call assert_equal({'context' : '', 'id' : 0, 'idx' : 0, 'items' : [], 'nr' 
: 0, 'size' : 0, 'title' : '', 'winid' : 0}, g:Xgetlist({'nr' : 5, 'all' : 0}))
+ endfunc
+ 
+ func Test_getqflist()
+   call Xgetlist_empty_tests('c')
+   call Xgetlist_empty_tests('l')
+ endfunc
*** ../vim-8.0.1388/src/version.c       2017-12-12 22:29:26.968498598 +0100
--- src/version.c       2017-12-12 22:42:43.882853940 +0100
***************
*** 773,774 ****
--- 773,776 ----
  {   /* Add new patch number below this line */
+ /**/
+     1389,
  /**/

-- 
>From "know your smileys":
 :-E    Has major dental problems

 /// 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.

Raspunde prin e-mail lui