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)' + ''' + } + }
