summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-08-01 15:53:19 +0200
committerBram Moolenaar <Bram@vim.org>2020-08-01 15:53:19 +0200
commit2caa1594e72be7a876c21ed5c2df252d3537cfa7 (patch)
treee8fb2ce786fe5c4d4b85a872cd3dbc6be2488496
parent8e4c8c853e3ffbd9258f89180692879ec6bce72b (diff)
downloadvim-git-2caa1594e72be7a876c21ed5c2df252d3537cfa7.tar.gz
patch 8.2.1339: Vim9: assigning to global dict variable doesn't workv8.2.1339
Problem: Vim9: assigning to global dict variable doesn't work. Solution: Guess variable type based in index type. (issue #6591)
-rw-r--r--src/testdir/test_vim9_script.vim24
-rw-r--r--src/version.c2
-rw-r--r--src/vim9compile.c20
3 files changed, 41 insertions, 5 deletions
diff --git a/src/testdir/test_vim9_script.vim b/src/testdir/test_vim9_script.vim
index 196ddbe0a..c01b383be 100644
--- a/src/testdir/test_vim9_script.vim
+++ b/src/testdir/test_vim9_script.vim
@@ -274,6 +274,30 @@ def Test_assignment_dict()
FillDict()
END
call CheckScriptFailure(lines, 'E1103:')
+
+ # assignment to global dict
+ lines =<< trim END
+ vim9script
+ g:test = {}
+ def FillDict(): dict<any>
+ g:test['a'] = 43
+ return g:test
+ enddef
+ assert_equal(#{a: 43}, FillDict())
+ END
+ call CheckScriptSuccess(lines)
+
+ # assignment to buffer dict
+ lines =<< trim END
+ vim9script
+ b:test = {}
+ def FillDict(): dict<any>
+ b:test['a'] = 43
+ return b:test
+ enddef
+ assert_equal(#{a: 43}, FillDict())
+ END
+ call CheckScriptSuccess(lines)
enddef
def Test_assignment_local()
diff --git a/src/version.c b/src/version.c
index fff706fa2..cc92f22e9 100644
--- a/src/version.c
+++ b/src/version.c
@@ -755,6 +755,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1339,
+/**/
1338,
/**/
1337,
diff --git a/src/vim9compile.c b/src/vim9compile.c
index cae03d8d2..97fa2e0ca 100644
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -5486,11 +5486,9 @@ compile_assignment(char_u *arg, exarg_T *eap, cmdidx_T cmdidx, cctx_T *cctx)
{
has_index = TRUE;
if (type->tt_member == NULL)
- {
- semsg(_("E1088: cannot use an index on %s"), name);
- goto theend;
- }
- member_type = type->tt_member;
+ member_type = &t_any;
+ else
+ member_type = type->tt_member;
}
else
{
@@ -5719,6 +5717,18 @@ compile_assignment(char_u *arg, exarg_T *eap, cmdidx_T cmdidx, cctx_T *cctx)
emsg(_(e_missbrac));
goto theend;
}
+ if (type == &t_any)
+ {
+ type_T *idx_type = ((type_T **)stack->ga_data)[
+ stack->ga_len - 1];
+ // Index on variable of unknown type: guess the type from the
+ // index type: number is dict, otherwise dict.
+ // TODO: should do the assignment at runtime
+ if (idx_type->tt_type == VAR_NUMBER)
+ type = &t_list_any;
+ else
+ type = &t_dict_any;
+ }
if (type->tt_type == VAR_DICT
&& may_generate_2STRING(-1, cctx) == FAIL)
goto theend;