]> granicus.if.org Git - vim/commitdiff
patch 8.2.4310: Vim9: constant list and dict get a declaration type v8.2.4310
authorBram Moolenaar <Bram@vim.org>
Sun, 6 Feb 2022 15:49:35 +0000 (15:49 +0000)
committerBram Moolenaar <Bram@vim.org>
Sun, 6 Feb 2022 15:49:35 +0000 (15:49 +0000)
Problem:    Vim9: constant list and dict get a declaration type other than
            "any".
Solution:   A constant list and dict have a declared member type "any".
            (closes #9701)

src/proto/vim9type.pro
src/testdir/test_vim9_builtin.vim
src/version.c
src/vim9instr.c
src/vim9type.c

index fb3cb8d1451e4d8f0ab5146d850f2fc2637e921d..aaa1a71eb2ed565cd27fd3fc145135d5f7f14d59 100644 (file)
@@ -27,7 +27,7 @@ int push_type_stack2(cctx_T *cctx, type_T *type, type_T *decl_type);
 void set_type_on_stack(cctx_T *cctx, type_T *type, int offset);
 type_T *get_type_on_stack(cctx_T *cctx, int offset);
 type_T *get_decl_type_on_stack(cctx_T *cctx, int offset);
-type_T *get_member_type_from_stack(int count, int skip, type_T **decl_type, cctx_T *cctx);
+type_T *get_member_type_from_stack(int count, int skip, cctx_T *cctx);
 char *vartype_name(vartype_T type);
 char *type_name(type_T *type, char **tofree);
 void f_typename(typval_T *argvars, typval_T *rettv);
index 557ddf2190527b3cb7d4a69b857a8684e0d762d9..ee32b3989c639365319a4714d6e4766fec85bb5e 100644 (file)
@@ -2237,6 +2237,11 @@ def Test_map()
       g:gl = l
       map(g:gl, (k, v) => true)
       assert_equal([true], g:gl)
+
+      assert_equal(['x'], [[1, 2]]->map((_, v) => 'x'))
+      assert_equal(['x'], [{a: 0}]->map((_, v) => 'x'))
+      assert_equal({a: 'x'}, {a: [1, 2]}->map((_, v) => 'x'))
+      assert_equal({a: 'x'}, {a: {b: 2}}->map((_, v) => 'x'))
   END
   v9.CheckDefAndScriptSuccess(lines)
 enddef
index 37d653d3a5afaa19ae009badaffe75b4ca9f8567..20bc28ab46818b660d1074e9657152948b64eb5b 100644 (file)
@@ -746,6 +746,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    4310,
 /**/
     4309,
 /**/
index 60963a3c9b2baa6222e3656546f2c6fb77f27aaa..cf26650d17b914770fd90691aaf2de00c0ac2d1e 100644 (file)
@@ -1067,7 +1067,6 @@ generate_NEWLIST(cctx_T *cctx, int count)
 {
     isn_T      *isn;
     type_T     *member_type;
-    type_T     *decl_member_type;
     type_T     *type;
     type_T     *decl_type;
 
@@ -1078,10 +1077,9 @@ generate_NEWLIST(cctx_T *cctx, int count)
 
     // Get the member type and the declared member type from all the items on
     // the stack.
-    member_type = get_member_type_from_stack(count, 1,
-                                                     &decl_member_type, cctx);
+    member_type = get_member_type_from_stack(count, 1, cctx);
     type = get_list_type(member_type, cctx->ctx_type_list);
-    decl_type = get_list_type(decl_member_type, cctx->ctx_type_list);
+    decl_type = get_list_type(&t_any, cctx->ctx_type_list);
 
     // drop the value types
     cctx->ctx_type_stack.ga_len -= count;
@@ -1098,7 +1096,6 @@ generate_NEWDICT(cctx_T *cctx, int count)
 {
     isn_T      *isn;
     type_T     *member_type;
-    type_T     *decl_member_type;
     type_T     *type;
     type_T     *decl_type;
 
@@ -1107,10 +1104,9 @@ generate_NEWDICT(cctx_T *cctx, int count)
        return FAIL;
     isn->isn_arg.number = count;
 
-    member_type = get_member_type_from_stack(count, 2,
-                                                     &decl_member_type, cctx);
+    member_type = get_member_type_from_stack(count, 2, cctx);
     type = get_dict_type(member_type, cctx->ctx_type_list);
-    decl_type = get_dict_type(decl_member_type, cctx->ctx_type_list);
+    decl_type = get_dict_type(&t_any, cctx->ctx_type_list);
 
     // drop the key and value types
     cctx->ctx_type_stack.ga_len -= 2 * count;
index f72698cb9d50576d53cb78f434758f248834d33f..62be6ac619d984121fa36de556451839779e6ee2 100644 (file)
@@ -1359,7 +1359,6 @@ get_decl_type_on_stack(cctx_T *cctx, int offset)
 get_member_type_from_stack(
        int         count,
        int         skip,
-       type_T      **decl_type,
        cctx_T      *cctx)
 {
     garray_T   *stack = &cctx->ctx_type_stack;
@@ -1367,32 +1366,24 @@ get_member_type_from_stack(
     garray_T    *type_gap = cctx->ctx_type_list;
     int                i;
     type_T     *result;
-    type_T     *decl_result;
     type_T     *type;
 
     // Use "unknown" for an empty list or dict.
     if (count == 0)
-    {
-       *decl_type = &t_unknown;
        return &t_unknown;
-    }
 
     // Use the first value type for the list member type, then find the common
     // type from following items.
     typep = ((type2_T *)stack->ga_data) + stack->ga_len;
     result = (typep -(count * skip) + skip - 1)->type_curr;
-    decl_result = (typep -(count * skip) + skip - 1)->type_decl;
     for (i = 1; i < count; ++i)
     {
        if (result == &t_any)
            break;  // won't get more common
        type = (typep -((count - i) * skip) + skip - 1)->type_curr;
        common_type(type, result, &result, type_gap);
-       type = (typep -((count - i) * skip) + skip - 1)->type_decl;
-       common_type(type, decl_result, &decl_result, type_gap);
     }
 
-    *decl_type = decl_result;
     return result;
 }