0
0
mirror of https://github.com/vim/vim.git synced 2025-09-28 04:24:06 -04:00

patch 8.2.2687: Vim9: cannot use "const" for global variable in :def function

Problem:    Vim9: cannot use "const" for global variable in :def function.
Solution:   Do allow using :const for a global variable. (closes #8030)
This commit is contained in:
Bram Moolenaar
2021-04-01 19:42:48 +02:00
parent ce0b75711a
commit d877a5700f
4 changed files with 27 additions and 2 deletions

View File

@@ -1277,6 +1277,13 @@ def Test_var_declaration()
g:FLIST[0] = 22
assert_equal([22], g:FLIST)
def SetGlobalConst()
const g:globConst = 123
enddef
SetGlobalConst()
assert_equal(123, g:globConst)
assert_true(islocked('g:globConst'))
const w:FOO: number = 46
assert_equal(46, w:FOO)
const w:FOOS = 'wfoos'
@@ -1339,6 +1346,17 @@ def Test_var_declaration_fails()
CheckScriptFailure(lines, 'E741:')
unlet g:constvar
lines =<< trim END
vim9script
def SetGlobalConst()
const g:globConst = 123
enddef
SetGlobalConst()
g:globConst = 234
END
CheckScriptFailure(lines, 'E741: Value is locked: globConst')
unlet g:globConst
lines =<< trim END
vim9script
const cdict: dict<string> = {}

View File

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

View File

@@ -5752,7 +5752,8 @@ compile_lhs(
&lhs->lhs_opt_flags, &lhs->lhs_vimvaridx,
&lhs->lhs_type, cctx) == FAIL)
return FAIL;
if (lhs->lhs_dest != dest_local)
if (lhs->lhs_dest != dest_local
&& cmdidx != CMD_const && cmdidx != CMD_final)
{
// Specific kind of variable recognized.
declare_error = is_decl;
@@ -6519,6 +6520,7 @@ compile_assignment(char_u *arg, exarg_T *eap, cmdidx_T cmdidx, cctx_T *cctx)
else
{
if (is_decl && cmdidx == CMD_const && (lhs.lhs_dest == dest_script
|| lhs.lhs_dest == dest_global
|| lhs.lhs_dest == dest_local))
// ":const var": lock the value, but not referenced variables
generate_LOCKCONST(cctx);

View File

@@ -963,9 +963,12 @@ check_for_number(typval_T *tv)
store_var(char_u *name, typval_T *tv)
{
funccal_entry_T entry;
int flags = ASSIGN_DECL;
if (tv->v_lock)
flags |= ASSIGN_CONST;
save_funccal(&entry);
set_var_const(name, NULL, tv, FALSE, ASSIGN_DECL, 0);
set_var_const(name, NULL, tv, FALSE, flags, 0);
restore_funccal();
}