]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 8.2.3852: Vim9: not enough tests v8.2.3852
authorBram Moolenaar <Bram@vim.org>
Sun, 19 Dec 2021 15:17:21 +0000 (15:17 +0000)
committerBram Moolenaar <Bram@vim.org>
Sun, 19 Dec 2021 15:17:21 +0000 (15:17 +0000)
Problem:    Vim9: not enough tests.
Solution:   Also run existing tests for Vim9 script.  Make errors more
            consistent.

src/errors.h
src/eval.c
src/testdir/test_listdict.vim
src/version.c
src/vim9compile.c

index 3fd8e5a01df3b3e79fc22e51eeb8f4ef151586ca..31f275d17111f8ee54b49be6ed1971a5faa8f964 100644 (file)
@@ -286,6 +286,8 @@ EXTERN char e_invalid_command[]
 #ifdef FEAT_EVAL
 EXTERN char e_invalid_command_str[]
        INIT(= N_("E476: Invalid command: %s"));
+EXTERN char e_cannot_index_a_funcref[]
+       INIT(= N_("E695: Cannot index a Funcref"));
 EXTERN char e_list_value_has_more_items_than_targets[]
        INIT(= N_("E710: List value has more items than targets"));
 EXTERN char e_list_value_does_not_have_enough_items[]
index d0ad7c6e89f62b52128e6b7d43cfabf633d702e7..4e720e8e234c578dadcfcbe63c2fb0464785a87c 100644 (file)
@@ -4026,6 +4026,8 @@ eval_index(
        }
        else if (evaluate)
        {
+           int error = FALSE;
+
 #ifdef FEAT_FLOAT
            // allow for indexing with float
            if (vim9 && rettv->v_type == VAR_DICT
@@ -4035,7 +4037,11 @@ eval_index(
                var1.v_type = VAR_STRING;
            }
 #endif
-           if (tv_get_string_chk(&var1) == NULL)
+           if (vim9 && rettv->v_type == VAR_LIST)
+               tv_get_number_chk(&var1, &error);
+           else
+               error = tv_get_string_chk(&var1) == NULL;
+           if (error)
            {
                // not a number or string
                clear_tv(&var1);
@@ -4118,7 +4124,7 @@ check_can_index(typval_T *rettv, int evaluate, int verbose)
        case VAR_FUNC:
        case VAR_PARTIAL:
            if (verbose)
-               emsg(_("E695: Cannot index a Funcref"));
+               emsg(_(e_cannot_index_a_funcref));
            return FAIL;
        case VAR_FLOAT:
 #ifdef FEAT_FLOAT
index de63c799984eb8d3b9def215ab33eb48eba69845..ad36cb0bdf53741d50bb7a681f360d1eb96a39f9 100644 (file)
@@ -1291,12 +1291,19 @@ endfunc
 
 " List and dict indexing tests
 func Test_listdict_index()
-  call assert_fails('echo function("min")[0]', 'E695:')
-  call assert_fails('echo v:true[0]', 'E909:')
+  call CheckLegacyAndVim9Failure(['echo function("min")[0]'], 'E695:')
+  call CheckLegacyAndVim9Failure(['echo v:true[0]'], 'E909:')
+  call CheckLegacyAndVim9Failure(['echo v:null[0]'], 'E909:')
+
   let d = {'k' : 10}
   call assert_fails('echo d.', 'E15:')
-  call assert_fails('echo d[1:2]', 'E719:')
+  call CheckDefAndScriptFailure2(['var d = {k: 10}', 'echo d.'], 'E1127', 'E15:')
+
+  call CheckLegacyAndVim9Failure(['VAR d = {"k": 10}', 'echo d[1 : 2]'], 'E719:')
+
   call assert_fails("let v = [4, 6][{-> 1}]", 'E729:')
+  call CheckDefAndScriptFailure2(['var v = [4, 6][() => 1]'], 'E1012', 'E703:')
+
   call assert_fails("let v = range(5)[2:[]]", 'E730:')
   call assert_fails("let v = range(5)[2:{-> 2}(]", ['E15:', 'E116:'])
   call assert_fails("let v = range(5)[2:3", 'E111:')
index d65a5c1a973178050b4ad7548935e5017b381e85..288b23a016e2d7cb15598fc3cccc78055b69013b 100644 (file)
@@ -749,6 +749,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    3852,
 /**/
     3851,
 /**/
index d6fc6d85810202b89f9572b2914af619837f4799..ff96b103d574cc1744c9394a8053ad1086cde49a 100644 (file)
@@ -3043,7 +3043,25 @@ compile_member(int is_slice, int *keeping_dict, cctx_T *cctx)
     }
     else
     {
-       emsg(_(e_string_list_dict_or_blob_required));
+       switch (vartype)
+       {
+           case VAR_FUNC:
+           case VAR_PARTIAL:
+               emsg(_(e_cannot_index_a_funcref));
+               break;
+           case VAR_BOOL:
+           case VAR_SPECIAL:
+           case VAR_JOB:
+           case VAR_CHANNEL:
+           case VAR_INSTR:
+           case VAR_UNKNOWN:
+           case VAR_ANY:
+           case VAR_VOID:
+               emsg(_(e_cannot_index_special_variable));
+               break;
+           default:
+               emsg(_(e_string_list_dict_or_blob_required));
+       }
        return FAIL;
     }
     return OK;