]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.0.1466: cannot use an object member name as a method argument v9.0.1466
authorh-east <h.east.727@gmail.com>
Tue, 18 Apr 2023 18:07:29 +0000 (19:07 +0100)
committerBram Moolenaar <Bram@vim.org>
Tue, 18 Apr 2023 18:07:29 +0000 (19:07 +0100)
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.

src/testdir/test_vim9_class.vim
src/version.c
src/vim9class.c

index 4b6a730bbd7799cb916d502736ef5df446b296c9..a8f161d8980e31790f8a78fd0a3a739d40ef736c 100644 (file)
@@ -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
index 12deed26ef6a1e23cc6d9d21d3abcce1e2f8c1fe..595c265cff8f4bce4cb8dc85fcb6ea9cc2aa9bfc 100644 (file)
@@ -695,6 +695,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1466,
 /**/
     1465,
 /**/
index 8174351383bc608809c416c1bb5f2ea95ece69ef..062de8fad4fc2db3087468039e61e0a459a5af4a 100644 (file)
@@ -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;
                        }
                    }
                }