diff src/vim9class.c @ 33286:0c3553cfe22e v9.0.1909

patch 9.0.1909: Vim9: problem calling class method from other class Commit: https://github.com/vim/vim/commit/00cd18222ee1551c65228e9556c158624507fc7a Author: Yegappan Lakshmanan <yegappan@yahoo.com> Date: Mon Sep 18 19:56:49 2023 +0200 patch 9.0.1909: Vim9: problem calling class method from other class Problem: Vim9: problem calling class method from other class Solution: Fix this problem, fix readonly object access, update error messages. Calling a class method from another method without the class name prefix doesn't work properly. A readonly object variable is modifiable outside the class using a nested object assignment. Remove the unused E1338 error message. Update error messages. closes: #13116 Signed-off-by: Christian Brabandt <cb@256bit.org> Co-authored-by: Yegappan Lakshmanan <yegappan@yahoo.com>
author Christian Brabandt <cb@256bit.org>
date Mon, 18 Sep 2023 20:00:12 +0200
parents b5ed566262d3
children 4cb421ba3385
line wrap: on
line diff
--- a/src/vim9class.c
+++ b/src/vim9class.c
@@ -1592,7 +1592,7 @@ early_ret:
 
 	    if (!is_class)
 	    {
-		emsg(_(e_static_cannot_be_used_in_interface));
+		emsg(_(e_static_member_not_supported_in_interface));
 		break;
 	    }
 	    has_static = TRUE;
@@ -1623,7 +1623,8 @@ early_ret:
 	    if (!is_class && *varname == '_')
 	    {
 		// private variables are not supported in an interface
-		semsg(_(e_private_variable_str_in_interface), varname);
+		semsg(_(e_private_variable_not_supported_in_interface),
+			varname);
 		break;
 	    }
 
@@ -1689,7 +1690,8 @@ early_ret:
 		if (!is_class && *name == '_')
 		{
 		    // private variables are not supported in an interface
-		    semsg(_(e_private_method_str_in_interface), name);
+		    semsg(_(e_private_method_not_supported_in_interface),
+			    name);
 		    func_clear_free(uf, FALSE);
 		    break;
 		}
@@ -2010,8 +2012,7 @@ class_member_type(
     int		is_object,
     char_u	*name,
     char_u	*name_end,
-    int		*member_idx,
-    ocmember_T	**p_m)
+    int		*member_idx)
 {
     size_t	len = name_end - name;
     ocmember_T	*m;
@@ -2022,27 +2023,11 @@ class_member_type(
 								member_idx);
     if (m == NULL)
     {
-	char_u *varname = vim_strnsave(name, len);
-	if (varname != NULL)
-	{
-	    if (is_object && class_member_idx(cl, name, len) >= 0)
-		// A class variable with this name is present
-		semsg(_(e_class_member_str_accessible_only_inside_class_str),
-			varname, cl->class_name);
-	    else if (!is_object && object_member_idx(cl, name, len) >= 0)
-		// An instance variable with this name is present
-		semsg(_(e_object_member_str_accessible_only_using_object_str),
-			varname, cl->class_name);
-	    else
-		semsg(_(e_unknown_variable_str), varname);
-	}
-	vim_free(varname);
+	member_not_found_msg(cl, is_object ? VAR_OBJECT : VAR_CLASS, name,
+									len);
 	return &t_any;
     }
 
-    if (p_m != NULL)
-	*p_m = m;
-
     return m->ocm_type;
 }
 
@@ -2250,12 +2235,6 @@ class_object_index(
 	    semsg(_(e_cannot_access_private_member_str), m->ocm_name);
 	    return FAIL;
 	}
-	if ((cl->class_flags & CLASS_INTERFACE) != 0)
-	{
-	    semsg(_(e_interface_static_direct_access_str),
-		    cl->class_name, m->ocm_name);
-	    return FAIL;
-	}
 
 	typval_T *tv = &cl->class_members_tv[m_idx];
 	copy_tv(tv, rettv);