]> granicus.if.org Git - vim/commitdiff
patch 8.2.3347: check for legacy script is incomplete v8.2.3347
authorBram Moolenaar <Bram@vim.org>
Sun, 15 Aug 2021 11:49:42 +0000 (13:49 +0200)
committerBram Moolenaar <Bram@vim.org>
Sun, 15 Aug 2021 11:49:42 +0000 (13:49 +0200)
Problem:    Check for legacy script is incomplete. (Naohiro Ono)
Solution:   Also check the :legacy modifier.  Use for string concatenation
            with "." and others (issue #8756)

src/errors.h
src/eval.c
src/evalvars.c
src/ex_docmd.c
src/proto/vim9script.pro
src/testdir/test_vim9_cmd.vim
src/typval.c
src/version.c
src/vim9script.c

index 3b15d105fccef3bd7fc1c398bd94c7ea10ed3142..3468ab780c198db679991591db788340a1b71ef2 100644 (file)
@@ -650,3 +650,5 @@ EXTERN char e_argument_of_exists_compiled_must_be_literal_string[]
        INIT(= N_("E1232: Argument of exists_compiled() must be a literal string"));
 EXTERN char e_exists_compiled_can_only_be_used_in_def_function[]
        INIT(= N_("E1233: exists_compiled() can only be used in a :def function"));
+EXTERN char e_legacy_must_be_followed_by_command[]
+       INIT(= N_("E1234: legacy must be followed by a command"));
index 020f55720c5b366d8ec5ac7f6c9e4e33c5bd2efc..12931aff5119c40eab8268b2cf122ffd988ecea3 100644 (file)
@@ -2860,8 +2860,7 @@ eval5(char_u **arg, typval_T *rettv, evalarg_T *evalarg)
        // "++" and "--" on the next line are a separate command.
        p = eval_next_non_blank(*arg, evalarg, &getnext);
        op = *p;
-       concat = op == '.' && (*(p + 1) == '.'
-                             || (current_sctx.sc_version < 2 && !vim9script));
+       concat = op == '.' && (*(p + 1) == '.' || in_old_script(2));
        if ((op != '+' && op != '-' && !concat) || p[1] == '='
                                               || (p[1] == '.' && p[2] == '='))
            break;
@@ -3402,7 +3401,7 @@ eval7(
 
     if (**arg == '.' && (!isdigit(*(*arg + 1))
 #ifdef FEAT_FLOAT
-           || current_sctx.sc_version < 2
+           || in_old_script(2)
 #endif
            ))
     {
@@ -5877,7 +5876,7 @@ handle_subscript(
                || (**arg == '.' && (rettv->v_type == VAR_DICT
                        || (!evaluate
                            && (*arg)[1] != '.'
-                           && current_sctx.sc_version >= 2))))
+                           && !in_old_script(2)))))
        {
            dict_unref(selfdict);
            if (rettv->v_type == VAR_DICT)
index 90dc7fbd1b94c4ab15592809d634432704e7e7ff..2de7999a0f4f2c6912b6a8e9601b5c9590448378 100644 (file)
@@ -774,7 +774,7 @@ ex_let(exarg_T *eap)
        --argend;
     expr = skipwhite(argend);
     concat = expr[0] == '.'
-       && ((expr[1] == '=' && current_sctx.sc_version < 2)
+       && ((expr[1] == '=' && in_old_script(2))
                || (expr[1] == '.' && expr[2] == '='));
     has_assign =  *expr == '=' || (vim_strchr((char_u *)"+-*/%", *expr) != NULL
                                                            && expr[1] == '=');
@@ -2932,7 +2932,7 @@ find_var_ht(char_u *name, char_u **varname)
 
        // "version" is "v:version" in all scopes if scriptversion < 3.
        // Same for a few other variables marked with VV_COMPAT.
-       if (current_sctx.sc_version < 3)
+       if (in_old_script(3))
        {
            hi = hash_find(&compat_hashtab, name);
            if (!HASHITEM_EMPTY(hi))
index 9640c500be1caf6f80257146c46645c664a55e07..d29a93265327a5005692c1297c742a8809d54e91 100644 (file)
@@ -2951,7 +2951,7 @@ parse_command_modifiers(
                            if (ends_excmd2(p, eap->cmd))
                            {
                                *errormsg =
-                                     _(e_vim9cmd_must_be_followed_by_command);
+                                     _(e_legacy_must_be_followed_by_command);
                                return FAIL;
                            }
                            cmod->cmod_flags |= CMOD_LEGACY;
index 1b73e87bba0d1a59b34c34b173694836b3ceb272..97c1c92ad4d214e1e11590c276ab003b74142113 100644 (file)
@@ -1,5 +1,6 @@
 /* vim9script.c */
 int in_vim9script(void);
+int in_old_script(int max_version);
 int current_script_is_vim9(void);
 void ex_vim9script(exarg_T *eap);
 int not_in_vim9(exarg_T *eap);
index 49bb8739f89550cbdf32b1dfcd4c511ed21d8f0b..a9e95ff59a120a76fac72e8b86b248d28088a449 100644 (file)
@@ -13,9 +13,25 @@ def Test_vim9cmd()
     vim9cm assert_equal('yes', y)
   END
   CheckScriptSuccess(lines)
+
   assert_fails('vim9cmd', 'E1164:')
+  assert_fails('legacy', 'E1234:')
   assert_fails('vim9cmd echo "con" . "cat"', 'E15:')
 
+  lines =<< trim END
+      let str = 'con'
+      vim9cmd str .= 'cat'
+  END
+  CheckScriptFailure(lines, 'E492:')
+
+  lines =<< trim END
+      vim9script
+      legacy echo "con" . "cat"
+      legacy let str = 'con'
+      legacy let str .= 'cat'
+  END
+  CheckScriptSuccess(lines)
+
   lines =<< trim END
       vim9script
       def Foo()
@@ -24,11 +40,47 @@ def Test_vim9cmd()
       nmap ,; :vim9cmd <SID>Foo()<CR>
   END
   CheckScriptSuccess(lines)
+
   feedkeys(',;', 'xt')
   assert_equal("bar", g:found_bar)
-
   nunmap ,;
   unlet g:found_bar
+
+  lines =<< trim END
+      vim9script
+      legacy echo 1'000
+  END
+  CheckScriptFailure(lines, 'E115:')
+
+  if has('float')
+    lines =<< trim END
+        vim9script
+        echo .10
+    END
+    CheckScriptSuccess(lines)
+    lines =<< trim END
+        vim9cmd echo .10
+    END
+    CheckScriptSuccess(lines)
+    lines =<< trim END
+        vim9script
+        legacy echo .10
+    END
+    CheckScriptFailure(lines, 'E15:')
+  endif
+
+  echo v:version
+  assert_fails('vim9cmd echo version', 'E121:')
+  lines =<< trim END
+      vim9script
+      echo version
+  END
+  CheckScriptFailure(lines, 'E121:')
+  lines =<< trim END
+      vim9script
+      legacy echo version
+  END
+  CheckScriptSuccess(lines)
 enddef
 
 def Test_edit_wildcards()
index cdb617554e0a5adf499486298bd04eb67306b16d..5fb98eb6733ab618aed7b8cb11dda7b5a075c03a 100644 (file)
@@ -1704,7 +1704,7 @@ eval_number(
        int         want_string UNUSED)
 {
     int                len;
-    int                skip_quotes = current_sctx.sc_version >= 4 || in_vim9script();
+    int                skip_quotes = !in_old_script(4);
 #ifdef FEAT_FLOAT
     char_u     *p;
     int                get_float = FALSE;
index a2a229bf50bc0b1c50728f5b1a8f4714211cdeff..34793f11efc2e5bb0239e04d8fb442438da9b980 100644 (file)
@@ -755,6 +755,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    3347,
 /**/
     3346,
 /**/
index 66305a304eb54186d6a1b31b4543485e45b8a93e..19991097a03cf36b0ba37d45dad7222bda6f5e29 100644 (file)
@@ -33,6 +33,18 @@ in_vim9script(void)
 }
 
 #if defined(FEAT_EVAL) || defined(PROTO)
+/*
+ * Return TRUE when currently in a script with script version smaller than
+ * "max_version" or command modifiers forced it.
+ */
+    int
+in_old_script(int max_version)
+{
+    return (current_sctx.sc_version <= max_version
+                                        && !(cmdmod.cmod_flags & CMOD_VIM9CMD))
+               || (cmdmod.cmod_flags & CMOD_LEGACY);
+}
+
 /*
  * Return TRUE if the current script is Vim9 script.
  * This also returns TRUE in a legacy function in a Vim9 script.