0
0
mirror of https://github.com/vim/vim.git synced 2025-10-13 06:54:15 -04:00

patch 9.0.1948: Vim9: object variable "this." should only be used in constructor

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>
This commit is contained in:
h-east
2023-09-28 22:18:19 +02:00
committed by Christian Brabandt
parent 03ca4002c1
commit db38552dcd
6 changed files with 29 additions and 2 deletions

View File

@@ -4483,6 +4483,7 @@ E1387 vim9class.txt /*E1387*
E1388 vim9class.txt /*E1388* E1388 vim9class.txt /*E1388*
E1389 vim9class.txt /*E1389* E1389 vim9class.txt /*E1389*
E139 message.txt /*E139* E139 message.txt /*E139*
E1390 vim9class.txt /*E1390*
E140 message.txt /*E140* E140 message.txt /*E140*
E1400 builtin.txt /*E1400* E1400 builtin.txt /*E1400*
E1401 builtin.txt /*E1401* E1401 builtin.txt /*E1401*

View File

@@ -216,7 +216,8 @@ see this pattern: >
this.col = col this.col = col
enddef enddef
endclass endclass
<
*E1390*
Not only is this text you need to write, it also has the type of each 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 variables twice. Since this is so common a shorter way to write new() is
provided: > provided: >

View File

@@ -3529,6 +3529,8 @@ EXTERN char e_public_keyword_not_supported_for_method[]
INIT(= N_("E1388: Public keyword not supported for a method")); INIT(= N_("E1388: Public keyword not supported for a method"));
EXTERN char e_missing_name_after_implements[] EXTERN char e_missing_name_after_implements[]
INIT(= N_("E1389: 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 #endif
EXTERN char e_cannot_mix_positional_and_non_positional_str[] EXTERN char e_cannot_mix_positional_and_non_positional_str[]
INIT(= N_("E1400: Cannot mix positional and non-positional arguments: %s")); 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")); INIT(= N_("E1405: Invalid format specifier: %s"));
EXTERN char e_aptypes_is_null_nr_str[] EXTERN char e_aptypes_is_null_nr_str[]
INIT(= "E1408: Internal error: ap_types or ap_types[idx] is NULL: %d: %s"); INIT(= "E1408: Internal error: ap_types or ap_types[idx] is NULL: %d: %s");
// E1390 - E1399 unused // E1391 - E1399 unused

View File

@@ -955,6 +955,17 @@ def Test_class_new_with_object_member()
END END
v9.CheckSourceFailure(lines, 'E1013:') 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 lines =<< trim END
vim9script vim9script

View File

@@ -320,6 +320,16 @@ get_function_args(
++p; ++p;
char_u *argend = 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) == '=') if (*skipwhite(p) == '=')
{ {
char_u *defval = skipwhite(skipwhite(p) + 1); char_u *defval = skipwhite(skipwhite(p) + 1);

View File

@@ -699,6 +699,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1948,
/**/ /**/
1947, 1947,
/**/ /**/