mirror of
				https://github.com/vim/vim.git
				synced 2025-10-31 09:57:14 -04:00 
			
		
		
		
	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:
		| @@ -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. | ||||||
|  |  | ||||||
|   | |||||||
| @@ -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() | ||||||
|   | |||||||
| @@ -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 | ||||||
|   | |||||||
| @@ -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, | ||||||
| /**/ | /**/ | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user