]> granicus.if.org Git - vim/commitdiff
patch 8.2.4616: Vim9: Declarations in a {} block of a user command remain v8.2.4616
authorBram Moolenaar <Bram@vim.org>
Wed, 23 Mar 2022 21:36:27 +0000 (21:36 +0000)
committerBram Moolenaar <Bram@vim.org>
Wed, 23 Mar 2022 21:36:27 +0000 (21:36 +0000)
Problem:    Vim9: Declarations in a {} block of a user command do not use Vim9
            rules if defined in a legacy script. (Yegappan Lakshmanan)
Solution:   Pretend the script is Vim9 script.

src/testdir/test_usercommands.vim
src/usercmd.c
src/version.c

index 00bbde490602860432b0183e5d546fdd604e794a..2feeef03f97a9c48e1a337ffb52f6b24bc376119 100644 (file)
@@ -798,4 +798,40 @@ func Test_multibyte_in_usercmd()
   delcommand SubJapanesePeriodToDot
 endfunc
 
+" Declaring a variable in a {} uses Vim9 script rules, even when defined in a
+" legacy script.
+func Test_block_declaration_legacy_script()
+  let lines =<< trim END
+      command -range Rename {
+                     var save = @a
+                     @a = 'something'
+                     g:someExpr = @a
+                     @a = save
+                }
+  END
+  call writefile(lines, 'Xlegacy')
+  source Xlegacy
+
+  let lines =<< trim END
+      let @a = 'saved'
+      Rename
+      call assert_equal('something', g:someExpr)
+      call assert_equal('saved', @a)
+
+      let g:someExpr = 'xxx'
+      let @a = 'also'
+      Rename
+      call assert_equal('something', g:someExpr)
+      call assert_equal('also', @a)
+  END
+  call writefile(lines, 'Xother')
+  source Xother
+
+  unlet g:someExpr
+  call delete('Xlegacy')
+  call delete('Xother')
+  delcommand Rename
+endfunc
+
+
 " vim: shiftwidth=2 sts=2 expandtab
index 70dbbb03badcf56af8299d7cef054c3c196b2bd6..40d951f6dcf5882710861fc9e84f0aeb95aae0c0 100644 (file)
@@ -22,6 +22,7 @@ typedef struct ucmd
     int                uc_compl;       // completion type
     cmd_addr_T uc_addr_type;   // The command's address type
     sctx_T     uc_script_ctx;  // SCTX where the command was defined
+    int                uc_flags;       // some UC_ flags
 # ifdef FEAT_EVAL
     char_u     *uc_compl_arg;  // completion argument if any
 # endif
@@ -1038,6 +1039,7 @@ uc_add_command(
     cmd->uc_script_ctx = current_sctx;
     if (flags & UC_VIM9)
        cmd->uc_script_ctx.sc_version = SCRIPT_VERSION_VIM9;
+    cmd->uc_flags = flags & UC_VIM9;
 #ifdef FEAT_EVAL
     cmd->uc_script_ctx.sc_lnum += SOURCING_LNUM;
     cmd->uc_compl_arg = compl_arg;
@@ -1725,6 +1727,9 @@ do_ucmd(exarg_T *eap)
     ucmd_T     *cmd;
     sctx_T     save_current_sctx;
     int                restore_current_sctx = FALSE;
+#ifdef FEAT_EVAL
+    int                restore_script_version = 0;
+#endif
 
     if (eap->cmdidx == CMD_USER)
        cmd = USER_CMD(eap->useridx);
@@ -1830,6 +1835,14 @@ do_ucmd(exarg_T *eap)
        current_sctx.sc_version = cmd->uc_script_ctx.sc_version;
 #ifdef FEAT_EVAL
        current_sctx.sc_sid = cmd->uc_script_ctx.sc_sid;
+       if (cmd->uc_flags & UC_VIM9)
+       {
+           // In a {} block variables use Vim9 script rules, even in a legacy
+           // script.
+           restore_script_version =
+                                 SCRIPT_ITEM(current_sctx.sc_sid)->sn_version;
+           SCRIPT_ITEM(current_sctx.sc_sid)->sn_version = SCRIPT_VERSION_VIM9;
+       }
 #endif
     }
 
@@ -1839,7 +1852,14 @@ do_ucmd(exarg_T *eap)
     // Careful: Do not use "cmd" here, it may have become invalid if a user
     // command was added.
     if (restore_current_sctx)
+    {
+#ifdef FEAT_EVAL
+       if (restore_script_version != 0)
+           SCRIPT_ITEM(current_sctx.sc_sid)->sn_version =
+                                                       restore_script_version;
+#endif
        current_sctx = save_current_sctx;
+    }
     vim_free(buf);
     vim_free(split_buf);
 }
index dd2330e4a747f1dc22056d72d5f8137b88e7cf04..ba16773e1d6a9df6e13d88828beea80ca84c8233 100644 (file)
@@ -750,6 +750,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    4616,
 /**/
     4615,
 /**/