0
0
mirror of https://github.com/vim/vim.git synced 2025-09-23 03:43:49 -04:00

patch 8.2.4616: Vim9: Declarations in a {} block of a user command remain

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.
This commit is contained in:
Bram Moolenaar
2022-03-23 21:36:27 +00:00
parent ac48506ac6
commit 98b7fe725e
3 changed files with 58 additions and 0 deletions

View File

@@ -798,4 +798,40 @@ func Test_multibyte_in_usercmd()
delcommand SubJapanesePeriodToDot delcommand SubJapanesePeriodToDot
endfunc 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: shiftwidth=2 sts=2 expandtab

View File

@@ -22,6 +22,7 @@ typedef struct ucmd
int uc_compl; // completion type int uc_compl; // completion type
cmd_addr_T uc_addr_type; // The command's address type cmd_addr_T uc_addr_type; // The command's address type
sctx_T uc_script_ctx; // SCTX where the command was defined sctx_T uc_script_ctx; // SCTX where the command was defined
int uc_flags; // some UC_ flags
# ifdef FEAT_EVAL # ifdef FEAT_EVAL
char_u *uc_compl_arg; // completion argument if any char_u *uc_compl_arg; // completion argument if any
# endif # endif
@@ -1038,6 +1039,7 @@ uc_add_command(
cmd->uc_script_ctx = current_sctx; cmd->uc_script_ctx = current_sctx;
if (flags & UC_VIM9) if (flags & UC_VIM9)
cmd->uc_script_ctx.sc_version = SCRIPT_VERSION_VIM9; cmd->uc_script_ctx.sc_version = SCRIPT_VERSION_VIM9;
cmd->uc_flags = flags & UC_VIM9;
#ifdef FEAT_EVAL #ifdef FEAT_EVAL
cmd->uc_script_ctx.sc_lnum += SOURCING_LNUM; cmd->uc_script_ctx.sc_lnum += SOURCING_LNUM;
cmd->uc_compl_arg = compl_arg; cmd->uc_compl_arg = compl_arg;
@@ -1725,6 +1727,9 @@ do_ucmd(exarg_T *eap)
ucmd_T *cmd; ucmd_T *cmd;
sctx_T save_current_sctx; sctx_T save_current_sctx;
int restore_current_sctx = FALSE; int restore_current_sctx = FALSE;
#ifdef FEAT_EVAL
int restore_script_version = 0;
#endif
if (eap->cmdidx == CMD_USER) if (eap->cmdidx == CMD_USER)
cmd = USER_CMD(eap->useridx); cmd = USER_CMD(eap->useridx);
@@ -1830,6 +1835,14 @@ do_ucmd(exarg_T *eap)
current_sctx.sc_version = cmd->uc_script_ctx.sc_version; current_sctx.sc_version = cmd->uc_script_ctx.sc_version;
#ifdef FEAT_EVAL #ifdef FEAT_EVAL
current_sctx.sc_sid = cmd->uc_script_ctx.sc_sid; 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 #endif
} }
@@ -1839,7 +1852,14 @@ do_ucmd(exarg_T *eap)
// Careful: Do not use "cmd" here, it may have become invalid if a user // Careful: Do not use "cmd" here, it may have become invalid if a user
// command was added. // command was added.
if (restore_current_sctx) 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; current_sctx = save_current_sctx;
}
vim_free(buf); vim_free(buf);
vim_free(split_buf); vim_free(split_buf);
} }

View File

@@ -750,6 +750,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
4616,
/**/ /**/
4615, 4615,
/**/ /**/