]> granicus.if.org Git - vim/commitdiff
patch 8.2.4024: confusing error message if imported name is used directly v8.2.4024
authorBram Moolenaar <Bram@vim.org>
Fri, 7 Jan 2022 12:45:29 +0000 (12:45 +0000)
committerBram Moolenaar <Bram@vim.org>
Fri, 7 Jan 2022 12:45:29 +0000 (12:45 +0000)
Problem:    Confusing error message if imported name is used directly.
Solution:   Give a better error message.

src/eval.c
src/evalvars.c
src/proto/eval.pro
src/testdir/test_vim9_script.vim
src/userfunc.c
src/version.c

index fe4dbd10bb5eb42ea9bf018615de6490f1e07433..7fed2867d1b3b971a78d7bfd03d7412a0101d268 100644 (file)
@@ -3481,6 +3481,7 @@ eval7(
                                      && (evalarg->eval_flags & EVAL_EVALUATE);
     int                len;
     char_u     *s;
+    char_u     *name_start = NULL;
     char_u     *start_leader, *end_leader;
     int                ret = OK;
     char_u     *alias;
@@ -3713,8 +3714,11 @@ eval7(
                    ret = OK;
                }
                else
+               {
+                   name_start = s;
                    ret = eval_variable(s, len, 0, rettv, NULL,
                                           EVAL_VAR_VERBOSE + EVAL_VAR_IMPORT);
+               }
            }
            else
            {
@@ -3729,7 +3733,7 @@ eval7(
     // Handle following '[', '(' and '.' for expr[expr], expr.name,
     // expr(expr), expr->name(expr)
     if (ret == OK)
-       ret = handle_subscript(arg, rettv, evalarg, TRUE);
+       ret = handle_subscript(arg, name_start, rettv, evalarg, TRUE);
 
     /*
      * Apply logical NOT and unary '-', from right to left, ignore '+'.
@@ -5891,10 +5895,12 @@ eval_isdictc(int c)
  * - method call: var->method()
  *
  * Can all be combined in any order: dict.func(expr)[idx]['func'](expr)->len()
+ * "name_start" points to a variable before the subscript or is NULL.
  */
     int
 handle_subscript(
     char_u     **arg,
+    char_u     *name_start,
     typval_T   *rettv,
     evalarg_T  *evalarg,
     int                verbose)        // give error messages
@@ -5936,7 +5942,8 @@ handle_subscript(
            if (**arg != '.')
            {
                if (verbose)
-                   semsg(_(e_expected_str_but_got_str), "'.'", *arg);
+                   semsg(_(e_expected_dot_after_name_str),
+                                       name_start != NULL ? name_start: *arg);
                ret = FAIL;
                break;
            }
index 2de6f224b7dd55cda6a830cef5989a66f047c823..730c7d12280d88799fffc88b7b04d3b0d687fd6a 100644 (file)
@@ -1239,8 +1239,8 @@ list_arg_vars(exarg_T *eap, char_u *arg, int *first)
                {
                    // handle d.key, l[idx], f(expr)
                    arg_subsc = arg;
-                   if (handle_subscript(&arg, &tv, &EVALARG_EVALUATE, TRUE)
-                                                                      == FAIL)
+                   if (handle_subscript(&arg, name_start, &tv,
+                                             &EVALARG_EVALUATE, TRUE) == FAIL)
                        error = TRUE;
                    else
                    {
@@ -3955,7 +3955,8 @@ var_exists(char_u *var)
        {
            // handle d.key, l[idx], f(expr)
            arg = skipwhite(arg);
-           n = (handle_subscript(&arg, &tv, &EVALARG_EVALUATE, FALSE) == OK);
+           n = (handle_subscript(&arg, name, &tv, &EVALARG_EVALUATE,
+                                                                FALSE) == OK);
            if (n)
                clear_tv(&tv);
        }
index f7fa64737589673400356f7444b50c70dd5e3bf1..ac4a51cd9305f77ecb2aab4a34ce11d5f3820ef2 100644 (file)
@@ -70,7 +70,7 @@ char_u *find_name_end(char_u *arg, char_u **expr_start, char_u **expr_end, int f
 int eval_isnamec(int c);
 int eval_isnamec1(int c);
 int eval_isdictc(int c);
-int handle_subscript(char_u **arg, typval_T *rettv, evalarg_T *evalarg, int verbose);
+int handle_subscript(char_u **arg, char_u *name_start, typval_T *rettv, evalarg_T *evalarg, int verbose);
 int item_copy(typval_T *from, typval_T *to, int deep, int copyID);
 void echo_one(typval_T *rettv, int with_space, int *atstart, int *needclr);
 void ex_echo(exarg_T *eap);
index 4c5d9e9a0d416e0aebd77e5a6a9eecaf301c6832..19eee76c784da81c85d8793f7ca915b200ba7d25 100644 (file)
@@ -1265,6 +1265,26 @@ def Test_vim9_import_export()
   unlet g:imported_func
   delete('Ximport_lbr.vim')
 
+  var line_break_before_dot =<< trim END
+    vim9script
+    import './Xexport.vim' as expo
+    g:exported = expo
+                  .exported
+  END
+  writefile(line_break_before_dot, 'Ximport_lbr_before_dot.vim')
+  assert_fails('source Ximport_lbr_before_dot.vim', 'E1060:', '', 3)
+  delete('Ximport_lbr_before_dot.vim')
+
+  var line_break_after_dot =<< trim END
+    vim9script
+    import './Xexport.vim' as expo
+    g:exported = expo.
+                  exported
+  END
+  writefile(line_break_after_dot, 'Ximport_lbr_after_dot.vim')
+  assert_fails('source Ximport_lbr_after_dot.vim', 'E1074:', '', 3)
+  delete('Ximport_lbr_after_dot.vim')
+
   var import_star_as_lines =<< trim END
     vim9script
     import './Xexport.vim' as Export
@@ -1333,7 +1353,7 @@ def Test_vim9_import_export()
     g:imported_script = Export exported
   END
   writefile(import_star_as_lines_script_no_dot, 'Ximport.vim')
-  assert_fails('source Ximport.vim', 'E1029:')
+  assert_fails('source Ximport.vim', 'E1060: Expected dot after name: Export exported')
 
   var import_star_as_lines_script_space_after_dot =<< trim END
     vim9script
@@ -1519,7 +1539,7 @@ def Test_import_star_fails()
       import './Xfoo.vim' as foo
       var that = foo
   END
-  CheckScriptFailure(lines, 'E1029: Expected ''.''')
+  CheckScriptFailure(lines, 'E1060: Expected dot after name: foo')
 
   lines =<< trim END
       vim9script
index f9bf5e3316cefa150d093c2d5076ba748577c7d1..7446d6ec93870e32fcea3147c55f33ce08be101a 100644 (file)
@@ -5170,7 +5170,7 @@ ex_call(exarg_T *eap)
            dbg_check_breakpoint(eap);
 
        // Handle a function returning a Funcref, Dictionary or List.
-       if (handle_subscript(&arg, &rettv,
+       if (handle_subscript(&arg, NULL, &rettv,
                           eap->skip ? NULL : &EVALARG_EVALUATE, TRUE) == FAIL)
        {
            failed = TRUE;
index cb331fa12c3aa71ea6b531497ac77d344c152a8a..d8fe3528fded245bc85e7f2cc2d6c3b1e8738933 100644 (file)
@@ -750,6 +750,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    4024,
 /**/
     4023,
 /**/