summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-12-19 22:10:13 +0100
committerBram Moolenaar <Bram@vim.org>2020-12-19 22:10:13 +0100
commit8f22f5c3aa0aa96e3843a57f29405625d8514c74 (patch)
treeaea0a069118938db143470a21b3772e5e0995e5b
parent17f700ac8b55f27ddb519ecaa8acaa43fc1ae60a (diff)
patch 8.2.2165: Vim9: assignment to dict member does not workv8.2.2165
Problem: Vim9: assignment to dict member does not work. Solution: Fix recognizing dict member. (closes #7484)
-rw-r--r--src/eval.c7
-rw-r--r--src/evalvars.c3
-rw-r--r--src/ex_docmd.c2
-rw-r--r--src/version.c2
-rw-r--r--src/vim.h12
5 files changed, 20 insertions, 6 deletions
diff --git a/src/eval.c b/src/eval.c
index 496e208756..f84491e043 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -874,6 +874,13 @@ get_lval(
if (v == NULL)
return NULL;
+ if (in_vim9script() && (flags & GLV_NO_DECL) == 0)
+ {
+ if (!quiet)
+ semsg(_(e_variable_already_declared), lp->ll_name);
+ return NULL;
+ }
+
/*
* Loop until no more [idx] or .key is following.
*/
diff --git a/src/evalvars.c b/src/evalvars.c
index 654eeff230..572e5d5567 100644
--- a/src/evalvars.c
+++ b/src/evalvars.c
@@ -1464,7 +1464,8 @@ ex_let_one(
{
lval_T lv;
- p = get_lval(arg, tv, &lv, FALSE, FALSE, 0, FNE_CHECK_START);
+ p = get_lval(arg, tv, &lv, FALSE, FALSE,
+ (flags & ASSIGN_NO_DECL) ? GLV_NO_DECL : 0, FNE_CHECK_START);
if (p != NULL && lv.ll_name != NULL)
{
if (endchars != NULL && vim_strchr(endchars,
diff --git a/src/ex_docmd.c b/src/ex_docmd.c
index 152eda6c6c..95d4dd16b7 100644
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -3332,6 +3332,8 @@ find_ex_command(
// When followed by "=" or "+=" then it is an assignment.
++emsg_silent;
+ if (*after == '.')
+ after = skipwhite(after + 1);
if (skip_expr(&after, NULL) == OK)
after = skipwhite(after);
else
diff --git a/src/version.c b/src/version.c
index a97037d510..fe06be0497 100644
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 2165,
+/**/
2164,
/**/
2163,
diff --git a/src/vim.h b/src/vim.h
index d6c1f46e14..ebd7db441e 100644
--- a/src/vim.h
+++ b/src/vim.h
@@ -2536,16 +2536,18 @@ typedef enum {
#define COPYID_MASK (~0x1)
// Values for trans_function_name() argument:
-#define TFN_INT 1 // internal function name OK
-#define TFN_QUIET 2 // no error messages
-#define TFN_NO_AUTOLOAD 4 // do not use script autoloading
-#define TFN_NO_DEREF 8 // do not dereference a Funcref
-#define TFN_READ_ONLY 16 // will not change the var
+#define TFN_INT 0x01 // internal function name OK
+#define TFN_QUIET 0x02 // no error messages
+#define TFN_NO_AUTOLOAD 0x04 // do not use script autoloading
+#define TFN_NO_DEREF 0x08 // do not dereference a Funcref
+#define TFN_READ_ONLY 0x10 // will not change the var
+#define TFN_NO_DECL 0x20 // only used for GLV_NO_DECL
// Values for get_lval() flags argument:
#define GLV_QUIET TFN_QUIET // no error messages
#define GLV_NO_AUTOLOAD TFN_NO_AUTOLOAD // do not use script autoloading
#define GLV_READ_ONLY TFN_READ_ONLY // will not change the var
+#define GLV_NO_DECL TFN_NO_DECL // assignment without :var or :let
#define DO_NOT_FREE_CNT 99999 // refcount for dict or list that should not
// be freed.