1
0
forked from aniani/vim

patch 8.2.2667: prop_find() cannot find item matching both id and type

Problem:    prop_find() cannot find item matching both id and type.
Solution:   Add the "both" argument. (Naohiro Ono, closes #8019)
This commit is contained in:
Bram Moolenaar 2021-03-27 22:07:29 +01:00
parent c580943965
commit 24f21fdfca
4 changed files with 32 additions and 1 deletions

View File

@ -175,6 +175,7 @@ prop_find({props} [, {direction}])
Search for a text property as specified with {props}: Search for a text property as specified with {props}:
id property with this ID id property with this ID
type property with this type name type property with this type name
both "id" and "type" must both match
bufnr buffer to search in; when present a bufnr buffer to search in; when present a
start position with "lnum" and "col" start position with "lnum" and "col"
must be given; when omitted the must be given; when omitted the
@ -187,6 +188,7 @@ prop_find({props} [, {direction}])
skipstart do not look for a match at the start skipstart do not look for a match at the start
position position
A property matches when either "id" or "type" matches.
{direction} can be "f" for forward and "b" for backward. When {direction} can be "f" for forward and "b" for backward. When
omitted forward search is performed. omitted forward search is performed.

View File

@ -245,6 +245,25 @@ func Test_prop_find_smaller_len_than_match_col()
call prop_type_delete('test') call prop_type_delete('test')
endfunc endfunc
func Test_prop_find_with_both_option_enabled()
" Initialize
new
call AddPropTypes()
call SetupPropsInFirstLine()
let props = Get_expected_props()->map({_, v -> extend(v, {'lnum': 1})})
" Test
call assert_fails("call prop_find({'both': 1})", 'E968:')
call assert_fails("call prop_find({'id': 11, 'both': 1})", 'E860:')
call assert_fails("call prop_find({'type': 'three', 'both': 1})", 'E860:')
call assert_equal({}, prop_find({'id': 11, 'type': 'three', 'both': 1}))
call assert_equal({}, prop_find({'id': 130000, 'type': 'one', 'both': 1}))
call assert_equal(props[2], prop_find({'id': 12, 'type': 'two', 'both': 1}))
call assert_equal(props[0], prop_find({'id': 14, 'type': 'whole', 'both': 1}))
" Clean up
call DeletePropTypes()
bwipe!
endfunc
func Test_prop_add() func Test_prop_add()
new new
call AddPropTypes() call AddPropTypes()

View File

@ -600,6 +600,7 @@ f_prop_find(typval_T *argvars, typval_T *rettv)
int lnum = -1; int lnum = -1;
int col = -1; int col = -1;
int dir = 1; // 1 = forward, -1 = backward int dir = 1; // 1 = forward, -1 = backward
int both;
if (argvars[0].v_type != VAR_DICT || argvars[0].vval.v_dict == NULL) if (argvars[0].v_type != VAR_DICT || argvars[0].vval.v_dict == NULL)
{ {
@ -661,11 +662,17 @@ f_prop_find(typval_T *argvars, typval_T *rettv)
return; return;
type_id = type->pt_id; type_id = type->pt_id;
} }
both = dict_get_bool(dict, (char_u *)"both", FALSE);
if (id == -1 && type_id == -1) if (id == -1 && type_id == -1)
{ {
emsg(_("E968: Need at least one of 'id' or 'type'")); emsg(_("E968: Need at least one of 'id' or 'type'"));
return; return;
} }
if (both && (id == -1 || type_id == -1))
{
emsg(_("E860: Need 'id' and 'type' with 'both'"));
return;
}
lnum_start = lnum; lnum_start = lnum;
@ -698,7 +705,8 @@ f_prop_find(typval_T *argvars, typval_T *rettv)
else if (prop.tp_col + prop.tp_len - (prop.tp_len != 0) < col) else if (prop.tp_col + prop.tp_len - (prop.tp_len != 0) < col)
continue; continue;
} }
if (prop.tp_id == id || prop.tp_type == type_id) if (both ? prop.tp_id == id && prop.tp_type == type_id
: prop.tp_id == id || prop.tp_type == type_id)
{ {
// Check if the starting position has text props. // Check if the starting position has text props.
if (lnum_start == lnum if (lnum_start == lnum

View File

@ -750,6 +750,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 */
/**/
2667,
/**/ /**/
2666, 2666,
/**/ /**/