]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.1.1586: Vim9: can define an enum/interface in a function v9.1.1586
authorYegappan Lakshmanan <yegappan@yahoo.com>
Thu, 24 Jul 2025 17:14:51 +0000 (19:14 +0200)
committerChristian Brabandt <cb@256bit.org>
Thu, 24 Jul 2025 17:14:51 +0000 (19:14 +0200)
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>
runtime/doc/tags
runtime/doc/vim9class.txt
src/errors.h
src/po/vim.pot
src/testdir/test_vim9_class.vim
src/testdir/test_vim9_enum.vim
src/version.c
src/vim9compile.c

index 69811f999693244845d39cdc798617e78aa59977..0045bae800ef42396cfbcdcbbcb09943522aca77 100644 (file)
@@ -4618,6 +4618,8 @@ E143      autocmd.txt     /*E143*
 E1432  vim9.txt        /*E1432*
 E1433  vim9.txt        /*E1433*
 E1434  vim9.txt        /*E1434*
+E1435  vim9class.txt   /*E1435*
+E1436  vim9class.txt   /*E1436*
 E144   various.txt     /*E144*
 E145   starting.txt    /*E145*
 E146   change.txt      /*E146*
index d2f43aefb2b3aa9332b2833859693cb993d6a7a3..82c7573b30517931559784d2b67247e4c5210461 100644 (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
@@ -584,6 +584,8 @@ protected object methods, class variables and class methods.
 An interface can extend another interface using "extends".  The sub-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*
@@ -971,7 +973,7 @@ of that class.  Unlike typical object instantiation with the |new()| method,
 enum instances cannot be created this way.
 
 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*
 An enum name must start with an uppercase letter.  The name of an enum value
index 16a0fb3ed02955e28a33efcaa2969f8b0c039792..8bb5214929a83fa10201b223adaf27ac3dbeac7e 100644 (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"));
 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\""));
+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
-// 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[]
        INIT(= N_("E1500: Cannot mix positional and non-positional arguments: %s"));
 EXTERN char e_fmt_arg_nr_unused_str[]
index ca9cbdd1805508cdf59ebbdfbdfc1dd43352bd14..be30ce557dad24e9ad19af25779b315702ff4f77 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\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"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -8571,6 +8571,12 @@ msgid ""
 "class \"%s\""
 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
 msgid "E1500: Cannot mix positional and non-positional arguments: %s"
 msgstr ""
index 33dbc98b221a3960aca40741a2ca8f295d3caa6a..7e0a5100b05f89d6f0bac261cec87c39c290ae70 100644 (file)
@@ -13168,4 +13168,18 @@ func Test_class_selfref_gc()
   call v9.CheckSourceSuccess(lines)
 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
index 4f0cf640ea4de61671e92d742eb5595073a12c74..be4c8f6d5b399e1e1bb47ee1b29a856f5d737738 100644 (file)
@@ -1664,4 +1664,19 @@ func Test_class_selfref_gc()
   call v9.CheckSourceSuccess(lines)
 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
index c894f2f804c9cbf84bc6d930c01a5b4e5807993a..b0382651c5ce40c0a5171d2aedcd6bfc63ae1240 100644 (file)
@@ -719,6 +719,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1586,
 /**/
     1585,
 /**/
index 8b7064bd7b326b5818a8b6dd733568371dc179cb..f9998ceff2e53df3889356e6f85926492147af80 100644 (file)
@@ -4750,6 +4750,14 @@ compile_def_function_body(
                    emsg(_(e_class_can_only_be_used_in_script));
                    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:
                    emsg(_(e_type_can_only_be_used_in_script));
                    return FAIL;