diff src/vim9compile.c @ 31590:aee868b9229a v9.0.1127

patch 9.0.1127: no error if function argument shadows class member Commit: https://github.com/vim/vim/commit/6acf757c6a11c0653b0132a17c22983856da5ad6 Author: Bram Moolenaar <Bram@vim.org> Date: Sun Jan 1 19:53:30 2023 +0000 patch 9.0.1127: no error if function argument shadows class member Problem: No error if function argument shadows class member. Solution: Give an error for shadowing a class member.
author Bram Moolenaar <Bram@vim.org>
date Sun, 01 Jan 2023 21:00:03 +0100
parents 67d9fbe516a3
children 394967126db9
line wrap: on
line diff
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -302,28 +302,6 @@ script_var_exists(char_u *name, size_t l
 }
 
 /*
- * If "name" is a class member in cctx->ctx_ufunc->uf_class return the index in
- * class.class_class_members[].
- * Otherwise return -1;
- */
-    static int
-class_member_index(char_u *name, size_t len, cctx_T *cctx)
-{
-    if (cctx == NULL || cctx->ctx_ufunc == NULL
-					  || cctx->ctx_ufunc->uf_class == NULL)
-	return -1;
-    class_T *cl = cctx->ctx_ufunc->uf_class;
-    for (int i = 0; i < cl->class_class_member_count; ++i)
-    {
-	ocmember_T *m = &cl->class_class_members[i];
-	if (STRNCMP(name, m->ocm_name, len) == 0
-		&& m->ocm_name[len] == NUL)
-	    return i;
-    }
-    return -1;
-}
-
-/*
  * Return TRUE if "name" is a local variable, argument, script variable or
  * imported.
  */
@@ -338,7 +316,7 @@ variable_exists(char_u *name, size_t len
 			&& (cctx->ctx_ufunc->uf_flags & FC_OBJECT)
 			&& STRNCMP(name, "this", 4) == 0)))
 	    || script_var_exists(name, len, cctx, NULL) == OK
-	    || class_member_index(name, len, cctx) >= 0
+	    || class_member_index(name, len, NULL, cctx) >= 0
 	    || find_imported(name, len, FALSE) != NULL;
 }
 
@@ -376,9 +354,6 @@ check_defined(
     if (len == 1 && *p == '_')
 	return OK;
 
-    if (class_member_index(p, len, cctx) >= 0)
-	return OK;
-
     if (script_var_exists(p, len, cctx, cstack) == OK)
     {
 	if (is_arg)
@@ -388,6 +363,15 @@ check_defined(
 	return FAIL;
     }
 
+    if (class_member_index(p, len, NULL, cctx) >= 0)
+    {
+	if (is_arg)
+	    semsg(_(e_argument_already_declared_in_class_str), p);
+	else
+	    semsg(_(e_variable_already_declared_in_class_str), p);
+	return FAIL;
+    }
+
     p[len] = NUL;
     if ((cctx != NULL
 		&& (lookup_local(p, len, NULL, cctx) == OK
@@ -1592,8 +1576,14 @@ compile_lhs(
 		}
 	    }
 	    else if ((lhs->lhs_classmember_idx = class_member_index(
-				       var_start, lhs->lhs_varlen, cctx)) >= 0)
+				 var_start, lhs->lhs_varlen, NULL, cctx)) >= 0)
 	    {
+		if (is_decl)
+		{
+		    semsg(_(e_variable_already_declared_in_class_str),
+								lhs->lhs_name);
+		    return FAIL;
+		}
 		lhs->lhs_dest = dest_class_member;
 		lhs->lhs_class = cctx->ctx_ufunc->uf_class;
 	    }
@@ -2264,7 +2254,7 @@ compile_assignment(
     CLEAR_FIELD(lhs);
     long	start_lnum = SOURCING_LNUM;
 
-    int		has_arg_is_set_prefix = STRNCMP(arg, "ifargisset ", 11) == 0;
+    int	has_arg_is_set_prefix = STRNCMP(arg, "ifargisset ", 11) == 0;
     if (has_arg_is_set_prefix)
     {
 	arg += 11;