This is an automated email from the ASF dual-hosted git repository.

paulk pushed a commit to branch GROOVY_5_0_X
in repository https://gitbox.apache.org/repos/asf/groovy.git

commit 097b3463ce91d7f88037a8b1532bb21c9c9af05b
Author: Paul King <[email protected]>
AuthorDate: Tue Dec 2 11:19:51 2025 +1000

    GROOVY-11814: ToString transform should be enum aware
---
 .../groovy/transform/ToStringASTTransformation.java      | 13 ++++++++++---
 .../transform/CanonicalComponentsTransformTest.groovy    |  2 +-
 .../groovy/transform/ToStringTransformTest.groovy        | 16 ++++++++++++++++
 3 files changed, 27 insertions(+), 4 deletions(-)

diff --git 
a/src/main/java/org/codehaus/groovy/transform/ToStringASTTransformation.java 
b/src/main/java/org/codehaus/groovy/transform/ToStringASTTransformation.java
index c1ee64c85f..bc8424be19 100644
--- a/src/main/java/org/codehaus/groovy/transform/ToStringASTTransformation.java
+++ b/src/main/java/org/codehaus/groovy/transform/ToStringASTTransformation.java
@@ -54,6 +54,7 @@ import static 
org.apache.groovy.ast.tools.MethodCallUtils.toStringX;
 import static org.codehaus.groovy.ast.ClassHelper.make;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.assignS;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.callSuperX;
+import static org.codehaus.groovy.ast.tools.GeneralUtils.callThisX;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.callX;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.constX;
 import static org.codehaus.groovy.ast.tools.GeneralUtils.ctorX;
@@ -225,9 +226,15 @@ public class ToStringASTTransformation extends 
AbstractASTTransformation {
         final VariableExpression first = localVarX("$toStringFirst");
         body.addStatement(declS(first, constX(Boolean.TRUE)));
 
-        // <class_name>(
-        String className = (includePackage) ? cNode.getName() : 
cNode.getNameWithoutPackage();
-        body.addStatement(appendS(result, constX(className + delims[0])));
+        if (cNode.isEnum()) {
+            // <enum_name>(
+            body.addStatement(appendS(result, callThisX("name")));
+            body.addStatement(appendS(result, constX(delims[0])));
+        } else {
+            // <class_name>(
+            String className = (includePackage) ? cNode.getName() : 
cNode.getNameWithoutPackage();
+            body.addStatement(appendS(result, constX(className + delims[0])));
+        }
 
         Set<String> names = new HashSet<>();
         boolean includeProperties = true, includePseudoGetters = 
allProperties, includePseudoSetters = false, skipReadOnly = false, 
includeStatic = false;
diff --git 
a/src/test/groovy/org/codehaus/groovy/transform/CanonicalComponentsTransformTest.groovy
 
b/src/test/groovy/org/codehaus/groovy/transform/CanonicalComponentsTransformTest.groovy
index f06958c0c7..cac648b9a7 100644
--- 
a/src/test/groovy/org/codehaus/groovy/transform/CanonicalComponentsTransformTest.groovy
+++ 
b/src/test/groovy/org/codehaus/groovy/transform/CanonicalComponentsTransformTest.groovy
@@ -564,7 +564,7 @@ class CanonicalComponentsTransformTest extends 
GroovyShellTestCase {
 
     // GROOVY-4570
     void testToStringForEnums() {
-        assert Color.PURPLE.toString() == 
'org.codehaus.groovy.transform.Color(r:255, g:0, b:255)'
+        assert Color.PURPLE.toString() == 'PURPLE(r:255, g:0, b:255)'
     }
 
     void testCustomCopyConstructor_GROOVY7016() {
diff --git 
a/src/test/groovy/org/codehaus/groovy/transform/ToStringTransformTest.groovy 
b/src/test/groovy/org/codehaus/groovy/transform/ToStringTransformTest.groovy
index 0cef941b6c..f7fc61e60e 100644
--- a/src/test/groovy/org/codehaus/groovy/transform/ToStringTransformTest.groovy
+++ b/src/test/groovy/org/codehaus/groovy/transform/ToStringTransformTest.groovy
@@ -543,4 +543,20 @@ class ToStringTransformTest extends GroovyShellTestCase {
         '''
     }
 
+    // GROOVY-11814
+    void testToStringOnEnum() {
+        assertScript '''
+            import groovy.transform.*
+
+            @ToString(includeNames=true)
+            enum Foo {
+                Bar(prop: 'val1'), Baz(prop: 'val2')
+                final String prop
+            }
+
+            assert Foo.Bar.toString() == 'Bar(prop:val1)'
+            assert Foo.Baz.toString() == 'Baz(prop:val2)'
+        '''
+    }
+
 }

Reply via email to