]> granicus.if.org Git - vim/commitdiff
patch 9.0.0345: error message for list argument could be clearer v9.0.0345
authorBram Moolenaar <Bram@vim.org>
Thu, 1 Sep 2022 11:22:46 +0000 (12:22 +0100)
committerBram Moolenaar <Bram@vim.org>
Thu, 1 Sep 2022 11:22:46 +0000 (12:22 +0100)
Problem:    Error message for list argument could be clearer.
Solution:   Include the argument number. (Yegappan Lakshmanan, closes #11027)

22 files changed:
runtime/doc/vim9.txt
src/errors.h
src/evalfunc.c
src/filepath.c
src/insexpand.c
src/list.c
src/match.c
src/mbyte.c
src/proto/typval.pro
src/sign.c
src/terminal.c
src/testdir/test_functions.vim
src/testdir/test_ins_complete.vim
src/testdir/test_match.vim
src/testdir/test_method.vim
src/testdir/test_signs.vim
src/testdir/test_terminal.vim
src/testdir/test_textprop.vim
src/testdir/test_utf8.vim
src/textprop.c
src/typval.c
src/version.c

index b77b789a2c1defda7bcfc835efe0fd2822f9b13e..aba0f0051ef94b3507f2aa3838607f204785ec2b 100644 (file)
@@ -1618,7 +1618,7 @@ type, it can not be used in Vim9 script.
                         *E1211* *E1217* *E1218* *E1219* *E1220* *E1221*
                         *E1222* *E1223* *E1224* *E1225* *E1226* *E1227*
                         *E1228* *E1238* *E1250* *E1251* *E1252* *E1253*
-                        *E1256* *E1297*
+                        *E1256* *E1297* *E1298*
 Types are checked for most builtin functions to make it easier to spot
 mistakes.
 
index 1784430365a31ec13d91131fcd548324a3efee1c..ee75d07e5c9ec47a933d2406283861608c2e9357 100644 (file)
@@ -3318,5 +3318,9 @@ EXTERN char e_cannot_specify_both_type_and_types[]
 EXTERN char e_can_only_use_left_padding_when_column_is_zero[]
        INIT(= N_("E1296: Can only use left padding when column is zero"));
 #endif
+#ifdef FEAT_EVAL
 EXTERN char e_non_null_dict_required_for_argument_nr[]
        INIT(= N_("E1297: Non-NULL Dictionary required for argument %d"));
+EXTERN char e_non_null_list_required_for_argument_nr[]
+       INIT(= N_("E1298: Non-NULL List required for argument %d"));
+#endif
index 9cbd413405b06e8e9c7be40cf4d0d181fa19c02b..c7cf32297e4ff4f4e4b3d90ee821eee262638b2e 100644 (file)
@@ -3235,11 +3235,8 @@ f_call(typval_T *argvars, typval_T *rettv)
                || check_for_opt_dict_arg(argvars, 2) == FAIL))
        return;
 
-    if (argvars[1].v_type != VAR_LIST)
-    {
-       emsg(_(e_list_required));
+    if (check_for_list_arg(argvars, 1) == FAIL)
        return;
-    }
     if (argvars[1].vval.v_list == NULL)
        return;
 
index 70e0fd4e736a2860d2197520b5c8e411f633fc2c..c61d7119040087cdbe0fc906cb85da522fb1a34e 100644 (file)
@@ -1603,19 +1603,20 @@ readdir_checkitem(void *context, void *item)
     return checkitem_common(context, name, NULL);
 }
 
+/*
+ * Process the keys in the Dict argument to the readdir() and readdirex()
+ * functions.  Assumes the Dict argument is the 3rd argument.
+ */
     static int
-readdirex_dict_arg(typval_T *tv, int *cmp)
+readdirex_dict_arg(typval_T *argvars, int *cmp)
 {
     char_u     *compare;
 
-    if (tv->v_type != VAR_DICT)
-    {
-       emsg(_(e_dictionary_required));
+    if (check_for_nonnull_dict_arg(argvars, 2) == FAIL)
        return FAIL;
-    }
 
-    if (dict_has_key(tv->vval.v_dict, "sort"))
-       compare = dict_get_string(tv->vval.v_dict, "sort", FALSE);
+    if (dict_has_key(argvars[2].vval.v_dict, "sort"))
+       compare = dict_get_string(argvars[2].vval.v_dict, "sort", FALSE);
     else
     {
        semsg(_(e_dictionary_key_str_required), "sort");
@@ -1660,7 +1661,7 @@ f_readdir(typval_T *argvars, typval_T *rettv)
     expr = &argvars[1];
 
     if (argvars[1].v_type != VAR_UNKNOWN && argvars[2].v_type != VAR_UNKNOWN &&
-           readdirex_dict_arg(&argvars[2], &sort) == FAIL)
+           readdirex_dict_arg(argvars, &sort) == FAIL)
        return;
 
     ret = readdir_core(&ga, path, FALSE, (void *)expr,
@@ -1713,7 +1714,7 @@ f_readdirex(typval_T *argvars, typval_T *rettv)
     expr = &argvars[1];
 
     if (argvars[1].v_type != VAR_UNKNOWN && argvars[2].v_type != VAR_UNKNOWN &&
-           readdirex_dict_arg(&argvars[2], &sort) == FAIL)
+           readdirex_dict_arg(argvars, &sort) == FAIL)
        return;
 
     ret = readdir_core(&ga, path, TRUE, (void *)expr,
index 1ff1c99b7e9303551a799b4610210ff4b292e6e6..b91c230011d49bf2b712550622ebac65d006a418 100644 (file)
@@ -2930,9 +2930,7 @@ f_complete(typval_T *argvars, typval_T *rettv UNUSED)
     if (!undo_allowed())
        return;
 
-    if (argvars[1].v_type != VAR_LIST || argvars[1].vval.v_list == NULL)
-       emsg(_(e_invalid_argument));
-    else
+    if (check_for_nonnull_list_arg(argvars, 1) != FAIL)
     {
        startcol = (int)tv_get_number_chk(&argvars[0], NULL);
        if (startcol > 0)
@@ -3143,11 +3141,8 @@ f_complete_info(typval_T *argvars, typval_T *rettv)
 
     if (argvars[0].v_type != VAR_UNKNOWN)
     {
-       if (argvars[0].v_type != VAR_LIST)
-       {
-           emsg(_(e_list_required));
+       if (check_for_list_arg(argvars, 0) == FAIL)
            return;
-       }
        what_list = argvars[0].vval.v_list;
     }
     get_complete_info(what_list, rettv->vval.v_dict);
index 5e70f2111b524eaa59c4e06493fde2b69a2e06d2..c9697e0514339555bab0c76570fb5b48a807d26e 100644 (file)
@@ -1519,11 +1519,8 @@ f_join(typval_T *argvars, typval_T *rettv)
                || check_for_opt_string_arg(argvars, 1) == FAIL))
        return;
 
-    if (argvars[0].v_type != VAR_LIST)
-    {
-       emsg(_(e_list_required));
+    if (check_for_list_arg(argvars, 0) == FAIL)
        return;
-    }
 
     if (argvars[0].vval.v_list == NULL)
        return;
@@ -1728,11 +1725,8 @@ f_list2str(typval_T *argvars, typval_T *rettv)
                || check_for_opt_bool_arg(argvars, 1) == FAIL))
        return;
 
-    if (argvars[0].v_type != VAR_LIST)
-    {
-       emsg(_(e_invalid_argument));
+    if (check_for_list_arg(argvars, 0) == FAIL)
        return;
-    }
 
     l = argvars[0].vval.v_list;
     if (l == NULL)
index 335b06011f280d2aa374c99fde76bcfc49c1bc99..ebdaeabcfff5d9fb180cf694404ab48213c53ee6 100644 (file)
@@ -1087,11 +1087,8 @@ f_setmatches(typval_T *argvars UNUSED, typval_T *rettv UNUSED)
                || check_for_opt_number_arg(argvars, 1) == FAIL))
        return;
 
-    if (argvars[0].v_type != VAR_LIST)
-    {
-       emsg(_(e_list_required));
+    if (check_for_list_arg(argvars, 0) == FAIL)
        return;
-    }
     win = get_optional_window(argvars, 1);
     if (win == NULL)
        return;
index 73065c739459b59b0494cd7ad1c873553dd40002..54f7fa4fbb98c73808858d59d4e13dd79b427b4d 100644 (file)
@@ -5535,14 +5535,9 @@ f_setcellwidths(typval_T *argvars, typval_T *rettv UNUSED)
     size_t         cw_table_size_save;
     char           *error = NULL;
 
-    if (in_vim9script() && check_for_list_arg(argvars, 0) == FAIL)
+    if (check_for_nonnull_list_arg(argvars, 0) == FAIL)
        return;
 
-    if (argvars[0].v_type != VAR_LIST || argvars[0].vval.v_list == NULL)
-    {
-       emsg(_(e_list_required));
-       return;
-    }
     l = argvars[0].vval.v_list;
     if (l->lv_len == 0)
     {
index 154b668b1e0ebaccd5c845e26809b1fa5a55ecf7..7d32a03d94b639ff261ec5050f08573eb966e3f3 100644 (file)
@@ -20,6 +20,7 @@ int check_for_bool_arg(typval_T *args, int idx);
 int check_for_opt_bool_arg(typval_T *args, int idx);
 int check_for_blob_arg(typval_T *args, int idx);
 int check_for_list_arg(typval_T *args, int idx);
+int check_for_nonnull_list_arg(typval_T *args, int idx);
 int check_for_opt_list_arg(typval_T *args, int idx);
 int check_for_dict_arg(typval_T *args, int idx);
 int check_for_nonnull_dict_arg(typval_T *args, int idx);
index e0264ccb1b323c19ecf981c0b915aa96cc902b8e..eaefd5f063bff587c4a22c5f3ce284c209c97e4a 100644 (file)
@@ -2660,11 +2660,8 @@ f_sign_placelist(typval_T *argvars, typval_T *rettv)
     if (in_vim9script() && check_for_list_arg(argvars, 0) == FAIL)
        return;
 
-    if (argvars[0].v_type != VAR_LIST)
-    {
-       emsg(_(e_list_required));
+    if (check_for_list_arg(argvars, 0) == FAIL)
        return;
-    }
 
     // Process the List of sign attributes
     FOR_ALL_LIST_ITEMS(argvars[0].vval.v_list, li)
@@ -2888,11 +2885,8 @@ f_sign_unplacelist(typval_T *argvars, typval_T *rettv)
     if (in_vim9script() && check_for_list_arg(argvars, 0) == FAIL)
        return;
 
-    if (argvars[0].v_type != VAR_LIST)
-    {
-       emsg(_(e_list_required));
+    if (check_for_list_arg(argvars, 0) == FAIL)
        return;
-    }
 
     FOR_ALL_LIST_ITEMS(argvars[0].vval.v_list, li)
     {
index 0283267af116839162ee4b05c499e6529baf9bdf..9600e0a6825109e4785fe2d70eecad26e26fd043 100644 (file)
@@ -6462,11 +6462,9 @@ f_term_setansicolors(typval_T *argvars, typval_T *rettv UNUSED)
     if (term->tl_vterm == NULL)
        return;
 
-    if (argvars[1].v_type != VAR_LIST || argvars[1].vval.v_list == NULL)
-    {
-       emsg(_(e_list_required));
+    if (check_for_nonnull_list_arg(argvars, 1) == FAIL)
        return;
-    }
+
     if (argvars[1].vval.v_list->lv_first == &range_list_item
            || argvars[1].vval.v_list->lv_len != 16)
     {
index 971be40dc4e757d0d9eb035feffcd7b8f9faa23e..43eb265d62c018cd1d0c69d3d4f369395e782322 100644 (file)
@@ -2244,9 +2244,12 @@ func Test_readdir_sort()
   exe "lang collate" collate
 
   " 5) Errors
-  call assert_fails('call readdir(dir, 1, 1)', 'E715:')
+  call assert_fails('call readdir(dir, 1, 1)', 'E1206:')
   call assert_fails('call readdir(dir, 1, #{sorta: 1})')
+  call assert_fails('call readdir(dir, 1, test_null_dict())', 'E1297:')
+  call assert_fails('call readdirex(dir, 1, 1)', 'E1206:')
   call assert_fails('call readdirex(dir, 1, #{sorta: 1})')
+  call assert_fails('call readdirex(dir, 1, test_null_dict())', 'E1297:')
 
   " 6) ignore other values in dict
   let files = readdir(dir, '1', #{sort: 'c'})
@@ -2285,7 +2288,7 @@ endfunc
 func Test_call()
   call assert_equal(3, call('len', [123]))
   call assert_equal(3, 'len'->call([123]))
-  call assert_fails("call call('len', 123)", 'E714:')
+  call assert_fails("call call('len', 123)", 'E1211:')
   call assert_equal(0, call('', []))
   call assert_equal(0, call('len', test_null_list()))
 
@@ -2580,7 +2583,7 @@ func Test_range()
 
   " list2str()
   call assert_equal('ABC', list2str(range(65, 67)))
-  call assert_fails('let s = list2str(5)', 'E474:')
+  call assert_fails('let s = list2str(5)', 'E1211:')
 
   " lock()
   let thelist = range(5)
index 41998aa0eb75554d44abfb68eaf8334a8a3744ee..cee6a329f7bd52cfb4b35666c6b79b1f7c105ad5 100644 (file)
@@ -673,14 +673,14 @@ func Test_complete_func_error()
   func ListColors()
     call complete(col('.'), "blue")
   endfunc
-  call assert_fails('exe "normal i\<C-R>=ListColors()\<CR>"', 'E474:')
+  call assert_fails('exe "normal i\<C-R>=ListColors()\<CR>"', 'E1211:')
   func ListMonths()
     call complete(col('.'), test_null_list())
   endfunc
-  call assert_fails('exe "normal i\<C-R>=ListMonths()\<CR>"', 'E474:')
+  call assert_fails('exe "normal i\<C-R>=ListMonths()\<CR>"', 'E1298:')
   delfunc ListColors
   delfunc ListMonths
-  call assert_fails('call complete_info({})', 'E714:')
+  call assert_fails('call complete_info({})', 'E1211:')
   call assert_equal([], complete_info(['items']).items)
 endfunc
 
index 45f83897577f2aa28f7809e0a64fed449c415e3b..f654761d643a32fc11b06115e4f2ecca2dae26da 100644 (file)
@@ -95,7 +95,7 @@ function Test_match()
   call assert_equal(0, setmatches([]))
   call assert_equal(0, setmatches([{'group': 'MyGroup1', 'pattern': 'TODO', 'priority': 10, 'id': 1}]))
   call clearmatches()
-  call assert_fails('call setmatches(0)', 'E714:')
+  call assert_fails('call setmatches(0)', 'E1211:')
   call assert_fails('call setmatches([0])', 'E474:')
   call assert_fails("call setmatches([{'wrong key': 'wrong value'}])", 'E474:')
   call assert_equal(-1, setmatches([{'group' : 'Search', 'priority' : 10, 'id' : 5, 'pos1' : {}}]))
index 22a930c5f2efd42b185be9b587a19284f75f1ed1..d31cce187676843d7b17826a7ccb2bbb77d96b4c 100644 (file)
@@ -52,7 +52,7 @@ func Test_dict_method()
   call assert_fails("let x = d->insert(0)", 'E899:')
   call assert_true(d->has_key('two'))
   call assert_equal([['one', 1], ['two', 2], ['three', 3]], d->items())
-  call assert_fails("let x = d->join()", 'E714:')
+  call assert_fails("let x = d->join()", 'E1211:')
   call assert_equal(['one', 'two', 'three'], d->keys())
   call assert_equal(3, d->len())
   call assert_equal(#{one: 2, two: 3, three: 4}, d->map('v:val + 1'))
index e23d9ac595deb5055c7fa114a8260ea9592b4cf7..e2387b28c7d66edea481d947531947cd4e7a3cf8 100644 (file)
@@ -2010,7 +2010,7 @@ func Test_sign_funcs_multi()
 
   " Invalid arguments
   call assert_equal([], sign_placelist([]))
-  call assert_fails('call sign_placelist({})', "E714:")
+  call assert_fails('call sign_placelist({})', "E1211:")
   call assert_fails('call sign_placelist([[]])', "E715:")
   call assert_fails('call sign_placelist(["abc"])', "E715:")
   call assert_fails('call sign_placelist([100])', "E715:")
@@ -2021,7 +2021,7 @@ func Test_sign_funcs_multi()
 
   " Invalid arguments
   call assert_equal([], []->sign_unplacelist())
-  call assert_fails('call sign_unplacelist({})', "E714:")
+  call assert_fails('call sign_unplacelist({})', "E1211:")
   call assert_fails('call sign_unplacelist([[]])', "E715:")
   call assert_fails('call sign_unplacelist(["abc"])', "E715:")
   call assert_fails('call sign_unplacelist([100])', "E715:")
index d325f1966b0062e4adb2c97423a9197d1cbf2dfe..93cb74d2a08f4aa9d1073159b556a0c8a2bf39d7 100644 (file)
@@ -2065,7 +2065,7 @@ func Test_terminal_ansicolors_func()
 
   let colors[4] = 'Invalid'
   call assert_fails('call term_setansicolors(buf, colors)', 'E254:')
-  call assert_fails('call term_setansicolors(buf, {})', 'E714:')
+  call assert_fails('call term_setansicolors(buf, {})', 'E1211:')
   set tgc&
 
   call StopShellInTerminal(buf)
index 34fa6c93fc0ab754098f2a1757cedab5a47f1d94..03ae9c97e0a21cb4f0d6964266c40c556d25d3a4 100644 (file)
@@ -381,7 +381,7 @@ func Test_prop_add_list()
   call assert_fails('call prop_add_list(#{type: "one"}, [[2, 2, 2, 2], [3, 20, 3, 22]])', 'E964:')
   call assert_fails('eval #{type: "one"}->prop_add_list([[2, 2, 2, 2], [3, 20, 3, 22]])', 'E964:')
   call assert_fails('call prop_add_list(test_null_dict(), [[2, 2, 2]])', 'E965:')
-  call assert_fails('call prop_add_list(#{type: "one"}, test_null_list())', 'E714:')
+  call assert_fails('call prop_add_list(#{type: "one"}, test_null_list())', 'E1298:')
   call assert_fails('call prop_add_list(#{type: "one"}, [test_null_list()])', 'E714:')
   call DeletePropTypes()
   bw!
index 862e73b9abe5c3a9a862ee3a3aa8009321402d7a..bb99cb3e60e787af1daf700cadd945affc20698b 100644 (file)
@@ -168,7 +168,7 @@ func Test_setcellwidths()
 
   call setcellwidths([])
 
-  call assert_fails('call setcellwidths(1)', 'E714:')
+  call assert_fails('call setcellwidths(1)', 'E1211:')
 
   call assert_fails('call setcellwidths([1, 2, 0])', 'E1109:')
 
index de3344f89c7a3befd2e8ed52d08e1b3748e3b592..5f5c6a2aa23e57cfdd05dc2cb0ef46705120fb53 100644 (file)
@@ -348,11 +348,8 @@ f_prop_add_list(typval_T *argvars, typval_T *rettv UNUSED)
            || check_for_list_arg(argvars, 1) == FAIL)
        return;
 
-    if (argvars[1].vval.v_list == NULL)
-    {
-       emsg(_(e_list_required));
+    if (check_for_nonnull_list_arg(argvars, 1) == FAIL)
        return;
-    }
 
     dict = argvars[0].vval.v_dict;
     if (dict == NULL || !dict_has_key(dict, "type"))
index 101f48f34a71e9b1884a1c507899bb658fc6e974..12a741ec220c45ba2c05996c287e40cc8fa7a418 100644 (file)
@@ -508,6 +508,23 @@ check_for_list_arg(typval_T *args, int idx)
     return OK;
 }
 
+/*
+ * Give an error and return FAIL unless "args[idx]" is a non-NULL list.
+ */
+    int
+check_for_nonnull_list_arg(typval_T *args, int idx)
+{
+    if (check_for_list_arg(args, idx) == FAIL)
+       return FAIL;
+
+    if (args[idx].vval.v_list == NULL)
+    {
+       semsg(_(e_non_null_list_required_for_argument_nr), idx + 1);
+       return FAIL;
+    }
+    return OK;
+}
+
 /*
  * Check for an optional list argument at 'idx'
  */
index dc45669b33f1fbe135c26f8e5b8c366227c74d07..0e463479856d9e07e7a578461924afd06a103225 100644 (file)
@@ -707,6 +707,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    345,
 /**/
     344,
 /**/