]> granicus.if.org Git - vim/commitdiff
patch 9.0.1192: no error when class function argument shadows a member v9.0.1192
authorBram Moolenaar <Bram@vim.org>
Fri, 13 Jan 2023 17:36:49 +0000 (17:36 +0000)
committerBram Moolenaar <Bram@vim.org>
Fri, 13 Jan 2023 17:36:49 +0000 (17:36 +0000)
Problem:    No error when class function argument shadows a member.
Solution:   Check for shadowing.

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

index 4c10fefd9ebbd7422a1bb4380ebfb3d5c316e3e0..a6caad2fcec8061bf6bf8e59f37bc770744f97fd 100644 (file)
@@ -639,8 +639,17 @@ def Test_interface_basics()
         def Method(count: number)
       endinterface
   END
-  # TODO: this should give an error for "count" shadowing
-  v9.CheckScriptSuccess(lines)
+  v9.CheckScriptFailure(lines, 'E1340: Argument already declared in the class: count')
+
+  lines =<< trim END
+      vim9script
+
+      interface Some
+        this.value: number
+        def Method(value: number)
+      endinterface
+  END
+  v9.CheckScriptFailure(lines, 'E1340: Argument already declared in the class: value')
 
   lines =<< trim END
       vim9script
index 248b4203c32341f7ffbeed3294b75644da2b8e19..a2f363cd09f1e52d92c5a770920d1f0165ddcff7 100644 (file)
@@ -695,6 +695,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1192,
 /**/
     1191,
 /**/
index a1466be87d50721a052affe328cf9c49c0912085..3169f6220c5826e994dfc7d666d385ead3e5cc86 100644 (file)
@@ -699,6 +699,46 @@ early_ret:
        }
     }
 
+    if (success)
+    {
+       // Check no function argument name is used as an object/class member.
+       for (int loop = 1; loop <= 2 && success; ++loop)
+       {
+           garray_T *gap = loop == 1 ? &classfunctions : &objmethods;
+
+           for (int fi = 0; fi < gap->ga_len && success; ++fi)
+           {
+               ufunc_T *uf = ((ufunc_T **)gap->ga_data)[fi];
+
+               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)
+                   {
+                       // For a "new()" function "this.member" arguments are
+                       // OK.  TODO: check for the "this." prefix.
+                       if (STRNCMP(uf->uf_name, "new", 3) == NULL && 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)
+                           {
+                               success = FALSE;
+                               semsg(_(e_argument_already_declared_in_class_str),
+                                                                       aname);
+                               break;
+                           }
+                       }
+                   }
+               }
+           }
+       }
+    }
+
+
     class_T *cl = NULL;
     if (success)
     {