You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@groovy.apache.org by pa...@apache.org on 2022/07/26 23:11:57 UTC

[groovy] branch master updated: GROOVY-10705: ToString order bug for super properties (also handle pseudo properties)

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

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


The following commit(s) were added to refs/heads/master by this push:
     new e51c322208 GROOVY-10705: ToString order bug for super properties (also handle pseudo properties)
e51c322208 is described below

commit e51c3222084cb6ddb828aaf02f9ce6fee83c1578
Author: Paul King <pa...@asert.com.au>
AuthorDate: Wed Jul 27 09:11:49 2022 +1000

    GROOVY-10705: ToString order bug for super properties (also handle pseudo properties)
---
 src/main/java/org/codehaus/groovy/ast/tools/BeanUtils.java | 10 ++++++++--
 .../java/org/codehaus/groovy/ast/tools/GeneralUtils.java   |  2 +-
 .../codehaus/groovy/transform/ToStringTransformTest.groovy | 14 ++++++++++++++
 3 files changed, 23 insertions(+), 3 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/ast/tools/BeanUtils.java b/src/main/java/org/codehaus/groovy/ast/tools/BeanUtils.java
index 19e0e0ab9e..ee4badd5fc 100644
--- a/src/main/java/org/codehaus/groovy/ast/tools/BeanUtils.java
+++ b/src/main/java/org/codehaus/groovy/ast/tools/BeanUtils.java
@@ -78,7 +78,7 @@ public class BeanUtils {
             result.addAll(getAllProperties(origType, type.getSuperClass(), names, includeSuperProperties, includeStatic, includePseudoGetters, includePseudoSetters, superFirst));
         }
         addExplicitProperties(type, result, names, includeStatic);
-        addPseudoProperties(origType, type, result, names, includeStatic, includePseudoGetters, includePseudoSetters);
+        addPseudoProperties(origType, type, result, names, includeStatic, includePseudoGetters, includePseudoSetters, includeSuperProperties);
         if (!superFirst && includeSuperProperties) {
             result.addAll(getAllProperties(origType, type.getSuperClass(), names, includeSuperProperties, includeStatic, includePseudoGetters, includePseudoSetters, superFirst));
         }
@@ -97,8 +97,14 @@ public class BeanUtils {
     }
 
     public static void addPseudoProperties(ClassNode origType, ClassNode cNode, List<PropertyNode> result, Set<String> names, boolean includeStatic, boolean includePseudoGetters, boolean includePseudoSetters) {
+        addPseudoProperties(origType, cNode, result, names, includeStatic, includePseudoGetters, includePseudoSetters, true);
+    }
+
+    public static void addPseudoProperties(ClassNode origType, ClassNode cNode, List<PropertyNode> result, Set<String> names, boolean includeStatic, boolean includePseudoGetters, boolean includePseudoSetters, boolean traverseSuperClasses) {
         if (!includePseudoGetters && !includePseudoSetters) return;
-        List<MethodNode> methods = cNode.getAllDeclaredMethods();
+        List<MethodNode> methods = traverseSuperClasses ?
+                cNode.getAllDeclaredMethods() :
+                cNode.getMethods();
         for (MethodNode mNode : methods) {
             if (!includeStatic && mNode.isStatic()) continue;
             if (hasAnnotation(mNode, INTERNAL_TYPE)) continue;
diff --git a/src/main/java/org/codehaus/groovy/ast/tools/GeneralUtils.java b/src/main/java/org/codehaus/groovy/ast/tools/GeneralUtils.java
index afd3c0786c..05817b5a98 100644
--- a/src/main/java/org/codehaus/groovy/ast/tools/GeneralUtils.java
+++ b/src/main/java/org/codehaus/groovy/ast/tools/GeneralUtils.java
@@ -535,7 +535,7 @@ public class GeneralUtils {
                 }
             }
             if (includePseudoGetters || includePseudoSetters) {
-                BeanUtils.addPseudoProperties(origType, cNode, result, names, includeStatic, includePseudoGetters, includePseudoSetters);
+                BeanUtils.addPseudoProperties(origType, cNode, result, names, includeStatic, includePseudoGetters, includePseudoSetters, traverseSuperClasses);
             }
         }
         if (includeFields) {
diff --git a/src/test/org/codehaus/groovy/transform/ToStringTransformTest.groovy b/src/test/org/codehaus/groovy/transform/ToStringTransformTest.groovy
index f34b7c4357..0cef941b6c 100644
--- a/src/test/org/codehaus/groovy/transform/ToStringTransformTest.groovy
+++ b/src/test/org/codehaus/groovy/transform/ToStringTransformTest.groovy
@@ -297,6 +297,20 @@ class ToStringTransformTest extends GroovyShellTestCase {
             new SportsPerson(first: 'John', last: 'Smith', title: 'Mr').toString()
         ''')
         assert toString == "SportsPerson(title:Mr, golfer:false, adult:true, cyclist:true)"
+        assertScript '''
+            class Base {
+                String getA() { 'base a' }
+                String getC() { 'base c' }
+            }
+
+            @groovy.transform.ToString(includeSuperProperties=true, allProperties=true)
+            class Child extends Base {
+                String getA() { 'child a' }
+                String getB() { 'child b' }
+            }
+
+            assert new Child().toString() == 'Child(child a, child b, base c)'
+        '''
     }
 
     void testSelfReference() {