To: vim_dev@googlegroups.com Subject: Patch 8.2.4616 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.4616 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. Files: src/usercmd.c, src/testdir/test_usercommands.vim *** ../vim-8.2.4615/src/usercmd.c 2022-03-14 19:24:41.867926390 +0000 --- src/usercmd.c 2022-03-23 21:33:43.721848829 +0000 *************** *** 22,27 **** --- 22,28 ---- 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,1043 **** --- 1039,1045 ---- 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,1730 **** --- 1727,1735 ---- 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,1835 **** --- 1835,1848 ---- 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,1845 **** --- 1852,1865 ---- // 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); } *** ../vim-8.2.4615/src/testdir/test_usercommands.vim 2022-02-17 11:26:38.717059014 +0000 --- src/testdir/test_usercommands.vim 2022-03-23 21:34:08.841791470 +0000 *************** *** 798,801 **** --- 798,837 ---- 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 *** ../vim-8.2.4615/src/version.c 2022-03-23 19:44:56.102161393 +0000 --- src/version.c 2022-03-23 21:21:23.739703205 +0000 *************** *** 752,753 **** --- 752,755 ---- { /* Add new patch number below this line */ + /**/ + 4616, /**/ -- Nothing is impossible for the man who doesn't have to do it. /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// \\\ \\\ sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///