changeset 23239:a789a688e37d v8.2.2165

patch 8.2.2165: Vim9: assignment to dict member does not work Commit: https://github.com/vim/vim/commit/8f22f5c3aa0aa96e3843a57f29405625d8514c74 Author: Bram Moolenaar <Bram@vim.org> Date: Sat Dec 19 22:10:13 2020 +0100 patch 8.2.2165: Vim9: assignment to dict member does not work Problem: Vim9: assignment to dict member does not work. Solution: Fix recognizing dict member. (closes https://github.com/vim/vim/issues/7484)
author Bram Moolenaar <Bram@vim.org>
date Sat, 19 Dec 2020 22:45:03 +0100
parents 5945735ad4af
children 8bb577c256d7
files src/eval.c src/evalvars.c src/ex_docmd.c src/version.c src/vim.h
diffstat 5 files changed, 20 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- 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.
      */
--- 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,
--- 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
--- 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,
--- 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.