forked from aniani/vim
patch 8.0.1389: getqflist() items are missing if not set
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)
This commit is contained in:
@@ -4687,7 +4687,7 @@ getqflist([{what}]) *getqflist()*
|
|||||||
winid get the quickfix |window-ID|
|
winid get the quickfix |window-ID|
|
||||||
all all of the above quickfix properties
|
all all of the above quickfix properties
|
||||||
Non-string items in {what} are ignored. To get the value of a
|
Non-string items in {what} are ignored. To get the value of a
|
||||||
particular item, set it to one.
|
particular item, set it to zero.
|
||||||
If "nr" is not present then the current quickfix list is used.
|
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
|
If both "nr" and a non-zero "id" are specified, then the list
|
||||||
specified by "id" is used.
|
specified by "id" is used.
|
||||||
@@ -4697,17 +4697,21 @@ getqflist([{what}]) *getqflist()*
|
|||||||
When "lines" is specified, all the other items except "efm"
|
When "lines" is specified, all the other items except "efm"
|
||||||
are ignored. The returned dictionary contains the entry
|
are ignored. The returned dictionary contains the entry
|
||||||
"items" with the list of entries.
|
"items" with the list of entries.
|
||||||
In case of error processing {what}, an empty dictionary is
|
|
||||||
returned.
|
|
||||||
|
|
||||||
The returned dictionary contains the following entries:
|
The returned dictionary contains the following entries:
|
||||||
context context information stored with |setqflist()|
|
context context information stored with |setqflist()|.
|
||||||
id quickfix list ID |quickfix-ID|
|
If not present, set to "".
|
||||||
idx index of the current entry in the list
|
id quickfix list ID |quickfix-ID|. If not
|
||||||
items quickfix list entries
|
present, set to 0.
|
||||||
nr quickfix list number
|
idx index of the current entry in the list. If not
|
||||||
size number of entries in the quickfix list
|
present, set to 0.
|
||||||
title quickfix list title text
|
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
|
winid quickfix |window-ID|. If not present, set to 0
|
||||||
|
|
||||||
Examples: >
|
Examples: >
|
||||||
|
@@ -4863,17 +4863,35 @@ qf_get_properties(win_T *wp, dict_T *what, dict_T *retdict)
|
|||||||
if (wp != NULL)
|
if (wp != NULL)
|
||||||
qi = GET_LOC_LIST(wp);
|
qi = GET_LOC_LIST(wp);
|
||||||
|
|
||||||
/* List is not present or is empty */
|
if (dict_find(what, (char_u *)"all", -1) != NULL)
|
||||||
if (qi == NULL || qi->qf_listcount == 0)
|
flags |= QF_GETLIST_ALL;
|
||||||
{
|
|
||||||
/* 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;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
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;
|
||||||
|
|
||||||
|
if (dict_find(what, (char_u *)"idx", -1) != NULL)
|
||||||
|
flags |= QF_GETLIST_IDX;
|
||||||
|
|
||||||
|
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 */
|
qf_idx = qi->qf_curlist; /* default is the current list */
|
||||||
if ((di = dict_find(what, (char_u *)"nr", -1)) != NULL)
|
if ((di = dict_find(what, (char_u *)"nr", -1)) != NULL)
|
||||||
{
|
{
|
||||||
@@ -4885,7 +4903,7 @@ qf_get_properties(win_T *wp, dict_T *what, dict_T *retdict)
|
|||||||
{
|
{
|
||||||
qf_idx = di->di_tv.vval.v_number - 1;
|
qf_idx = di->di_tv.vval.v_number - 1;
|
||||||
if (qf_idx < 0 || qf_idx >= qi->qf_listcount)
|
if (qf_idx < 0 || qf_idx >= qi->qf_listcount)
|
||||||
return FAIL;
|
qf_idx = -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if ((di->di_tv.v_type == VAR_STRING)
|
else if ((di->di_tv.v_type == VAR_STRING)
|
||||||
@@ -4893,7 +4911,7 @@ qf_get_properties(win_T *wp, dict_T *what, dict_T *retdict)
|
|||||||
/* Get the last quickfix list number */
|
/* Get the last quickfix list number */
|
||||||
qf_idx = qi->qf_listcount - 1;
|
qf_idx = qi->qf_listcount - 1;
|
||||||
else
|
else
|
||||||
return FAIL;
|
qf_idx = -1;
|
||||||
flags |= QF_GETLIST_NR;
|
flags |= QF_GETLIST_NR;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4902,39 +4920,46 @@ qf_get_properties(win_T *wp, dict_T *what, dict_T *retdict)
|
|||||||
/* Look for a list with the specified id */
|
/* Look for a list with the specified id */
|
||||||
if (di->di_tv.v_type == VAR_NUMBER)
|
if (di->di_tv.v_type == VAR_NUMBER)
|
||||||
{
|
{
|
||||||
/* For zero, use the current list or the list specifed by 'nr' */
|
/*
|
||||||
|
* For zero, use the current list or the list specifed by 'nr'
|
||||||
|
*/
|
||||||
if (di->di_tv.vval.v_number != 0)
|
if (di->di_tv.vval.v_number != 0)
|
||||||
{
|
|
||||||
qf_idx = qf_id2nr(qi, di->di_tv.vval.v_number);
|
qf_idx = qf_id2nr(qi, di->di_tv.vval.v_number);
|
||||||
if (qf_idx == -1)
|
|
||||||
return FAIL; /* List not found */
|
|
||||||
}
|
|
||||||
flags |= QF_GETLIST_ID;
|
flags |= QF_GETLIST_ID;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return FAIL;
|
qf_idx = -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (dict_find(what, (char_u *)"all", -1) != NULL)
|
/* List is not present or is empty */
|
||||||
flags |= QF_GETLIST_ALL;
|
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);
|
||||||
|
|
||||||
if (dict_find(what, (char_u *)"title", -1) != NULL)
|
return status;
|
||||||
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;
|
|
||||||
|
|
||||||
if (dict_find(what, (char_u *)"idx", -1) != NULL)
|
|
||||||
flags |= QF_GETLIST_IDX;
|
|
||||||
|
|
||||||
if (dict_find(what, (char_u *)"size", -1) != NULL)
|
|
||||||
flags |= QF_GETLIST_SIZE;
|
|
||||||
|
|
||||||
if (flags & QF_GETLIST_TITLE)
|
if (flags & QF_GETLIST_TITLE)
|
||||||
{
|
{
|
||||||
|
@@ -1833,8 +1833,8 @@ func Xproperty_tests(cchar)
|
|||||||
call assert_equal(-1, s)
|
call assert_equal(-1, s)
|
||||||
|
|
||||||
call assert_equal({}, g:Xgetlist({'abc':1}))
|
call assert_equal({}, g:Xgetlist({'abc':1}))
|
||||||
call assert_equal({}, g:Xgetlist({'nr':99, 'title':1}))
|
call assert_equal('', g:Xgetlist({'nr':99, 'title':1}).title)
|
||||||
call assert_equal({}, g:Xgetlist({'nr':[], 'title':1}))
|
call assert_equal('', g:Xgetlist({'nr':[], 'title':1}).title)
|
||||||
|
|
||||||
if a:cchar == 'l'
|
if a:cchar == 'l'
|
||||||
call assert_equal({}, getloclist(99, {'title': 1}))
|
call assert_equal({}, getloclist(99, {'title': 1}))
|
||||||
@@ -1870,7 +1870,7 @@ func Xproperty_tests(cchar)
|
|||||||
call assert_equal([1, 2], getloclist(w2_id, {'context':1}).context)
|
call assert_equal([1, 2], getloclist(w2_id, {'context':1}).context)
|
||||||
only
|
only
|
||||||
call setloclist(0, [], 'f')
|
call setloclist(0, [], 'f')
|
||||||
call assert_equal({}, getloclist(0, {'context':1}))
|
call assert_equal('', getloclist(0, {'context':1}).context)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
" Test for changing the context of previous quickfix lists
|
" Test for changing the context of previous quickfix lists
|
||||||
@@ -2383,8 +2383,8 @@ func XsizeTests(cchar)
|
|||||||
|
|
||||||
call g:Xsetlist([], 'f')
|
call g:Xsetlist([], 'f')
|
||||||
call assert_equal(0, g:Xgetlist({'nr':'$'}).nr)
|
call assert_equal(0, g:Xgetlist({'nr':'$'}).nr)
|
||||||
call assert_equal(1, len(g:Xgetlist({'nr':'$', 'all':1})))
|
call assert_equal('', g:Xgetlist({'nr':'$', 'all':1}).title)
|
||||||
call assert_equal(0, len(g:Xgetlist({'nr':0})))
|
call assert_equal(0, g:Xgetlist({'nr':0}).nr)
|
||||||
|
|
||||||
Xexpr "File1:10:Line1"
|
Xexpr "File1:10:Line1"
|
||||||
Xexpr "File2:20:Line2"
|
Xexpr "File2:20:Line2"
|
||||||
@@ -2754,7 +2754,7 @@ func Xqfid_tests(cchar)
|
|||||||
call s:setup_commands(a:cchar)
|
call s:setup_commands(a:cchar)
|
||||||
|
|
||||||
call g:Xsetlist([], 'f')
|
call g:Xsetlist([], 'f')
|
||||||
call assert_equal({}, g:Xgetlist({'id':0}))
|
call assert_equal(0, g:Xgetlist({'id':0}).id)
|
||||||
Xexpr ''
|
Xexpr ''
|
||||||
let start_id = g:Xgetlist({'id' : 0}).id
|
let start_id = g:Xgetlist({'id' : 0}).id
|
||||||
Xexpr '' | Xexpr ''
|
Xexpr '' | Xexpr ''
|
||||||
@@ -2762,10 +2762,10 @@ func Xqfid_tests(cchar)
|
|||||||
call assert_equal(start_id, g:Xgetlist({'id':0, 'nr':1}).id)
|
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 + 1, g:Xgetlist({'id':0, 'nr':0}).id)
|
||||||
call assert_equal(start_id + 2, g:Xgetlist({'id':0, 'nr':'$'}).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(0, g:Xgetlist({'id':0, 'nr':99}).id)
|
||||||
call assert_equal(2, g:Xgetlist({'id':start_id + 1, 'nr':0}).nr)
|
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(0, g:Xgetlist({'id':99, 'nr':0}).id)
|
||||||
call assert_equal({}, g:Xgetlist({'id':"abc", 'nr':0}))
|
call assert_equal(0, g:Xgetlist({'id':"abc", 'nr':0}).id)
|
||||||
|
|
||||||
call g:Xsetlist([], 'a', {'id':start_id, 'context':[1,2]})
|
call g:Xsetlist([], 'a', {'id':start_id, 'context':[1,2]})
|
||||||
call assert_equal([1,2], g:Xgetlist({'nr':1, 'context':1}).context)
|
call assert_equal([1,2], g:Xgetlist({'nr':1, 'context':1}).context)
|
||||||
@@ -2776,7 +2776,7 @@ func Xqfid_tests(cchar)
|
|||||||
|
|
||||||
let qfid = g:Xgetlist({'id':0, 'nr':0})
|
let qfid = g:Xgetlist({'id':0, 'nr':0})
|
||||||
call g:Xsetlist([], 'f')
|
call g:Xsetlist([], 'f')
|
||||||
call assert_equal({}, g:Xgetlist({'id':qfid, 'nr':0}))
|
call assert_equal(0, g:Xgetlist({'id':qfid, 'nr':0}).id)
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
func Test_qf_id()
|
func Test_qf_id()
|
||||||
@@ -2880,3 +2880,62 @@ func Test_qfjump()
|
|||||||
call Xqfjump_tests('c')
|
call Xqfjump_tests('c')
|
||||||
call Xqfjump_tests('l')
|
call Xqfjump_tests('l')
|
||||||
endfunc
|
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
|
||||||
|
@@ -771,6 +771,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
1389,
|
||||||
/**/
|
/**/
|
||||||
1388,
|
1388,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user