diff options
author | Bram Moolenaar <Bram@vim.org> | 2020-11-16 22:11:49 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2020-11-16 22:11:49 +0100 |
commit | fc74d03e7694bac3b50d8d6b6b78b40a71818744 (patch) | |
tree | 3d512403ad1acba51cef301efcc8aa3dd9d665de | |
parent | e6329e4c55cd81b6134820eab6a10b02c11c1277 (diff) | |
download | vim-git-fc74d03e7694bac3b50d8d6b6b78b40a71818744.tar.gz |
patch 8.2.2000: Vim9: dict.key assignment not implemented yetv8.2.2000
Problem: Vim9: dict.key assignment not implemented yet.
Solution: Implement dict.key assignment. (closes #7312)
-rw-r--r-- | src/testdir/test_vim9_assign.vim | 11 | ||||
-rw-r--r-- | src/version.c | 2 | ||||
-rw-r--r-- | src/vim9compile.c | 34 |
3 files changed, 35 insertions, 12 deletions
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<any> = {} def FillDict(): dict<any> diff --git a/src/version.c b/src/version.c index ec1abe688..a988b21dc 100644 --- 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 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)[ |