From: Bram Moolenaar Date: Mon, 16 Nov 2020 21:11:49 +0000 (+0100) Subject: patch 8.2.2000: Vim9: dict.key assignment not implemented yet X-Git-Tag: v8.2.2000 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=fc74d03e7694bac3b50d8d6b6b78b40a71818744;p=vim 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) --- diff --git a/src/testdir/test_vim9_assign.vim b/src/testdir/test_vim9_assign.vim index 24f62d85d..0acf6c3ab 100644 --- 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 index ec1abe688..a988b21dc 100644 --- a/src/version.c +++ b/src/version.c @@ -750,6 +750,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 2000, /**/ 1999, /**/ diff --git a/src/vim9compile.c b/src/vim9compile.c index 8dc974422..6b2b766be 100644 --- a/src/vim9compile.c +++ b/src/vim9compile.c @@ -5384,14 +5384,14 @@ compile_assignment(char_u *arg, exarg_T *eap, cmdidx_T cmdidx, cctx_T *cctx) 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 *eap, cmdidx_T cmdidx, cctx_T *cctx) { 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)[