]> granicus.if.org Git - vim/commitdiff
patch 8.2.3052: Vim9: "legacy call" does not work v8.2.3052
authorBram Moolenaar <Bram@vim.org>
Sat, 26 Jun 2021 11:00:49 +0000 (13:00 +0200)
committerBram Moolenaar <Bram@vim.org>
Sat, 26 Jun 2021 11:00:49 +0000 (13:00 +0200)
Problem:    Vim9: "legacy call" does not work.
Solution:   Do not skip "call" after "legacy". (closes #8454)

src/testdir/test_vim9_func.vim
src/version.c
src/vim9compile.c

index 301a55c8757a03ac8630b58ee583a563d7976297..bffbb1b0ab5707acd34adb92020cf4a1c4382002 100644 (file)
@@ -2316,6 +2316,23 @@ def Test_legacy_lambda()
   CheckScriptSuccess(lines)
 enddef
 
+def Test_legacy()
+  var lines =<< trim END
+      vim9script
+      func g:LegacyFunction()
+        let g:legacyvar = 1
+      endfunc
+      def Testit()
+        legacy call g:LegacyFunction()
+      enddef
+      Testit()
+      assert_equal(1, g:legacyvar)
+      unlet g:legacyvar
+      delfunc g:LegacyFunction
+  END
+  CheckScriptSuccess(lines)
+enddef
+
 def Test_legacy_errors()
   for cmd in ['if', 'elseif', 'else', 'endif',
               'for', 'endfor', 'continue', 'break',
index 1270c0c06c066e45f51d235b82106c0a6764ff87..2b320471b3b832ff860ba4618e66a23356306dbc 100644 (file)
@@ -755,6 +755,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    3052,
 /**/
     3051,
 /**/
index dd3f3aec320d0aa5ae3665c74ab6ae9c090cb4af..bb5ea9726e01ce863d86bb6f7b1260cde15fb891 100644 (file)
@@ -9346,27 +9346,30 @@ compile_def_function(
                break;
        }
 
-       // Skip ":call" to get to the function name.
+       // Skip ":call" to get to the function name, unless using :legacy
        p = ea.cmd;
-       if (checkforcmd(&ea.cmd, "call", 3))
+       if (!(local_cmdmod.cmod_flags & CMOD_LEGACY))
        {
-           if (*ea.cmd == '(')
-               // not for "call()"
-               ea.cmd = p;
-           else
-               ea.cmd = skipwhite(ea.cmd);
-       }
+           if (checkforcmd(&ea.cmd, "call", 3))
+           {
+               if (*ea.cmd == '(')
+                   // not for "call()"
+                   ea.cmd = p;
+               else
+                   ea.cmd = skipwhite(ea.cmd);
+           }
 
-       if (!starts_with_colon)
-       {
-           int     assign;
+           if (!starts_with_colon)
+           {
+               int         assign;
 
-           // Check for assignment after command modifiers.
-           assign = may_compile_assignment(&ea, &line, &cctx);
-           if (assign == OK)
-               goto nextline;
-           if (assign == FAIL)
-               goto erret;
+               // Check for assignment after command modifiers.
+               assign = may_compile_assignment(&ea, &line, &cctx);
+               if (assign == OK)
+                   goto nextline;
+               if (assign == FAIL)
+                   goto erret;
+           }
        }
 
        /*
@@ -9375,8 +9378,9 @@ compile_def_function(
         * "++nr" and "--nr" are eval commands
         */
        cmd = ea.cmd;
-       if (starts_with_colon || !(*cmd == '\''
-                       || (cmd[0] == cmd[1] && (*cmd == '+' || *cmd == '-'))))
+       if (!(local_cmdmod.cmod_flags & CMOD_LEGACY)
+               && (starts_with_colon || !(*cmd == '\''
+                      || (cmd[0] == cmd[1] && (*cmd == '+' || *cmd == '-')))))
        {
            ea.cmd = skip_range(ea.cmd, TRUE, NULL);
            if (ea.cmd > cmd)