1
0
forked from aniani/vim

patch 9.0.2182: Vim9: need a way to reserve future extension

Problem:  Vim9: need a way to reserve future extension
Solution: reserve double underscore prefix for future use
          (Yegappan Lakshmanan)

related: #13238
closes: #13742

Signed-off-by: Yegappan Lakshmanan <yegappan@yahoo.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
Yegappan Lakshmanan 2023-12-21 16:46:18 +01:00 committed by Christian Brabandt
parent cc944b1452
commit ff6f0d5c38
No known key found for this signature in database
GPG Key ID: F3F92DA383FDDE09
5 changed files with 53 additions and 12 deletions

View File

@ -364,6 +364,9 @@ super class. Depending on the class where the member is used the
corresponding class member will be used. The type of the class member in a
child class can be different from that in the super class.
The double underscore (__) prefix for a class or object method name is
reserved for future use.
*object-final-variable* *E1409*
The |:final| keyword can be used to make a class or object variable a
constant. Examples: >

View File

@ -9659,4 +9659,31 @@ def Test_const_class_object_variable()
v9.CheckSourceFailure(lines, 'E1022: Type or initialization required', 3)
enddef
" Test for using double underscore prefix in a class/object method name.
def Test_method_double_underscore_prefix()
# class method
var lines =<< trim END
vim9script
class A
static def __foo()
echo "foo"
enddef
endclass
defcompile
END
v9.CheckSourceFailure(lines, 'E1034: Cannot use reserved name __foo()', 3)
# object method
lines =<< trim END
vim9script
class A
def __foo()
echo "foo"
enddef
endclass
defcompile
END
v9.CheckSourceFailure(lines, 'E1034: Cannot use reserved name __foo()', 3)
enddef
" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker

View File

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

View File

@ -1774,6 +1774,15 @@ early_ret:
break;
}
if (*p == '_' && *(p + 1) == '_')
{
// double underscore prefix for a method name is currently
// reserved. This could be used in the future to support
// object methods called by Vim builtin functions.
semsg(_(e_cannot_use_reserved_name_str), p);
break;
}
CLEAR_FIELD(ea);
ea.cmd = line;
ea.arg = p;

View File

@ -2263,12 +2263,12 @@ compile_load_lhs_with_index(lhs_T *lhs, char_u *var_start, cctx_T *cctx)
// "this.value": load "this" object and get the value at index for an
// object or class member get the type of the member.
// Also for "obj.value".
char_u *dot = vim_strchr(var_start, '.');
if (dot == NULL)
{
semsg(_(e_missing_dot_after_object_str), lhs->lhs_name);
return FAIL;
}
char_u *dot = vim_strchr(var_start, '.');
if (dot == NULL)
{
semsg(_(e_missing_dot_after_object_str), lhs->lhs_name);
return FAIL;
}
class_T *cl = lhs->lhs_type->tt_class;
type_T *type = oc_member_type(cl, TRUE, dot + 1,
@ -2295,12 +2295,12 @@ compile_load_lhs_with_index(lhs_T *lhs, char_u *var_start, cctx_T *cctx)
else if (lhs->lhs_type->tt_type == VAR_CLASS)
{
// "<classname>.value": load class variable "classname.value"
char_u *dot = vim_strchr(var_start, '.');
if (dot == NULL)
{
check_type_is_value(lhs->lhs_type);
return FAIL;
}
char_u *dot = vim_strchr(var_start, '.');
if (dot == NULL)
{
check_type_is_value(lhs->lhs_type);
return FAIL;
}
class_T *cl = lhs->lhs_type->tt_class;
ocmember_T *m = class_member_lookup(cl, dot + 1,