mirror of
https://github.com/vim/vim.git
synced 2025-09-27 04:14:06 -04:00
patch 9.0.1821: Vim9 constructors are always static
Problem: Vim9 constructors are always static Solution: make the "static" keyword an error closes: #12945 Signed-off-by: Christian Brabandt <cb@256bit.org> Co-authored-by: Gianmaria Bajo <mg1979.git@gmail.com>
This commit is contained in:
committed by
Christian Brabandt
parent
2ac708b548
commit
4b9777a1df
@@ -315,6 +315,10 @@ as the first character in the method name: >
|
|||||||
OtherThing._Foo()
|
OtherThing._Foo()
|
||||||
enddef
|
enddef
|
||||||
endclass
|
endclass
|
||||||
|
<
|
||||||
|
*E1370*
|
||||||
|
Note that constructors cannot be declared as "static", because they always
|
||||||
|
are.
|
||||||
|
|
||||||
==============================================================================
|
==============================================================================
|
||||||
|
|
||||||
|
@@ -3493,6 +3493,8 @@ EXTERN char e_static_cannot_be_followed_by_this[]
|
|||||||
INIT(= N_("E1368: Static cannot be followed by \"this\" in a member name"));
|
INIT(= N_("E1368: Static cannot be followed by \"this\" in a member name"));
|
||||||
EXTERN char e_duplicate_member_str[]
|
EXTERN char e_duplicate_member_str[]
|
||||||
INIT(= N_("E1369: Duplicate member: %s"));
|
INIT(= N_("E1369: Duplicate member: %s"));
|
||||||
|
EXTERN char e_cannot_define_new_function_as_static[]
|
||||||
|
INIT(= N_("E1370: Cannot define a \"new\" function as static"));
|
||||||
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"));
|
||||||
EXTERN char e_fmt_arg_nr_unused_str[]
|
EXTERN char e_fmt_arg_nr_unused_str[]
|
||||||
@@ -3510,4 +3512,4 @@ EXTERN char e_member_str_type_mismatch_expected_str_but_got_str[]
|
|||||||
EXTERN char e_method_str_type_mismatch_expected_str_but_got_str[]
|
EXTERN char e_method_str_type_mismatch_expected_str_but_got_str[]
|
||||||
INIT(= N_("E1407: Member \"%s\": type mismatch, expected %s but got %s"));
|
INIT(= N_("E1407: Member \"%s\": type mismatch, expected %s but got %s"));
|
||||||
|
|
||||||
// E1368 - E1399 unused
|
// E1371 - E1399 unused
|
||||||
|
@@ -1317,6 +1317,18 @@ def Test_class_defcompile()
|
|||||||
END
|
END
|
||||||
v9.CheckScriptFailure(lines, 'E1012: Type mismatch; expected number but got string')
|
v9.CheckScriptFailure(lines, 'E1012: Type mismatch; expected number but got string')
|
||||||
|
|
||||||
|
lines =<< trim END
|
||||||
|
vim9script
|
||||||
|
|
||||||
|
class C
|
||||||
|
static def new()
|
||||||
|
enddef
|
||||||
|
endclass
|
||||||
|
|
||||||
|
defcompile C.new
|
||||||
|
END
|
||||||
|
v9.CheckScriptFailure(lines, 'E1370: Cannot define a "new" function as static')
|
||||||
|
|
||||||
# Trying to compile a function using a non-existing class variable
|
# Trying to compile a function using a non-existing class variable
|
||||||
lines =<< trim END
|
lines =<< trim END
|
||||||
vim9script
|
vim9script
|
||||||
|
@@ -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 */
|
||||||
|
/**/
|
||||||
|
1821,
|
||||||
/**/
|
/**/
|
||||||
1820,
|
1820,
|
||||||
/**/
|
/**/
|
||||||
|
@@ -535,6 +535,34 @@ is_duplicate_method(garray_T *fgap, char_u *name)
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Returns TRUE if the constructor is valid.
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
is_valid_constructor(ufunc_T *uf, int is_abstract, int has_static)
|
||||||
|
{
|
||||||
|
// Constructors are not allowed in abstract classes.
|
||||||
|
if (is_abstract)
|
||||||
|
{
|
||||||
|
emsg(_(e_cannot_define_new_function_in_abstract_class));
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
// A constructor is always static, no need to define it so.
|
||||||
|
if (has_static)
|
||||||
|
{
|
||||||
|
emsg(_(e_cannot_define_new_function_as_static));
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
// A return type should not be specified for the new()
|
||||||
|
// constructor method.
|
||||||
|
if (uf->uf_ret_type->tt_type != VAR_VOID)
|
||||||
|
{
|
||||||
|
emsg(_(e_cannot_use_a_return_type_with_new));
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Update the interface class lookup table for the member index on the
|
* Update the interface class lookup table for the member index on the
|
||||||
* interface to the member index in the class implementing the interface.
|
* interface to the member index in the class implementing the interface.
|
||||||
@@ -1188,25 +1216,13 @@ early_ret:
|
|||||||
{
|
{
|
||||||
char_u *name = uf->uf_name;
|
char_u *name = uf->uf_name;
|
||||||
int is_new = STRNCMP(name, "new", 3) == 0;
|
int is_new = STRNCMP(name, "new", 3) == 0;
|
||||||
if (is_new && is_abstract)
|
|
||||||
|
if (is_new && !is_valid_constructor(uf, is_abstract, has_static))
|
||||||
{
|
{
|
||||||
emsg(_(e_cannot_define_new_function_in_abstract_class));
|
|
||||||
success = FALSE;
|
|
||||||
func_clear_free(uf, FALSE);
|
func_clear_free(uf, FALSE);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (is_new)
|
|
||||||
{
|
|
||||||
// A return type should not be specified for the new()
|
|
||||||
// constructor method.
|
|
||||||
if (uf->uf_ret_type->tt_type != VAR_VOID)
|
|
||||||
{
|
|
||||||
emsg(_(e_cannot_use_a_return_type_with_new));
|
|
||||||
success = FALSE;
|
|
||||||
func_clear_free(uf, FALSE);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
garray_T *fgap = has_static || is_new
|
garray_T *fgap = has_static || is_new
|
||||||
? &classfunctions : &objmethods;
|
? &classfunctions : &objmethods;
|
||||||
// Check the name isn't used already.
|
// Check the name isn't used already.
|
||||||
|
Reference in New Issue
Block a user