diff options
author | h-east <h.east.727@gmail.com> | 2023-09-28 22:18:19 +0200 |
---|---|---|
committer | Christian Brabandt <cb@256bit.org> | 2023-09-28 22:18:19 +0200 |
commit | db38552dcdc7460459df8bf5cf02666256045308 (patch) | |
tree | 79c3631e1c83ad547356bea130ac9e247216dc87 | |
parent | 03ca4002c1dcd34c4b17fe4a491b02d77ec2c887 (diff) |
patch 9.0.1948: Vim9: object variable "this." should only be used in constructorv9.0.1948
Problem: Vim9: object variable "this." should only be used in
constructor
Solution: Disallow to this in normal object methods (other than
constructors)
closes: #13152
closes: #13212
Signed-off-by: Christian Brabandt <cb@256bit.org>
Co-authored-by: h-east <h.east.727@gmail.com>
-rw-r--r-- | runtime/doc/tags | 1 | ||||
-rw-r--r-- | runtime/doc/vim9class.txt | 3 | ||||
-rw-r--r-- | src/errors.h | 4 | ||||
-rw-r--r-- | src/testdir/test_vim9_class.vim | 11 | ||||
-rw-r--r-- | src/userfunc.c | 10 | ||||
-rw-r--r-- | src/version.c | 2 |
6 files changed, 29 insertions, 2 deletions
diff --git a/runtime/doc/tags b/runtime/doc/tags index 918e767721..13baf8fd17 100644 --- a/runtime/doc/tags +++ b/runtime/doc/tags @@ -4483,6 +4483,7 @@ E1387 vim9class.txt /*E1387* E1388 vim9class.txt /*E1388* E1389 vim9class.txt /*E1389* E139 message.txt /*E139* +E1390 vim9class.txt /*E1390* E140 message.txt /*E140* E1400 builtin.txt /*E1400* E1401 builtin.txt /*E1401* diff --git a/runtime/doc/vim9class.txt b/runtime/doc/vim9class.txt index b230cb8007..7b9f8b4a6c 100644 --- a/runtime/doc/vim9class.txt +++ b/runtime/doc/vim9class.txt @@ -216,7 +216,8 @@ see this pattern: > this.col = col enddef endclass - +< + *E1390* Not only is this text you need to write, it also has the type of each variables twice. Since this is so common a shorter way to write new() is provided: > diff --git a/src/errors.h b/src/errors.h index 7260c30cbf..baf36d5e4a 100644 --- a/src/errors.h +++ b/src/errors.h @@ -3529,6 +3529,8 @@ EXTERN char e_public_keyword_not_supported_for_method[] INIT(= N_("E1388: Public keyword not supported for a method")); EXTERN char e_missing_name_after_implements[] INIT(= N_("E1389: Missing name after implements")); +EXTERN char e_cannot_use_an_object_variable_except_with_the_new_method_str[] + INIT(= N_("E1390: Cannot use an object variable \"this.%s\" except with the \"new\" method")); #endif EXTERN char e_cannot_mix_positional_and_non_positional_str[] INIT(= N_("E1400: Cannot mix positional and non-positional arguments: %s")); @@ -3544,4 +3546,4 @@ EXTERN char e_invalid_format_specifier_str[] INIT(= N_("E1405: Invalid format specifier: %s")); EXTERN char e_aptypes_is_null_nr_str[] INIT(= "E1408: Internal error: ap_types or ap_types[idx] is NULL: %d: %s"); -// E1390 - E1399 unused +// E1391 - E1399 unused diff --git a/src/testdir/test_vim9_class.vim b/src/testdir/test_vim9_class.vim index 2fd66c937f..c272aab396 100644 --- a/src/testdir/test_vim9_class.vim +++ b/src/testdir/test_vim9_class.vim @@ -956,6 +956,17 @@ def Test_class_new_with_object_member() v9.CheckSourceFailure(lines, 'E1013:') lines =<< trim END + vim9script + + class C + this.str: string + def MethodA(this.str) + enddef + endclass + END + v9.CheckSourceFailure(lines, 'E1390: Cannot use an object variable "this.str" except with the "new" method') + + lines =<< trim END vim9script class C diff --git a/src/userfunc.c b/src/userfunc.c index e0c1d5f919..0f487fc120 100644 --- a/src/userfunc.c +++ b/src/userfunc.c @@ -320,6 +320,16 @@ get_function_args( ++p; char_u *argend = p; + // object variable this. can be used only in a constructor + if (STRNCMP(eap->arg, "new", 3) != 0) + { + c = *argend; + *argend = NUL; + semsg(_(e_cannot_use_an_object_variable_except_with_the_new_method_str), arg); + *argend = c; + break; + } + if (*skipwhite(p) == '=') { char_u *defval = skipwhite(skipwhite(p) + 1); diff --git a/src/version.c b/src/version.c index fb1b307138..49b406781c 100644 --- a/src/version.c +++ b/src/version.c @@ -700,6 +700,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1948, +/**/ 1947, /**/ 1946, |