0
0
mirror of https://github.com/vim/vim.git synced 2025-09-23 03:43:49 -04:00

patch 9.1.1586: Vim9: can define an enum/interface in a function

Problem:  Vim9: can define an enum/interface in a function
          (lacygoill)
Solution: Give an error when defining an enum or an interface inside a
          function (Yegappan Lakshmanan)

fixes: #17835
fixes: #17837
closes: #17837

Signed-off-by: Yegappan Lakshmanan <yegappan@yahoo.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
Yegappan Lakshmanan
2025-07-24 19:14:51 +02:00
committed by Christian Brabandt
parent 4de931daae
commit 9239eadc71
8 changed files with 57 additions and 4 deletions

View File

@@ -4618,6 +4618,8 @@ E143 autocmd.txt /*E143*
E1432 vim9.txt /*E1432* E1432 vim9.txt /*E1432*
E1433 vim9.txt /*E1433* E1433 vim9.txt /*E1433*
E1434 vim9.txt /*E1434* E1434 vim9.txt /*E1434*
E1435 vim9class.txt /*E1435*
E1436 vim9class.txt /*E1436*
E144 various.txt /*E144* E144 various.txt /*E144*
E145 starting.txt /*E145* E145 starting.txt /*E145*
E146 change.txt /*E146* E146 change.txt /*E146*

View File

@@ -1,4 +1,4 @@
*vim9class.txt* For Vim version 9.1. Last change: 2025 Apr 21 *vim9class.txt* For Vim version 9.1. Last change: 2025 Jul 24
VIM REFERENCE MANUAL by Bram Moolenaar VIM REFERENCE MANUAL by Bram Moolenaar
@@ -584,6 +584,8 @@ protected object methods, class variables and class methods.
An interface can extend another interface using "extends". The sub-interface An interface can extend another interface using "extends". The sub-interface
inherits all the instance variables and methods from the super interface. inherits all the instance variables and methods from the super interface.
An interface cannot be defined inside a function. *E1436*
============================================================================== ==============================================================================
6. More class details *Vim9-class* *Class* *class* 6. More class details *Vim9-class* *Class* *class*
@@ -971,7 +973,7 @@ of that class. Unlike typical object instantiation with the |new()| method,
enum instances cannot be created this way. enum instances cannot be created this way.
An enum can only be defined in a |Vim9| script file. *E1414* An enum can only be defined in a |Vim9| script file. *E1414*
An enum cannot be defined inside a function. An enum cannot be defined inside a function. *E1435*
*E1415* *E1415*
An enum name must start with an uppercase letter. The name of an enum value An enum name must start with an uppercase letter. The name of an enum value

View File

@@ -3630,8 +3630,12 @@ EXTERN char e_concrete_method_str_override_with_generic_method_in_class_str[]
INIT(= N_("E1433: Overriding concrete method \"%s\" in class \"%s\" with a generic method")); INIT(= N_("E1433: Overriding concrete method \"%s\" in class \"%s\" with a generic method"));
EXTERN char e_generic_method_str_type_arguments_mismatch_in_class_str[] EXTERN char e_generic_method_str_type_arguments_mismatch_in_class_str[]
INIT(= N_("E1434: Mismatched number of type variables for generic method \"%s\" in class \"%s\"")); INIT(= N_("E1434: Mismatched number of type variables for generic method \"%s\" in class \"%s\""));
EXTERN char e_enum_can_only_be_used_in_script[]
INIT(= N_("E1435: Enum can only be used in a script"));
EXTERN char e_interface_can_only_be_used_in_script[]
INIT(= N_("E1436: Interface can only be used in a script"));
#endif #endif
// E1435 - E1499 unused (reserved for Vim9 class support) // E1437 - 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[]
INIT(= N_("E1500: Cannot mix positional and non-positional arguments: %s")); INIT(= N_("E1500: Cannot mix positional and non-positional arguments: %s"));
EXTERN char e_fmt_arg_nr_unused_str[] EXTERN char e_fmt_arg_nr_unused_str[]

8
src/po/vim.pot generated
View File

@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-07-21 21:33+0200\n" "POT-Creation-Date: 2025-07-24 19:13+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -8571,6 +8571,12 @@ msgid ""
"class \"%s\"" "class \"%s\""
msgstr "" msgstr ""
msgid "E1435: Enum can only be used in a script"
msgstr ""
msgid "E1436: Interface can only be used in a script"
msgstr ""
#, c-format #, c-format
msgid "E1500: Cannot mix positional and non-positional arguments: %s" msgid "E1500: Cannot mix positional and non-positional arguments: %s"
msgstr "" msgstr ""

View File

@@ -13168,4 +13168,18 @@ func Test_class_selfref_gc()
call v9.CheckSourceSuccess(lines) call v9.CheckSourceSuccess(lines)
endfunc endfunc
" Test for defining an interface in a function
def Test_interface_defined_in_function()
var lines =<< trim END
vim9script
def Fn()
var x = 1
interface Foo
endinterface
enddef
defcompile
END
v9.CheckScriptFailure(lines, 'E1436: Interface can only be used in a script', 2)
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

View File

@@ -1664,4 +1664,19 @@ func Test_class_selfref_gc()
call v9.CheckSourceSuccess(lines) call v9.CheckSourceSuccess(lines)
endfunc endfunc
" Test for defining an enum in a function
def Test_enum_defined_in_function()
var lines =<< trim END
vim9script
def Fn()
var x = 1
enum Foo
Red,
endenum
enddef
defcompile
END
v9.CheckScriptFailure(lines, 'E1435: Enum can only be used in a script', 2)
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

View File

@@ -719,6 +719,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 */
/**/
1586,
/**/ /**/
1585, 1585,
/**/ /**/

View File

@@ -4750,6 +4750,14 @@ compile_def_function_body(
emsg(_(e_class_can_only_be_used_in_script)); emsg(_(e_class_can_only_be_used_in_script));
return FAIL; return FAIL;
case CMD_enum:
emsg(_(e_enum_can_only_be_used_in_script));
return FAIL;
case CMD_interface:
emsg(_(e_interface_can_only_be_used_in_script));
return FAIL;
case CMD_type: case CMD_type:
emsg(_(e_type_can_only_be_used_in_script)); emsg(_(e_type_can_only_be_used_in_script));
return FAIL; return FAIL;