summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2023-01-13 17:36:49 +0000
committerBram Moolenaar <Bram@vim.org>2023-01-13 17:36:49 +0000
commitd40f00cb43019fb4d39b89f407f8b52e92f9e16f (patch)
tree1c8ebf9ad8a54b7d44944788e7da6091c91a288e
parent3213952966896ffb1d8fa186bcf8c43359fca0f0 (diff)
patch 9.0.1192: no error when class function argument shadows a memberv9.0.1192
Problem: No error when class function argument shadows a member. Solution: Check for shadowing.
-rw-r--r--src/testdir/test_vim9_class.vim13
-rw-r--r--src/version.c2
-rw-r--r--src/vim9class.c40
3 files changed, 53 insertions, 2 deletions
diff --git a/src/testdir/test_vim9_class.vim b/src/testdir/test_vim9_class.vim
index 4c10fefd9e..a6caad2fce 100644
--- a/src/testdir/test_vim9_class.vim
+++ b/src/testdir/test_vim9_class.vim
@@ -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
diff --git a/src/version.c b/src/version.c
index 248b4203c3..a2f363cd09 100644
--- 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 */
/**/
+ 1192,
+/**/
1191,
/**/
1190,
diff --git a/src/vim9class.c b/src/vim9class.c
index a1466be87d..3169f6220c 100644
--- a/src/vim9class.c
+++ b/src/vim9class.c
@@ -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)
{