]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.0.2155: Vim9: type not kept when assigning vars v9.0.2155
authorYegappan Lakshmanan <yegappan@yahoo.com>
Fri, 8 Dec 2023 20:41:23 +0000 (21:41 +0100)
committerChristian Brabandt <cb@256bit.org>
Fri, 8 Dec 2023 20:47:22 +0000 (21:47 +0100)
Problem:  Vim9: type not kept when assigning vars
Solution: When assigning a List or a Dict value to a variable of type
          'any', keep the type

closes: #13639
closes: #13646

Signed-off-by: Yegappan Lakshmanan <yegappan@yahoo.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
src/testdir/test_vim9_assign.vim
src/version.c
src/vim9type.c

index 926773e2921c72229dc8e033adc70ac8be6d00de..a6a242dae7b218dae11a58efca3f4913b2792e81 100644 (file)
@@ -3323,4 +3323,30 @@ def Test_func_rettype_check()
   v9.CheckSourceFailure(lines, 'E1012: Type mismatch; expected object<A> but got number', 1)
 enddef
 
+" Test for assigning different types of value to a variable of type "any"
+def Test_assign_to_any()
+  for [typestr, val] in [
+                          ["'bool'", 'true'],
+                          ["'number'", '100'],
+                          ["'float'", '1.1'],
+                          ["'string'", '"abc"'],
+                          ["'blob'", '0z10'],
+                          ["'list<number>'", '[1, 2, 3]'],
+                          ["'dict<number>'", '{a: 1}'],
+                        ]
+    var lines =<< trim eval END
+      vim9script
+      var x: any = {val}
+      assert_equal({typestr}, typename(x))
+      x = [{{a: 1}}, {{b: 2}}]
+      assert_equal('list<dict<number>>', typename(x))
+      def Foo(xarg: any, s: string)
+        assert_equal(s, typename(xarg))
+      enddef
+      Foo({val}, {typestr})
+    END
+    v9.CheckSourceSuccess(lines)
+  endfor
+enddef
+
 " vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
index f623c7f6fc75094c445ef123be65a8b764422215..6b8a8b1c55baa6ca85a10a71b589b6a153be24f8 100644 (file)
@@ -704,6 +704,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    2155,
 /**/
     2154,
 /**/
index 22720fb6e8134d9ff138aeaf8bf781011f340a01..c28137fcc76f08a97f3a45009a9c2920bc47ed9d 100644 (file)
@@ -201,6 +201,10 @@ set_tv_type_recurse(type_T *type)
     void
 set_tv_type(typval_T *tv, type_T *type)
 {
+    if (type->tt_type == VAR_ANY)
+       // If the variable type is "any", then keep the value type.
+       // e.g.  var x: any = [1, 2] or var y: any = {v: 1}
+       return;
     if (tv->v_type == VAR_DICT && tv->vval.v_dict != NULL)
     {
        dict_T *d = tv->vval.v_dict;