]> granicus.if.org Git - vim/commitdiff
patch 8.2.1339: Vim9: assigning to global dict variable doesn't work v8.2.1339
authorBram Moolenaar <Bram@vim.org>
Sat, 1 Aug 2020 13:53:19 +0000 (15:53 +0200)
committerBram Moolenaar <Bram@vim.org>
Sat, 1 Aug 2020 13:53:19 +0000 (15:53 +0200)
Problem:    Vim9: assigning to global dict variable doesn't work.
Solution:   Guess variable type based in index type. (issue #6591)

src/testdir/test_vim9_script.vim
src/version.c
src/vim9compile.c

index 196ddbe0a25a7620752fdf30875bab6ef9670b5b..c01b383be577380c76e0349b029130f5a3f5ff75 100644 (file)
@@ -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()
index fff706fa212dd5d71be245f891ba3f771a7cf49d..cc92f22e922b39e0f9dc839db2326fcc3b659af0 100644 (file)
@@ -754,6 +754,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1339,
 /**/
     1338,
 /**/
index cae03d8d2ac5bec38949f50e5e5f957553070b0a..97fa2e0cab1d944a8d1bf93d736ce1b2185497ab 100644 (file)
@@ -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;