diff options
author | Bram Moolenaar <Bram@vim.org> | 2023-01-13 17:36:49 +0000 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2023-01-13 17:36:49 +0000 |
commit | d40f00cb43019fb4d39b89f407f8b52e92f9e16f (patch) | |
tree | 1c8ebf9ad8a54b7d44944788e7da6091c91a288e | |
parent | 3213952966896ffb1d8fa186bcf8c43359fca0f0 (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.vim | 13 | ||||
-rw-r--r-- | src/version.c | 2 | ||||
-rw-r--r-- | src/vim9class.c | 40 |
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) { |