diff src/vim9class.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 f36f920bad1a
children 65a2bae18b27
line wrap: on
line diff
--- a/src/vim9class.c
+++ b/src/vim9class.c
@@ -358,17 +358,19 @@ ex_class(exarg_T *eap)
 	    ufunc_T *uf = define_function(&ea, NULL, &lines_to_free, TRUE);
 	    ga_clear_strings(&lines_to_free);
 
-	    // TODO: how about errors?
-	    int is_new = STRNCMP(uf->uf_name, "new", 3) == 0;
-	    garray_T *fgap = has_static || is_new
-					       ? &classfunctions : &objmethods;
-	    if (uf != NULL && ga_grow(fgap, 1) == OK)
+	    if (uf != NULL)
 	    {
-		if (is_new)
-		    uf->uf_flags |= FC_NEW;
+		int is_new = STRNCMP(uf->uf_name, "new", 3) == 0;
+		garray_T *fgap = has_static || is_new
+					       ? &classfunctions : &objmethods;
+		if (ga_grow(fgap, 1) == OK)
+		{
+		    if (is_new)
+			uf->uf_flags |= FC_NEW;
 
-		((ufunc_T **)fgap->ga_data)[fgap->ga_len] = uf;
-		++fgap->ga_len;
+		    ((ufunc_T **)fgap->ga_data)[fgap->ga_len] = uf;
+		    ++fgap->ga_len;
+		}
 	    }
 	}
 
@@ -863,32 +865,30 @@ fail_after_eval:
 }
 
 /*
- * If "cctx->ctx_ufunc" indicates we are in a class, check if "name" is a class
- * member.  If it is then return TRUE and set "cl_ret" and "idx_ret".
+ * If "name[len]" is a class member in cctx->ctx_ufunc->uf_class return the
+ * index in class.class_class_members[].
+ * If "cl_ret" is not NULL set it to the class.
+ * Otherwise return -1;
  */
     int
-class_member_exists(
-	char_u	*name,
-	class_T	**cl_ret,
-	int	*idx_ret,
-	cctx_T	*cctx)
+class_member_index(char_u *name, size_t len, class_T **cl_ret, cctx_T *cctx)
 {
-    if (cctx->ctx_ufunc == NULL || cctx->ctx_ufunc->uf_class == NULL)
-	return FALSE;
+    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 idx = 0; idx < cl->class_class_member_count; ++idx)
+    for (int i = 0; i < cl->class_class_member_count; ++i)
     {
-	ocmember_T *m = &cl->class_class_members[idx];
-	if (STRCMP(m->ocm_name, name) == 0)
+	ocmember_T *m = &cl->class_class_members[i];
+	if (STRNCMP(name, m->ocm_name, len) == 0 && m->ocm_name[len] == NUL)
 	{
-	    *cl_ret = cl;
-	    *idx_ret = idx;
-	    return TRUE;
+	    if (cl_ret != NULL)
+		*cl_ret = cl;
+	    return i;
 	}
     }
-
-    return FALSE;
+    return -1;
 }
 
 /*