# HG changeset patch # User Bram Moolenaar # Date 1605561303 -3600 # Node ID 5ff7125e81fc08f2b711e965ccca902b012463ee # Parent 3e3b02c8ca0093c2c98705b6fcbabb4da98cc5f8 patch 8.2.2000: Vim9: dict.key assignment not implemented yet Commit: https://github.com/vim/vim/commit/fc74d03e7694bac3b50d8d6b6b78b40a71818744 Author: Bram Moolenaar Date: Mon Nov 16 22:11:49 2020 +0100 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 https://github.com/vim/vim/issues/7312) diff --git a/src/testdir/test_vim9_assign.vim b/src/testdir/test_vim9_assign.vim --- a/src/testdir/test_vim9_assign.vim +++ b/src/testdir/test_vim9_assign.vim @@ -408,6 +408,15 @@ def Test_assignment_dict() # overwrite 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 var dd = {} @@ -418,7 +427,7 @@ def Test_assignment_dict() var somedict = rand() > 0 ? #{a: 1, b: 2} : #{a: 'a', b: 'b'} # assignment to script-local dict - var lines =<< trim END + lines =<< trim END vim9script var test: dict = {} def FillDict(): dict diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -751,6 +751,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 2000, +/**/ 1999, /**/ 1998, diff --git a/src/vim9compile.c b/src/vim9compile.c --- a/src/vim9compile.c +++ b/src/vim9compile.c @@ -5384,14 +5384,14 @@ compile_assignment(char_u *arg, exarg_T member_type = type; 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) { emsg(_(e_cannot_use_index_when_declaring_variable)); goto theend; } - if (var_start[varlen] == '[') + if (var_start[varlen] == '[' || var_start[varlen] == '.') { has_index = TRUE; if (type->tt_member == NULL) @@ -5635,21 +5635,33 @@ compile_assignment(char_u *arg, exarg_T { int r; - // Compile the "idx" in "var[idx]". + // Compile the "idx" in "var[idx]" or "key" in "var.key". if (new_local) --cctx->ctx_locals.ga_len; - p = skipwhite(var_start + varlen + 1); - r = compile_expr0(&p, cctx); + p = var_start + varlen; + 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) ++cctx->ctx_locals.ga_len; if (r == FAIL) goto theend; - if (*skipwhite(p) != ']') - { - // this should not happen - emsg(_(e_missbrac)); - goto theend; - } + if (type == &t_any) { type_T *idx_type = ((type_T **)stack->ga_data)[