changeset 32270:d542423ef5c9 v9.0.1466

patch 9.0.1466: cannot use an object member name as a method argument Commit: https://github.com/vim/vim/commit/61378a15425553cec1ec15f590e70ca50c7c34a8 Author: h-east <h.east.727@gmail.com> Date: Tue Apr 18 19:07:29 2023 +0100 patch 9.0.1466: cannot use an object member name as a method argument Problem: Cannot use an object member name as a method argument. Solution: Do not give an error for using an object member name for a method argument. (Hirohito Higashi, closes #12241, closes #12225) Fix line number for other argument error.
author Bram Moolenaar <Bram@vim.org>
date Tue, 18 Apr 2023 20:15:04 +0200
parents 2ecf1b612ae7
children 119db7ded82b
files src/testdir/test_vim9_class.vim src/version.c src/vim9class.c
diffstat 3 files changed, 22 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- a/src/testdir/test_vim9_class.vim
+++ b/src/testdir/test_vim9_class.vim
@@ -995,7 +995,7 @@ def Test_interface_basics()
         def Method(count: number)
       endinterface
   END
-  v9.CheckScriptFailure(lines, 'E1340: Argument already declared in the class: count')
+  v9.CheckScriptFailure(lines, 'E1340: Argument already declared in the class: count', 5)
 
   lines =<< trim END
       vim9script
@@ -1005,7 +1005,9 @@ def Test_interface_basics()
         def Method(value: number)
       endinterface
   END
-  v9.CheckScriptFailure(lines, 'E1340: Argument already declared in the class: value')
+  # The argument name and the object member name are the same, but this is not a
+  # problem because object members are always accessed with the "this." prefix.
+  v9.CheckScriptSuccess(lines)
 
   lines =<< trim END
       vim9script
--- a/src/version.c
+++ b/src/version.c
@@ -696,6 +696,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1466,
+/**/
     1465,
 /**/
     1464,
--- a/src/vim9class.c
+++ b/src/vim9class.c
@@ -737,7 +737,9 @@ early_ret:
 
     if (success)
     {
-	// Check no function argument name is used as an object/class member.
+	// Check no function argument name is used as a class member.
+	// (Object members are always accessed with "this." prefix, so no need
+	// to check them.)
 	for (int loop = 1; loop <= 2 && success; ++loop)
 	{
 	    garray_T *gap = loop == 1 ? &classfunctions : &objmethods;
@@ -749,24 +751,22 @@ early_ret:
 		for (int i = 0; i < uf->uf_args.ga_len && success; ++i)
 		{
 		    char_u *aname = ((char_u **)uf->uf_args.ga_data)[i];
-		    for (int il = 1; il <= 2 && success; ++il)
+		    garray_T *mgap = &classmembers;
+
+		    for (int mi = 0; mi < mgap->ga_len; ++mi)
 		    {
-			// For a "new()" function "this.member" arguments are
-			// OK.  TODO: check for the "this." prefix.
-			if (STRNCMP(uf->uf_name, "new", 3) == 0 && il == 2)
-			    continue;
-			garray_T *mgap = il == 1 ? &classmembers : &objmembers;
-			for (int mi = 0; mi < mgap->ga_len; ++mi)
+			char_u *mname = ((ocmember_T *)mgap->ga_data + mi)
+								    ->ocm_name;
+			if (STRCMP(aname, mname) == 0)
 			{
-			    char_u *mname = ((ocmember_T *)mgap->ga_data
-							       + mi)->ocm_name;
-			    if (STRCMP(aname, mname) == 0)
-			    {
-				success = FALSE;
-				semsg(_(e_argument_already_declared_in_class_str),
+			    success = FALSE;
+
+			    if (uf->uf_script_ctx.sc_sid > 0)
+				SOURCING_LNUM = uf->uf_script_ctx.sc_lnum;
+
+			    semsg(_(e_argument_already_declared_in_class_str),
 									aname);
-				break;
-			    }
+			    break;
 			}
 		    }
 		}