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/27 04:27:20 UTC

[groovy] branch GROOVY_4_0_X updated (f0c3dd5f03 -> 46bc5eedd7)

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

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


    from f0c3dd5f03 GROOVY-10674: add test case
     new 773db265dc GROOVY-10705: ToString order bug for super properties
     new d246372074 GROOVY-10705: ToString order bug for super properties (also handle pseudo properties)
     new e790d71922 GROOVY-10704: retain order of inherited methods
     new 46bc5eedd7 GROOVY-10704: retain order of field-related methods

The 4 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../org/apache/groovy/ast/tools/ClassNodeUtils.java    |  6 +++---
 .../java/org/codehaus/groovy/ast/tools/BeanUtils.java  | 10 ++++++++--
 .../org/codehaus/groovy/ast/tools/GeneralUtils.java    |  2 +-
 .../groovy/transform/ToStringASTTransformation.java    |  4 ++--
 .../codehaus/groovy/transform/trait/TraitComposer.java |  5 +++--
 .../groovy/transform/ToStringTransformTest.groovy      | 18 ++++++++++++++++--
 6 files changed, 33 insertions(+), 12 deletions(-)


[groovy] 01/04: GROOVY-10705: ToString order bug for super properties

Posted by pa...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 773db265dc517061276aca94575b8f232c9ffb19
Author: Paul King <pa...@asert.com.au>
AuthorDate: Tue Jul 26 22:29:12 2022 +1000

    GROOVY-10705: ToString order bug for super properties
---
 .../java/org/codehaus/groovy/transform/ToStringASTTransformation.java | 4 ++--
 src/test/org/codehaus/groovy/transform/ToStringTransformTest.groovy   | 4 ++--
 2 files changed, 4 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 759201e10d..d2c966573d 100644
--- a/src/main/java/org/codehaus/groovy/transform/ToStringASTTransformation.java
+++ b/src/main/java/org/codehaus/groovy/transform/ToStringASTTransformation.java
@@ -225,13 +225,13 @@ public class ToStringASTTransformation extends AbstractASTTransformation {
         body.addStatement(appendS(result, constX(className + delims[0])));
 
         Set<String> names = new HashSet<>();
+        List<PropertyNode> list = getAllProperties(names, cNode, cNode, true, includeFields, allProperties, false, false, true, false, allNames, false);
         List<PropertyNode> superList;
         if (includeSuperProperties || includeSuperFields) {
             superList = getAllProperties(names, cNode, cNode.getSuperClass(), includeSuperProperties, includeSuperFields, allProperties, false, true, true, true, allNames, false);
         } else {
-            superList = new ArrayList<PropertyNode>();
+            superList = new ArrayList<>();
         }
-        List<PropertyNode> list = getAllProperties(names, cNode, cNode,true, includeFields, allProperties, false, false, true, false, allNames, false);
         list.addAll(superList);
 
         for (PropertyNode pNode : list) {
diff --git a/src/test/org/codehaus/groovy/transform/ToStringTransformTest.groovy b/src/test/org/codehaus/groovy/transform/ToStringTransformTest.groovy
index 9625ab5cdf..f34b7c4357 100644
--- a/src/test/org/codehaus/groovy/transform/ToStringTransformTest.groovy
+++ b/src/test/org/codehaus/groovy/transform/ToStringTransformTest.groovy
@@ -269,7 +269,7 @@ class ToStringTransformTest extends GroovyShellTestCase {
             }
             new SportsPerson(first: 'John', last: 'Smith', title: 'Mr').toString()
         ''')
-        assert toString == "SportsPerson(title:Mr, cyclist:true, full:John Smith, golfer:false, senior:false, born:1975, adult:true)"
+        assert toString == "SportsPerson(title:Mr, golfer:false, adult:true, cyclist:true, full:John Smith, senior:false, born:1975)"
         // same again but with allProperties=false and with @CompileStatic for test coverage purposes
         toString = evaluate('''
             import groovy.transform.*
@@ -296,7 +296,7 @@ class ToStringTransformTest extends GroovyShellTestCase {
             }
             new SportsPerson(first: 'John', last: 'Smith', title: 'Mr').toString()
         ''')
-        assert toString == "SportsPerson(title:Mr, adult:true, cyclist:true, golfer:false)"
+        assert toString == "SportsPerson(title:Mr, golfer:false, adult:true, cyclist:true)"
     }
 
     void testSelfReference() {


[groovy] 04/04: GROOVY-10704: retain order of field-related methods

Posted by pa...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 46bc5eedd76b60400b75b88f72e8810795ad4a8e
Author: Paul King <pa...@asert.com.au>
AuthorDate: Wed Jul 27 14:08:49 2022 +1000

    GROOVY-10704: retain order of field-related methods
---
 src/main/java/org/codehaus/groovy/transform/trait/TraitComposer.java | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/transform/trait/TraitComposer.java b/src/main/java/org/codehaus/groovy/transform/trait/TraitComposer.java
index 135e82e31e..e13142502e 100644
--- a/src/main/java/org/codehaus/groovy/transform/trait/TraitComposer.java
+++ b/src/main/java/org/codehaus/groovy/transform/trait/TraitComposer.java
@@ -179,9 +179,10 @@ public abstract class TraitComposer {
             cNode.addInterface(fieldHelperClassNode);
             // implementation of methods
             List<MethodNode> declaredMethods = new LinkedList<>();
+            int pos = 0; // keep direct getters at start but in declaration order
             for (MethodNode declaredMethod : fieldHelperClassNode.getAllDeclaredMethods()) {
                 if (declaredMethod.getName().endsWith(Traits.DIRECT_GETTER_SUFFIX)) {
-                    declaredMethods.add(0, declaredMethod);
+                    declaredMethods.add(pos++, declaredMethod);
                 } else {
                     declaredMethods.add(declaredMethod);
                 }
@@ -190,7 +191,7 @@ public abstract class TraitComposer {
             if (staticFieldHelperClassNode != null) {
                 for (MethodNode declaredMethod : staticFieldHelperClassNode.getAllDeclaredMethods()) {
                     if (declaredMethod.getName().endsWith(Traits.DIRECT_GETTER_SUFFIX)) {
-                        declaredMethods.add(0, declaredMethod);
+                        declaredMethods.add(pos++, declaredMethod);
                     } else {
                         declaredMethods.add(declaredMethod);
                     }


[groovy] 03/04: GROOVY-10704: retain order of inherited methods

Posted by pa...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit e790d7192280c952348417868b9ac0c6afda6c68
Author: musketyr <vl...@orany.cz>
AuthorDate: Tue Jul 26 08:25:33 2022 +0200

    GROOVY-10704: retain order of inherited methods
    
    to ensure the generated trait classes are the same for the same source code
---
 src/main/java/org/apache/groovy/ast/tools/ClassNodeUtils.java | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/main/java/org/apache/groovy/ast/tools/ClassNodeUtils.java b/src/main/java/org/apache/groovy/ast/tools/ClassNodeUtils.java
index 510888e91b..0e968f14e2 100644
--- a/src/main/java/org/apache/groovy/ast/tools/ClassNodeUtils.java
+++ b/src/main/java/org/apache/groovy/ast/tools/ClassNodeUtils.java
@@ -36,8 +36,8 @@ import java.lang.reflect.Modifier;
 import java.util.ArrayDeque;
 import java.util.Arrays;
 import java.util.Collections;
-import java.util.HashMap;
 import java.util.HashSet;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -165,7 +165,7 @@ public class ClassNodeUtils {
     public static Map<String, MethodNode> getDeclaredMethodsFromSuper(final ClassNode cNode) {
         ClassNode parent = cNode.getSuperClass();
         if (parent == null) {
-            return new HashMap<>();
+            return new LinkedHashMap<>();
         }
         return parent.getDeclaredMethodsMap();
     }
@@ -197,7 +197,7 @@ public class ClassNodeUtils {
      * @return A map of methods
      */
     public static Map<String, MethodNode> getDeclaredMethodsFromInterfaces(final ClassNode cNode) {
-        Map<String, MethodNode> methodsMap = new HashMap<>();
+        Map<String, MethodNode> methodsMap = new LinkedHashMap<>();
         addDeclaredMethodsFromInterfaces(cNode, methodsMap);
         return methodsMap;
     }


[groovy] 02/04: GROOVY-10705: ToString order bug for super properties (also handle pseudo properties)

Posted by pa...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit d2463720740b1dec1059483ea9ad0ad04acd4c60
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() {