Skip to content

Commit 9239ead

Browse files
yegappanchrisbra
authored andcommitted
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 <[email protected]> Signed-off-by: Christian Brabandt <[email protected]>
1 parent 4de931d commit 9239ead

8 files changed

Lines changed: 57 additions & 4 deletions

File tree

runtime/doc/tags

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4618,6 +4618,8 @@ E143 autocmd.txt /*E143*
46184618
E1432 vim9.txt /*E1432*
46194619
E1433 vim9.txt /*E1433*
46204620
E1434 vim9.txt /*E1434*
4621+
E1435 vim9class.txt /*E1435*
4622+
E1436 vim9class.txt /*E1436*
46214623
E144 various.txt /*E144*
46224624
E145 starting.txt /*E145*
46234625
E146 change.txt /*E146*

runtime/doc/vim9class.txt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
*vim9class.txt* For Vim version 9.1. Last change: 2025 Apr 21
1+
*vim9class.txt* For Vim version 9.1. Last change: 2025 Jul 24
22

33

44
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -584,6 +584,8 @@ protected object methods, class variables and class methods.
584584
An interface can extend another interface using "extends". The sub-interface
585585
inherits all the instance variables and methods from the super interface.
586586

587+
An interface cannot be defined inside a function. *E1436*
588+
587589
==============================================================================
588590

589591
6. More class details *Vim9-class* *Class* *class*
@@ -971,7 +973,7 @@ of that class. Unlike typical object instantiation with the |new()| method,
971973
enum instances cannot be created this way.
972974

973975
An enum can only be defined in a |Vim9| script file. *E1414*
974-
An enum cannot be defined inside a function.
976+
An enum cannot be defined inside a function. *E1435*
975977

976978
*E1415*
977979
An enum name must start with an uppercase letter. The name of an enum value

src/errors.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3630,8 +3630,12 @@ EXTERN char e_concrete_method_str_override_with_generic_method_in_class_str[]
36303630
INIT(= N_("E1433: Overriding concrete method \"%s\" in class \"%s\" with a generic method"));
36313631
EXTERN char e_generic_method_str_type_arguments_mismatch_in_class_str[]
36323632
INIT(= N_("E1434: Mismatched number of type variables for generic method \"%s\" in class \"%s\""));
3633+
EXTERN char e_enum_can_only_be_used_in_script[]
3634+
INIT(= N_("E1435: Enum can only be used in a script"));
3635+
EXTERN char e_interface_can_only_be_used_in_script[]
3636+
INIT(= N_("E1436: Interface can only be used in a script"));
36333637
#endif
3634-
// E1435 - E1499 unused (reserved for Vim9 class support)
3638+
// E1437 - E1499 unused (reserved for Vim9 class support)
36353639
EXTERN char e_cannot_mix_positional_and_non_positional_str[]
36363640
INIT(= N_("E1500: Cannot mix positional and non-positional arguments: %s"));
36373641
EXTERN char e_fmt_arg_nr_unused_str[]

src/po/vim.pot

Lines changed: 7 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/testdir/test_vim9_class.vim

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13168,4 +13168,18 @@ func Test_class_selfref_gc()
1316813168
call v9.CheckSourceSuccess(lines)
1316913169
endfunc
1317013170

13171+
" Test for defining an interface in a function
13172+
def Test_interface_defined_in_function()
13173+
var lines =<< trim END
13174+
vim9script
13175+
def Fn()
13176+
var x = 1
13177+
interface Foo
13178+
endinterface
13179+
enddef
13180+
defcompile
13181+
END
13182+
v9.CheckScriptFailure(lines, 'E1436: Interface can only be used in a script', 2)
13183+
enddef
13184+
1317113185
" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker

src/testdir/test_vim9_enum.vim

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1664,4 +1664,19 @@ func Test_class_selfref_gc()
16641664
call v9.CheckSourceSuccess(lines)
16651665
endfunc
16661666

1667+
" Test for defining an enum in a function
1668+
def Test_enum_defined_in_function()
1669+
var lines =<< trim END
1670+
vim9script
1671+
def Fn()
1672+
var x = 1
1673+
enum Foo
1674+
Red,
1675+
endenum
1676+
enddef
1677+
defcompile
1678+
END
1679+
v9.CheckScriptFailure(lines, 'E1435: Enum can only be used in a script', 2)
1680+
enddef
1681+
16671682
" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker

src/version.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -719,6 +719,8 @@ static char *(features[]) =
719719

720720
static int included_patches[] =
721721
{ /* Add new patch number below this line */
722+
/**/
723+
1586,
722724
/**/
723725
1585,
724726
/**/

src/vim9compile.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4750,6 +4750,14 @@ compile_def_function_body(
47504750
emsg(_(e_class_can_only_be_used_in_script));
47514751
return FAIL;
47524752

4753+
case CMD_enum:
4754+
emsg(_(e_enum_can_only_be_used_in_script));
4755+
return FAIL;
4756+
4757+
case CMD_interface:
4758+
emsg(_(e_interface_can_only_be_used_in_script));
4759+
return FAIL;
4760+
47534761
case CMD_type:
47544762
emsg(_(e_type_can_only_be_used_in_script));
47554763
return FAIL;

0 commit comments

Comments
 (0)