mirror of
https://github.com/vim/vim.git
synced 2025-09-25 03:54:15 -04:00
patch 9.1.0314: Vim9: Can define a class in a function
Problem: Vim9: Can define a class in a function (Doug Kearns) Solution: Give an error for a class defined in a function, slightly reword some public error messages (Yegappan Lakshmanan) fixes: #13184 fixes: #13326 closes: #14537 Signed-off-by: Yegappan Lakshmanan <yegappan@yahoo.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
committed by
Christian Brabandt
parent
122d068585
commit
c51578fed8
@@ -4534,6 +4534,7 @@ E1423 vim9class.txt /*E1423*
|
|||||||
E1424 vim9class.txt /*E1424*
|
E1424 vim9class.txt /*E1424*
|
||||||
E1425 vim9class.txt /*E1425*
|
E1425 vim9class.txt /*E1425*
|
||||||
E1426 vim9class.txt /*E1426*
|
E1426 vim9class.txt /*E1426*
|
||||||
|
E1429 vim9class.txt /*E1429*
|
||||||
E143 autocmd.txt /*E143*
|
E143 autocmd.txt /*E143*
|
||||||
E144 various.txt /*E144*
|
E144 various.txt /*E144*
|
||||||
E145 starting.txt /*E145*
|
E145 starting.txt /*E145*
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
*vim9.txt* For Vim version 9.1. Last change: 2024 Apr 12
|
*vim9.txt* For Vim version 9.1. Last change: 2024 Apr 13
|
||||||
|
|
||||||
|
|
||||||
VIM REFERENCE MANUAL by Bram Moolenaar
|
VIM REFERENCE MANUAL by Bram Moolenaar
|
||||||
@@ -1521,7 +1521,6 @@ Custom types can be defined with `:type`: >
|
|||||||
:type MyList list<string>
|
:type MyList list<string>
|
||||||
Custom types must start with a capital letter, to avoid name clashes with
|
Custom types must start with a capital letter, to avoid name clashes with
|
||||||
builtin types added later, similarly to user functions.
|
builtin types added later, similarly to user functions.
|
||||||
{not implemented yet}
|
|
||||||
|
|
||||||
And classes and interfaces can be used as types: >
|
And classes and interfaces can be used as types: >
|
||||||
:class MyClass
|
:class MyClass
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
*vim9class.txt* For Vim version 9.1. Last change: 2024 Apr 04
|
*vim9class.txt* For Vim version 9.1. Last change: 2024 Apr 13
|
||||||
|
|
||||||
|
|
||||||
VIM REFERENCE MANUAL by Bram Moolenaar
|
VIM REFERENCE MANUAL by Bram Moolenaar
|
||||||
@@ -593,7 +593,7 @@ A class is defined between `:class` and `:endclass`. The whole class is
|
|||||||
defined in one script file. It is not possible to add to a class later.
|
defined in one script file. It is not possible to add to a class later.
|
||||||
|
|
||||||
A class can only be defined in a |Vim9| script file. *E1316*
|
A class can only be defined in a |Vim9| script file. *E1316*
|
||||||
A class cannot be defined inside a function.
|
A class cannot be defined inside a function. *E1429*
|
||||||
|
|
||||||
It is possible to define more than one class in a script file. Although it
|
It is possible to define more than one class in a script file. Although it
|
||||||
usually is better to export only one main class. It can be useful to define
|
usually is better to export only one main class. It can be useful to define
|
||||||
|
10
src/errors.h
10
src/errors.h
@@ -3412,9 +3412,9 @@ EXTERN char e_invalid_class_variable_declaration_str[]
|
|||||||
EXTERN char e_invalid_type_for_object_variable_str[]
|
EXTERN char e_invalid_type_for_object_variable_str[]
|
||||||
INIT(= N_("E1330: Invalid type for object variable: %s"));
|
INIT(= N_("E1330: Invalid type for object variable: %s"));
|
||||||
EXTERN char e_public_must_be_followed_by_var_static_final_or_const[]
|
EXTERN char e_public_must_be_followed_by_var_static_final_or_const[]
|
||||||
INIT(= N_("E1331: Public must be followed by \"var\" or \"static\" or \"final\" or \"const\""));
|
INIT(= N_("E1331: public must be followed by \"var\" or \"static\" or \"final\" or \"const\""));
|
||||||
EXTERN char e_public_variable_name_cannot_start_with_underscore_str[]
|
EXTERN char e_public_variable_name_cannot_start_with_underscore_str[]
|
||||||
INIT(= N_("E1332: Public variable name cannot start with underscore: %s"));
|
INIT(= N_("E1332: public variable name cannot start with underscore: %s"));
|
||||||
EXTERN char e_cannot_access_protected_variable_str[]
|
EXTERN char e_cannot_access_protected_variable_str[]
|
||||||
INIT(= N_("E1333: Cannot access protected variable \"%s\" in class \"%s\""));
|
INIT(= N_("E1333: Cannot access protected variable \"%s\" in class \"%s\""));
|
||||||
// E1334 unused
|
// E1334 unused
|
||||||
@@ -3532,9 +3532,9 @@ EXTERN char e_class_method_str_accessible_only_using_class_str[]
|
|||||||
EXTERN char e_object_method_str_accessible_only_using_object_str[]
|
EXTERN char e_object_method_str_accessible_only_using_object_str[]
|
||||||
INIT(= N_("E1386: Object method \"%s\" accessible only using class \"%s\" object"));
|
INIT(= N_("E1386: Object method \"%s\" accessible only using class \"%s\" object"));
|
||||||
EXTERN char e_public_variable_not_supported_in_interface[]
|
EXTERN char e_public_variable_not_supported_in_interface[]
|
||||||
INIT(= N_("E1387: Public variable not supported in an interface"));
|
INIT(= N_("E1387: public variable not supported in an interface"));
|
||||||
EXTERN char e_public_keyword_not_supported_for_method[]
|
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[]
|
EXTERN char e_cannot_use_an_object_variable_except_with_the_new_method_str[]
|
||||||
@@ -3615,6 +3615,8 @@ EXTERN char e_enum_str_name_cannot_be_modified[]
|
|||||||
INIT(= N_("E1427: Enum \"%s\" name cannot be modified"));
|
INIT(= N_("E1427: Enum \"%s\" name cannot be modified"));
|
||||||
EXTERN char e_duplicate_enum_str[]
|
EXTERN char e_duplicate_enum_str[]
|
||||||
INIT(= N_("E1428: Duplicate enum value: %s"));
|
INIT(= N_("E1428: Duplicate enum value: %s"));
|
||||||
|
EXTERN char e_class_can_only_be_used_in_script[]
|
||||||
|
INIT(= N_("E1429: Class can only be used in a script"));
|
||||||
#endif
|
#endif
|
||||||
// E1429 - E1499 unused (reserved for Vim9 class support)
|
// E1429 - E1499 unused (reserved for Vim9 class support)
|
||||||
EXTERN char e_cannot_mix_positional_and_non_positional_str[]
|
EXTERN char e_cannot_mix_positional_and_non_positional_str[]
|
||||||
|
@@ -400,7 +400,7 @@ def Test_class_def_method()
|
|||||||
enddef
|
enddef
|
||||||
endclass
|
endclass
|
||||||
END
|
END
|
||||||
v9.CheckSourceFailure(lines, 'E1331: Public must be followed by "var" or "static"', 3)
|
v9.CheckSourceFailure(lines, 'E1388: public keyword not supported for a method', 3)
|
||||||
|
|
||||||
# Using the "public" keyword when defining a class method
|
# Using the "public" keyword when defining a class method
|
||||||
lines =<< trim END
|
lines =<< trim END
|
||||||
@@ -410,7 +410,7 @@ def Test_class_def_method()
|
|||||||
enddef
|
enddef
|
||||||
endclass
|
endclass
|
||||||
END
|
END
|
||||||
v9.CheckSourceFailure(lines, 'E1388: Public keyword not supported for a method', 3)
|
v9.CheckSourceFailure(lines, 'E1388: public keyword not supported for a method', 3)
|
||||||
|
|
||||||
# Using the "public" keyword when defining an object protected method
|
# Using the "public" keyword when defining an object protected method
|
||||||
lines =<< trim END
|
lines =<< trim END
|
||||||
@@ -420,7 +420,7 @@ def Test_class_def_method()
|
|||||||
enddef
|
enddef
|
||||||
endclass
|
endclass
|
||||||
END
|
END
|
||||||
v9.CheckSourceFailure(lines, 'E1331: Public must be followed by "var" or "static"', 3)
|
v9.CheckSourceFailure(lines, 'E1388: public keyword not supported for a method', 3)
|
||||||
|
|
||||||
# Using the "public" keyword when defining a class protected method
|
# Using the "public" keyword when defining a class protected method
|
||||||
lines =<< trim END
|
lines =<< trim END
|
||||||
@@ -430,7 +430,7 @@ def Test_class_def_method()
|
|||||||
enddef
|
enddef
|
||||||
endclass
|
endclass
|
||||||
END
|
END
|
||||||
v9.CheckSourceFailure(lines, 'E1388: Public keyword not supported for a method', 3)
|
v9.CheckSourceFailure(lines, 'E1388: public keyword not supported for a method', 3)
|
||||||
|
|
||||||
# Using a "def" keyword without an object method name
|
# Using a "def" keyword without an object method name
|
||||||
lines =<< trim END
|
lines =<< trim END
|
||||||
@@ -1191,7 +1191,7 @@ def Test_instance_variable_access()
|
|||||||
public var _val = 10
|
public var _val = 10
|
||||||
endclass
|
endclass
|
||||||
END
|
END
|
||||||
v9.CheckSourceFailure(lines, 'E1332: Public variable name cannot start with underscore: public var _val = 10', 3)
|
v9.CheckSourceFailure(lines, 'E1332: public variable name cannot start with underscore: public var _val = 10', 3)
|
||||||
|
|
||||||
lines =<< trim END
|
lines =<< trim END
|
||||||
vim9script
|
vim9script
|
||||||
@@ -1287,7 +1287,7 @@ def Test_instance_variable_access()
|
|||||||
public val = 1
|
public val = 1
|
||||||
endclass
|
endclass
|
||||||
END
|
END
|
||||||
v9.CheckSourceFailure(lines, 'E1331: Public must be followed by "var" or "static"', 3)
|
v9.CheckSourceFailure(lines, 'E1331: public must be followed by "var" or "static"', 3)
|
||||||
|
|
||||||
# Modify a instance variable using the class name in the script context
|
# Modify a instance variable using the class name in the script context
|
||||||
lines =<< trim END
|
lines =<< trim END
|
||||||
@@ -6537,7 +6537,7 @@ def Test_interface_with_unsupported_members()
|
|||||||
public static var num: number
|
public static var num: number
|
||||||
endinterface
|
endinterface
|
||||||
END
|
END
|
||||||
v9.CheckSourceFailure(lines, 'E1387: Public variable not supported in an interface', 3)
|
v9.CheckSourceFailure(lines, 'E1387: public variable not supported in an interface', 3)
|
||||||
|
|
||||||
lines =<< trim END
|
lines =<< trim END
|
||||||
vim9script
|
vim9script
|
||||||
@@ -6545,7 +6545,7 @@ def Test_interface_with_unsupported_members()
|
|||||||
public static var num: number
|
public static var num: number
|
||||||
endinterface
|
endinterface
|
||||||
END
|
END
|
||||||
v9.CheckSourceFailure(lines, 'E1387: Public variable not supported in an interface', 3)
|
v9.CheckSourceFailure(lines, 'E1387: public variable not supported in an interface', 3)
|
||||||
|
|
||||||
lines =<< trim END
|
lines =<< trim END
|
||||||
vim9script
|
vim9script
|
||||||
@@ -10625,4 +10625,17 @@ def Test_abstract_method_defcompile()
|
|||||||
v9.CheckScriptFailure(lines, 'E476: Invalid command: pass', 1)
|
v9.CheckScriptFailure(lines, 'E476: Invalid command: pass', 1)
|
||||||
enddef
|
enddef
|
||||||
|
|
||||||
|
" Test for defining a class in a function
|
||||||
|
def Test_class_definition_in_a_function()
|
||||||
|
var lines =<< trim END
|
||||||
|
vim9script
|
||||||
|
def Foo()
|
||||||
|
class A
|
||||||
|
endclass
|
||||||
|
enddef
|
||||||
|
defcompile
|
||||||
|
END
|
||||||
|
v9.CheckScriptFailure(lines, 'E1429: Class can only be used in a script', 1)
|
||||||
|
enddef
|
||||||
|
|
||||||
" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
|
" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
|
||||||
|
@@ -704,6 +704,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 */
|
||||||
|
/**/
|
||||||
|
314,
|
||||||
/**/
|
/**/
|
||||||
313,
|
313,
|
||||||
/**/
|
/**/
|
||||||
|
@@ -2080,6 +2080,12 @@ early_ret:
|
|||||||
has_public = TRUE;
|
has_public = TRUE;
|
||||||
p = skipwhite(line + 6);
|
p = skipwhite(line + 6);
|
||||||
|
|
||||||
|
if (STRNCMP(p, "def", 3) == 0)
|
||||||
|
{
|
||||||
|
emsg(_(e_public_keyword_not_supported_for_method));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if (STRNCMP(p, "var", 3) != 0 && STRNCMP(p, "static", 6) != 0
|
if (STRNCMP(p, "var", 3) != 0 && STRNCMP(p, "static", 6) != 0
|
||||||
&& STRNCMP(p, "final", 5) != 0 && STRNCMP(p, "const", 5) != 0)
|
&& STRNCMP(p, "final", 5) != 0 && STRNCMP(p, "const", 5) != 0)
|
||||||
{
|
{
|
||||||
|
@@ -4028,10 +4028,13 @@ compile_def_function(
|
|||||||
line = (char_u *)"";
|
line = (char_u *)"";
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case CMD_class:
|
||||||
|
emsg(_(e_class_can_only_be_used_in_script));
|
||||||
|
goto erret;
|
||||||
|
|
||||||
case CMD_type:
|
case CMD_type:
|
||||||
emsg(_(e_type_can_only_be_used_in_script));
|
emsg(_(e_type_can_only_be_used_in_script));
|
||||||
goto erret;
|
goto erret;
|
||||||
break;
|
|
||||||
|
|
||||||
case CMD_global:
|
case CMD_global:
|
||||||
if (check_global_and_subst(ea.cmd, p) == FAIL)
|
if (check_global_and_subst(ea.cmd, p) == FAIL)
|
||||||
|
Reference in New Issue
Block a user