0
0
mirror of https://github.com/vim/vim.git synced 2025-09-29 04:34:16 -04:00

patch 8.2.2268: Vim9: list unpack seen as declaration

Problem:    Vim9: list unpack seen as declaration.
Solution:   Check for "var". (closes #7594)
This commit is contained in:
Bram Moolenaar
2021-01-01 21:05:55 +01:00
parent c368957b19
commit 3862ea3f62
7 changed files with 54 additions and 15 deletions

View File

@@ -912,7 +912,7 @@ ex_let_vars(
int copy, // copy values from "tv", don't move
int semicolon, // from skip_var_list()
int var_count, // from skip_var_list()
int flags, // ASSIGN_FINAL, ASSIGN_CONST, ASSIGN_NO_DECL
int flags, // ASSIGN_FINAL, ASSIGN_CONST, etc.
char_u *op)
{
char_u *arg = arg_start;
@@ -1267,7 +1267,7 @@ ex_let_one(
char_u *arg, // points to variable name
typval_T *tv, // value to assign to variable
int copy, // copy value from "tv"
int flags, // ASSIGN_CONST, ASSIGN_FINAL, ASSIGN_NO_DECL
int flags, // ASSIGN_CONST, ASSIGN_FINAL, etc.
char_u *endchars, // valid chars after variable name or NULL
char_u *op) // "+", "-", "." or NULL
{
@@ -1279,7 +1279,7 @@ ex_let_one(
int opt_flags;
char_u *tofree = NULL;
if (in_vim9script() && (flags & ASSIGN_NO_DECL) == 0
if (in_vim9script() && (flags & (ASSIGN_NO_DECL | ASSIGN_DECL)) == 0
&& (flags & (ASSIGN_CONST | ASSIGN_FINAL)) == 0
&& vim_strchr((char_u *)"$@&", *arg) != NULL)
{
@@ -1476,7 +1476,8 @@ ex_let_one(
lval_T lv;
p = get_lval(arg, tv, &lv, FALSE, FALSE,
(flags & ASSIGN_NO_DECL) ? GLV_NO_DECL : 0, FNE_CHECK_START);
(flags & (ASSIGN_NO_DECL | ASSIGN_DECL))
? GLV_NO_DECL : 0, FNE_CHECK_START);
if (p != NULL && lv.ll_name != NULL)
{
if (endchars != NULL && vim_strchr(endchars,
@@ -3053,7 +3054,7 @@ set_var(
typval_T *tv,
int copy) // make copy of value in "tv"
{
set_var_const(name, NULL, tv, copy, ASSIGN_NO_DECL);
set_var_const(name, NULL, tv, copy, ASSIGN_DECL);
}
/*
@@ -3067,7 +3068,7 @@ set_var_const(
type_T *type,
typval_T *tv_arg,
int copy, // make copy of value in "tv"
int flags) // ASSIGN_CONST, ASSIGN_FINAL, ASSIGN_NO_DECL
int flags) // ASSIGN_CONST, ASSIGN_FINAL, etc.
{
typval_T *tv = tv_arg;
typval_T bool_tv;
@@ -3087,7 +3088,7 @@ set_var_const(
if (vim9script
&& !is_script_local
&& (flags & ASSIGN_NO_DECL) == 0
&& (flags & (ASSIGN_NO_DECL | ASSIGN_DECL)) == 0
&& (flags & (ASSIGN_CONST | ASSIGN_FINAL)) == 0
&& name[1] == ':')
{
@@ -3126,7 +3127,7 @@ set_var_const(
if (is_script_local && vim9script)
{
if ((flags & ASSIGN_NO_DECL) == 0)
if ((flags & (ASSIGN_NO_DECL | ASSIGN_DECL)) == 0)
{
semsg(_(e_redefining_script_item_str), name);
goto failed;
@@ -3200,8 +3201,15 @@ set_var_const(
clear_tv(&di->di_tv);
}
else // add a new variable
else
{
// add a new variable
if (vim9script && is_script_local && (flags & ASSIGN_NO_DECL))
{
semsg(_(e_unknown_variable_str), name);
goto failed;
}
// Can't add "v:" or "a:" variable.
if (ht == &vimvarht || ht == get_funccal_args_ht())
{