]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.1.1541: Vim9: error when last enum value ends with a comma v9.1.1541
authorYegappan Lakshmanan <yegappan@yahoo.com>
Mon, 14 Jul 2025 19:27:34 +0000 (21:27 +0200)
committerChristian Brabandt <cb@256bit.org>
Mon, 14 Jul 2025 19:27:34 +0000 (21:27 +0200)
Problem:  Vim9: error when last enum value ends with a comma
Solution: Allow trailing commas in enum values (Yegappan Lakshmanan).

closes: #17744

Signed-off-by: Yegappan Lakshmanan <yegappan@yahoo.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
src/testdir/test_vim9_enum.vim
src/version.c
src/vim9class.c

index d2ccb77cf4a9a291222c692ca6132d2f0afa3f1f..49976e6d8b53e57ff6cdad3d4f49f18730df5068 100644 (file)
@@ -838,6 +838,25 @@ def Test_enum_values()
   END
   v9.CheckSourceSuccess(lines)
 
+  lines =<< trim END
+    vim9script
+    enum Car
+      Honda,
+      Ford,
+    endenum
+    assert_equal([Car.Honda, Car.Ford], Car.values)
+  END
+  v9.CheckSourceSuccess(lines)
+
+  lines =<< trim END
+    vim9script
+    enum Car
+      Honda, Ford,
+    endenum
+    assert_equal([Car.Honda, Car.Ford], Car.values)
+  END
+  v9.CheckSourceSuccess(lines)
+
   # empty enum
   lines =<< trim END
     vim9script
@@ -863,7 +882,7 @@ def Test_enum_values()
       Red,
       Blue
       static def GetValues(): list<A>
-       return values
+        return values
       enddef
     endenum
     assert_equal([A.Red, A.Blue], A.GetValues())
@@ -1050,6 +1069,34 @@ def Test_enum_refcount()
     assert_equal(4, test_refcount(Star.Orion))
   END
   v9.CheckSourceSuccess(lines)
+
+  lines =<< trim END
+    vim9script
+    enum Star
+      Gemini,
+      Orion,
+    endenum
+
+    assert_equal(3, test_refcount(Star))
+    assert_equal(2, test_refcount(Star.Gemini))
+    assert_equal(2, test_refcount(Star.Orion))
+
+    var x = [Star.Gemini]
+    assert_equal(3, test_refcount(Star))
+    assert_equal(3, test_refcount(Star.Gemini))
+
+    def Fn()
+      var y = [Star.Gemini, Star.Orion]
+      assert_equal(6, test_refcount(Star))
+      assert_equal(4, test_refcount(Star.Gemini))
+    enddef
+    Fn()
+    # The instruction in the compiled function adds an additional reference
+    # to the enum.
+    assert_equal(6, test_refcount(Star))
+    assert_equal(3, test_refcount(Star.Gemini))
+  END
+  v9.CheckSourceSuccess(lines)
 enddef
 
 " Test for defining an enum with additional object variables and methods
index a8c368feda8e4554b08214a25d9f5c5a58824749..37c2c9146af80f9f1c7a7d1ce4eedfb1cc395787 100644 (file)
@@ -719,6 +719,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1541,
 /**/
     1540,
 /**/
index a82cc13329b201ae658e5b504453b2b2b2dedf67..ea225c11d3f95348ce60b9f9c31705e7a7a7421d 100644 (file)
@@ -1855,6 +1855,7 @@ ex_class(exarg_T *eap)
     int                is_class = eap->cmdidx == CMD_class;
     int                is_abstract = eap->cmdidx == CMD_abstract;
     int                is_enum = eap->cmdidx == CMD_enum;
+    int                added_enum_values = FALSE;
     int                is_interface;
     long       start_lnum = SOURCING_LNUM;
     char_u     *arg = eap->arg;
@@ -2174,9 +2175,12 @@ early_ret:
                break;
 
            if (enum_end)
+           {
                // Add the enum "values" class variable.
                enum_add_values_member(cl, &classmembers, num_enum_values,
                                                        &type_list);
+               added_enum_values = TRUE;
+           }
            continue;
        }
 
@@ -2496,9 +2500,10 @@ early_ret:
 
     vim_free(theline);
 
-    if (success && is_enum && num_enum_values == 0)
+    if (success && is_enum && (num_enum_values == 0 || !added_enum_values))
        // Empty enum statement. Add an empty "values" class variable
-       success = enum_add_values_member(cl, &classmembers, 0, &type_list);
+       success = enum_add_values_member(cl, &classmembers, num_enum_values,
+                                                               &type_list);
 
     /*
      * Check a few things