patch 8.2.2000: Vim9: dict.key assignment not implemented yet
Problem: Vim9: dict.key assignment not implemented yet. Solution: Implement dict.key assignment. (closes #7312)
This commit is contained in:
		| @ -408,6 +408,15 @@ def Test_assignment_dict() | |||||||
|  |  | ||||||
|   # overwrite |   # overwrite | ||||||
|   dict3['key'] = 'another' |   dict3['key'] = 'another' | ||||||
|  |   assert_equal(dict3, #{key: 'another'}) | ||||||
|  |   dict3.key = 'yet another' | ||||||
|  |   assert_equal(dict3, #{key: 'yet another'}) | ||||||
|  |  | ||||||
|  |   var lines =<< trim END | ||||||
|  |     var dd = #{one: 1} | ||||||
|  |     dd.one) = 2 | ||||||
|  |   END | ||||||
|  |   CheckDefFailure(lines, 'E15:', 2) | ||||||
|  |  | ||||||
|   # empty key can be used |   # empty key can be used | ||||||
|   var dd = {} |   var dd = {} | ||||||
| @ -418,7 +427,7 @@ def Test_assignment_dict() | |||||||
|   var somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'} |   var somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'} | ||||||
|  |  | ||||||
|   # assignment to script-local dict |   # assignment to script-local dict | ||||||
|   var lines =<< trim END |   lines =<< trim END | ||||||
|     vim9script |     vim9script | ||||||
|     var test: dict<any> = {} |     var test: dict<any> = {} | ||||||
|     def FillDict(): dict<any> |     def FillDict(): dict<any> | ||||||
|  | |||||||
| @ -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 */ | ||||||
|  | /**/ | ||||||
|  |     2000, | ||||||
| /**/ | /**/ | ||||||
|     1999, |     1999, | ||||||
| /**/ | /**/ | ||||||
|  | |||||||
| @ -5384,14 +5384,14 @@ compile_assignment(char_u *arg, exarg_T *eap, cmdidx_T cmdidx, cctx_T *cctx) | |||||||
| 	member_type = type; | 	member_type = type; | ||||||
| 	if (var_end > var_start + varlen) | 	if (var_end > var_start + varlen) | ||||||
| 	{ | 	{ | ||||||
| 	    // Something follows after the variable: "var[idx]". | 	    // Something follows after the variable: "var[idx]" or "var.key". | ||||||
| 	    if (is_decl) | 	    if (is_decl) | ||||||
| 	    { | 	    { | ||||||
| 		emsg(_(e_cannot_use_index_when_declaring_variable)); | 		emsg(_(e_cannot_use_index_when_declaring_variable)); | ||||||
| 		goto theend; | 		goto theend; | ||||||
| 	    } | 	    } | ||||||
|  |  | ||||||
| 	    if (var_start[varlen] == '[') | 	    if (var_start[varlen] == '[' || var_start[varlen] == '.') | ||||||
| 	    { | 	    { | ||||||
| 		has_index = TRUE; | 		has_index = TRUE; | ||||||
| 		if (type->tt_member == NULL) | 		if (type->tt_member == NULL) | ||||||
| @ -5635,21 +5635,33 @@ compile_assignment(char_u *arg, exarg_T *eap, cmdidx_T cmdidx, cctx_T *cctx) | |||||||
| 	{ | 	{ | ||||||
| 	    int r; | 	    int r; | ||||||
|  |  | ||||||
| 	    // Compile the "idx" in "var[idx]". | 	    // Compile the "idx" in "var[idx]" or "key" in "var.key". | ||||||
| 	    if (new_local) | 	    if (new_local) | ||||||
| 		--cctx->ctx_locals.ga_len; | 		--cctx->ctx_locals.ga_len; | ||||||
| 	    p = skipwhite(var_start + varlen + 1); | 	    p = var_start + varlen; | ||||||
| 	    r = compile_expr0(&p, cctx); | 	    if (*p == '[') | ||||||
|  | 	    { | ||||||
|  | 		p = skipwhite(p + 1); | ||||||
|  | 		r = compile_expr0(&p, cctx); | ||||||
|  | 		if (r == OK && *skipwhite(p) != ']') | ||||||
|  | 		{ | ||||||
|  | 		    // this should not happen | ||||||
|  | 		    emsg(_(e_missbrac)); | ||||||
|  | 		    r = FAIL; | ||||||
|  | 		} | ||||||
|  | 	    } | ||||||
|  | 	    else // if (*p == '.') | ||||||
|  | 	    { | ||||||
|  | 		char_u *key_end = to_name_end(p + 1, TRUE); | ||||||
|  | 		char_u *key = vim_strnsave(p + 1, key_end - p - 1); | ||||||
|  |  | ||||||
|  | 		r = generate_PUSHS(cctx, key); | ||||||
|  | 	    } | ||||||
| 	    if (new_local) | 	    if (new_local) | ||||||
| 		++cctx->ctx_locals.ga_len; | 		++cctx->ctx_locals.ga_len; | ||||||
| 	    if (r == FAIL) | 	    if (r == FAIL) | ||||||
| 		goto theend; | 		goto theend; | ||||||
| 	    if (*skipwhite(p) != ']') |  | ||||||
| 	    { |  | ||||||
| 		// this should not happen |  | ||||||
| 		emsg(_(e_missbrac)); |  | ||||||
| 		goto theend; |  | ||||||
| 	    } |  | ||||||
| 	    if (type == &t_any) | 	    if (type == &t_any) | ||||||
| 	    { | 	    { | ||||||
| 		type_T	    *idx_type = ((type_T **)stack->ga_data)[ | 		type_T	    *idx_type = ((type_T **)stack->ga_data)[ | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user