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


The following commit(s) were added to refs/heads/GROOVY_4_0_X by this push:
     new 7b6f796bcd GROOVY-11674: Grails reproducible build (order trait 
methods)
7b6f796bcd is described below

commit 7b6f796bcda59a754edc7ca669250929d7dc00f7
Author: Paul King <[email protected]>
AuthorDate: Fri May 23 15:33:42 2025 +1000

    GROOVY-11674: Grails reproducible build (order trait methods)
---
 .../groovy/transform/trait/TraitComposer.java        | 20 +++++++++++++++++---
 1 file changed, 17 insertions(+), 3 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 e9e4a8f847..5e038a0a28 100644
--- a/src/main/java/org/codehaus/groovy/transform/trait/TraitComposer.java
+++ b/src/main/java/org/codehaus/groovy/transform/trait/TraitComposer.java
@@ -19,6 +19,7 @@
 package org.codehaus.groovy.transform.trait;
 
 import groovy.transform.CompileStatic;
+import org.apache.groovy.ast.tools.MethodNodeUtils;
 import org.codehaus.groovy.ast.ASTNode;
 import org.codehaus.groovy.ast.AnnotationNode;
 import org.codehaus.groovy.ast.ClassHelper;
@@ -53,6 +54,7 @@ import org.objectweb.asm.Opcodes;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.Comparator;
 import java.util.Iterator;
 import java.util.LinkedHashSet;
 import java.util.LinkedList;
@@ -123,7 +125,11 @@ public abstract class TraitComposer {
         ClassNode staticFieldHelperClassNode = helpers.getStaticFieldHelper();
         Map<String, ClassNode> genericsSpec = 
GenericsUtils.createGenericsSpec(trait, 
GenericsUtils.createGenericsSpec(cNode));
 
-        for (MethodNode methodNode : helperClassNode.getMethods()) {
+        List<MethodNode> hMethods = helperClassNode.getMethods();
+        if (!hMethods.isEmpty()) {
+            
hMethods.sort(Comparator.comparing(MethodNodeUtils::methodDescriptorWithoutReturnType));
+        }
+        for (MethodNode methodNode : hMethods) {
             String name = methodNode.getName();
             Parameter[] helperMethodParams = methodNode.getParameters();
             int nParams = helperMethodParams.length;
@@ -172,7 +178,11 @@ public abstract class TraitComposer {
             // implementation of methods
             List<MethodNode> declaredMethods = new LinkedList<>();
             int pos = 0; // keep direct getters at start but in declaration 
order
-            for (MethodNode declaredMethod : 
fieldHelperClassNode.getMethods()) {
+            List<MethodNode> fhMethods = fieldHelperClassNode.getMethods();
+            if (!fhMethods.isEmpty()) {
+                
fhMethods.sort(Comparator.comparing(MethodNodeUtils::methodDescriptorWithoutReturnType));
+            }
+            for (MethodNode declaredMethod : fhMethods) {
                 if 
(declaredMethod.getName().endsWith(Traits.DIRECT_GETTER_SUFFIX)) {
                     declaredMethods.add(pos++, declaredMethod);
                 } else {
@@ -181,7 +191,11 @@ public abstract class TraitComposer {
             }
 
             if (staticFieldHelperClassNode != null) {
-                for (MethodNode declaredMethod : 
staticFieldHelperClassNode.getMethods()) {
+                List<MethodNode> sfhMethods = 
staticFieldHelperClassNode.getMethods();
+                if (!sfhMethods.isEmpty()) {
+                    
sfhMethods.sort(Comparator.comparing(MethodNodeUtils::methodDescriptorWithoutReturnType));
+                }
+                for (MethodNode declaredMethod : sfhMethods) {
                     if 
(declaredMethod.getName().endsWith(Traits.DIRECT_GETTER_SUFFIX)) {
                         declaredMethods.add(pos++, declaredMethod);
                     } else {

Reply via email to