]> granicus.if.org Git - vim/commitdiff
patch 8.2.1274: Vim9: no error for missing white space at script level v8.2.1274
authorBram Moolenaar <Bram@vim.org>
Thu, 23 Jul 2020 11:11:37 +0000 (13:11 +0200)
committerBram Moolenaar <Bram@vim.org>
Thu, 23 Jul 2020 11:11:37 +0000 (13:11 +0200)
Problem:    Vim9: no error for missing white space in assignment at script
            level.
Solution:   Check for white space. (closes #6495)

src/eval.c
src/evalvars.c
src/testdir/test_let.vim
src/testdir/test_vim9_script.vim
src/version.c

index a8e388db01fea1919a033c5d1284cc78aa255fc8..bb75528ca7aaded90b9755d70be5dce8d621faa7 100644 (file)
@@ -4996,7 +4996,8 @@ find_name_end(
     for (p = arg; *p != NUL
                    && (eval_isnamec(*p)
                        || (*p == '{' && !vim9script)
-                       || ((flags & FNE_INCL_BR) && (*p == '[' || *p == '.'))
+                       || ((flags & FNE_INCL_BR) && (*p == '['
+                                       || (*p == '.' && eval_isnamec1(p[1]))))
                        || mb_nest != 0
                        || br_nest != 0); MB_PTR_ADV(p))
     {
index e2469b0e8242641100dfd3cb1c081d5c3144ead8..564c65b8aafa34dc06604a917986f28a9213b77c 100644 (file)
@@ -698,12 +698,13 @@ ex_let(exarg_T *eap)
     int                i;
     int                var_count = 0;
     int                semicolon = 0;
-    char_u     op[2];
+    char_u     op[4];
     char_u     *argend;
     int                first = TRUE;
     int                concat;
     int                has_assign;
     int                flags = eap->cmdidx == CMD_const ? LET_IS_CONST : 0;
+    int                vim9script = in_vim9script();
 
     // detect Vim9 assignment without ":let" or ":const"
     if (eap->arg == eap->cmd)
@@ -725,11 +726,11 @@ ex_let(exarg_T *eap)
        // ":let" without "=": list variables
        if (*arg == '[')
            emsg(_(e_invarg));
-       else if (expr[0] == '.')
-           emsg(_("E985: .= is not supported with script version 2"));
+       else if (expr[0] == '.' && expr[1] == '=')
+           emsg(_("E985: .= is not supported with script version >= 2"));
        else if (!ends_excmd2(eap->cmd, arg))
        {
-           if (in_vim9script())
+           if (vim9script)
            {
                // Vim9 declaration ":let var: type"
                arg = vim9_declare_scriptvar(eap, arg);
@@ -775,6 +776,7 @@ ex_let(exarg_T *eap)
     else
     {
        evalarg_T   evalarg;
+       int         len = 1;
 
        rettv.v_type = VAR_UNKNOWN;
        i = FAIL;
@@ -787,13 +789,25 @@ ex_let(exarg_T *eap)
                if (vim_strchr((char_u *)"+-*/%.", *expr) != NULL)
                {
                    op[0] = *expr;   // +=, -=, *=, /=, %= or .=
+                   ++len;
                    if (expr[0] == '.' && expr[1] == '.') // ..=
+                   {
                        ++expr;
+                       ++len;
+                   }
                }
-               expr = skipwhite(expr + 2);
+               expr += 2;
            }
            else
-               expr = skipwhite(expr + 1);
+               ++expr;
+
+           if (vim9script && (!VIM_ISWHITE(*argend) || !VIM_ISWHITE(*expr)))
+           {
+               vim_strncpy(op, expr - len, len);
+               semsg(_(e_white_both), op);
+               i = FAIL;
+           }
+           expr = skipwhite(expr);
 
            if (eap->skip)
                ++emsg_skip;
@@ -817,7 +831,7 @@ ex_let(exarg_T *eap)
        else if (i != FAIL)
        {
            (void)ex_let_vars(eap->arg, &rettv, FALSE, semicolon, var_count,
-                                                                flags, op);
+                                                                   flags, op);
            clear_tv(&rettv);
        }
     }
index 404fe1575470bd8bc745f58c7a6dcb2f3b60c3da..9a399e8f38b64bf32190a226f2bf80123f6437f1 100644 (file)
@@ -293,12 +293,12 @@ func Test_let_errors()
   let s = "var"
   let var = 1
   call assert_fails('let var += [1,2]', 'E734:')
-  call assert_fails('let {s}.1 = 2', 'E18:')
+  call assert_fails('let {s}.1 = 2', 'E15:')
   call assert_fails('let a[1] = 5', 'E121:')
   let l = [[1,2]]
   call assert_fails('let l[:][0] = [5]', 'E708:')
   let d = {'k' : 4}
-  call assert_fails('let d.# = 5', 'E713:')
+  call assert_fails('let d.# = 5', 'E488:')
   call assert_fails('let d.m += 5', 'E734:')
   call assert_fails('let m = d[{]', 'E15:')
   let l = [1, 2]
index 36d7e89c73c08d339da7214b90276dc6cd2b1de5..fd572d742fc4be293456f147cdc354f3c2500c63 100644 (file)
@@ -318,6 +318,15 @@ def Test_assignment_failure()
   call CheckDefFailure(['let var =234'], 'E1004:')
   call CheckDefFailure(['let var= 234'], 'E1004:')
 
+  call CheckScriptFailure(['vim9script', 'let var=234'], 'E1004:')
+  call CheckScriptFailure(['vim9script', 'let var=234'], "before and after '='")
+  call CheckScriptFailure(['vim9script', 'let var =234'], 'E1004:')
+  call CheckScriptFailure(['vim9script', 'let var= 234'], 'E1004:')
+  call CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], 'E1004:')
+  call CheckScriptFailure(['vim9script', 'let var = 234', 'var+=234'], "before and after '+='")
+  call CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], 'E1004:')
+  call CheckScriptFailure(['vim9script', 'let var = "x"', 'var..="y"'], "before and after '..='")
+
   call CheckDefFailure(['let true = 1'], 'E1034:')
   call CheckDefFailure(['let false = 1'], 'E1034:')
 
index ed8f6c468551a28dd42f1f3aff61c1df2021c2ed..82b5780b4e52fb09ede58b8f6850aa14fcd3f551 100644 (file)
@@ -754,6 +754,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1274,
 /**/
     1273,
 /**/