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 #7484)
diff --git a/src/eval.c b/src/eval.c
index 496e208..f84491e 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -874,6 +874,13 @@
     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 654eeff..572e5d5 100644
--- a/src/evalvars.c
+++ b/src/evalvars.c
@@ -1464,7 +1464,8 @@
     {
 	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 152eda6..95d4dd1 100644
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -3332,6 +3332,8 @@
 
 		// 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 a97037d..fe06be0 100644
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@
 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 d6c1f46..ebd7db4 100644
--- a/src/vim.h
+++ b/src/vim.h
@@ -2536,16 +2536,18 @@
 #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.