summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorh-east <h.east.727@gmail.com>2023-04-18 19:07:29 +0100
committerBram Moolenaar <Bram@vim.org>2023-04-18 19:07:29 +0100
commit61378a15425553cec1ec15f590e70ca50c7c34a8 (patch)
tree1e4118448d072ef45773ef6d10ea9e2326b39294
parent89f9ffbe810c4705439096d646681e734e353e3e (diff)
downloadvim-git-61378a15425553cec1ec15f590e70ca50c7c34a8.tar.gz
patch 9.0.1466: cannot use an object member name as a method argumentv9.0.1466
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.
-rw-r--r--src/testdir/test_vim9_class.vim6
-rw-r--r--src/version.c2
-rw-r--r--src/vim9class.c32
3 files changed, 22 insertions, 18 deletions
diff --git a/src/testdir/test_vim9_class.vim b/src/testdir/test_vim9_class.vim
index 4b6a730bb..a8f161d89 100644
--- 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
diff --git a/src/version.c b/src/version.c
index 12deed26e..595c265cf 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 */
/**/
+ 1466,
+/**/
1465,
/**/
1464,
diff --git a/src/vim9class.c b/src/vim9class.c
index 817435138..062de8fad 100644
--- 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;
}
}
}