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 cab5a66af365970eb6e0472dd48eca384dd98b9b
Author: Paul King <[email protected]>
AuthorDate: Thu Jul 17 23:16:53 2025 +1000

    GROOVY-11715: Grails reproducible build part 3: @DelegatesTo ordering
---
 .../java/org/codehaus/groovy/classgen/AsmClassGenerator.java   | 10 ++++++----
 .../codehaus/groovy/classgen/asm/TypeAnnotationsTest.groovy    |  2 +-
 2 files changed, 7 insertions(+), 5 deletions(-)

diff --git a/src/main/java/org/codehaus/groovy/classgen/AsmClassGenerator.java 
b/src/main/java/org/codehaus/groovy/classgen/AsmClassGenerator.java
index 8cff784bdc..5aea4908e2 100644
--- a/src/main/java/org/codehaus/groovy/classgen/AsmClassGenerator.java
+++ b/src/main/java/org/codehaus/groovy/classgen/AsmClassGenerator.java
@@ -130,6 +130,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 import java.util.Optional;
+import java.util.TreeMap;
 import java.util.function.Consumer;
 
 import static org.apache.groovy.ast.tools.ClassNodeUtils.getField;
@@ -2162,10 +2163,11 @@ public class AsmClassGenerator extends ClassGenerator {
      * @param av the visitor to use
      */
     private void visitAnnotationAttributes(final AnnotationNode an, final 
AnnotationVisitor av) {
-        Map<String, Object> constantAttrs = new HashMap<>();
-        Map<String, PropertyExpression> enumAttrs = new HashMap<>();
-        Map<String, Object> atAttrs = new HashMap<>();
-        Map<String, ListExpression> arrayAttrs = new HashMap<>();
+        // GROOVY-11715 TODO If we can determine what was causing the issues 
mentioned on that ticket, we should change these back to LinkedHashMap
+        Map<String, Object> constantAttrs = new TreeMap<>();
+        Map<String, PropertyExpression> enumAttrs = new TreeMap<>();
+        Map<String, Object> atAttrs = new TreeMap<>();
+        Map<String, ListExpression> arrayAttrs = new TreeMap<>();
 
         for (Map.Entry<String, Expression> member : 
an.getMembers().entrySet()) {
             String name = member.getKey();
diff --git 
a/src/test/groovy/org/codehaus/groovy/classgen/asm/TypeAnnotationsTest.groovy 
b/src/test/groovy/org/codehaus/groovy/classgen/asm/TypeAnnotationsTest.groovy
index aada167cc5..d48ebc7eb4 100644
--- 
a/src/test/groovy/org/codehaus/groovy/classgen/asm/TypeAnnotationsTest.groovy
+++ 
b/src/test/groovy/org/codehaus/groovy/classgen/asm/TypeAnnotationsTest.groovy
@@ -199,7 +199,7 @@ final class TypeAnnotationsTest extends 
AbstractBytecodeTestCase {
         assert bytecode.hasSequence([
             'public sizeZeroOrPositive(Ljava/util/List;)Z',
             '@Lnet/jqwik/api/Property;()',
-            '@Lnet/jqwik/api/constraints/IntRange;(min=0, max=10) : 
METHOD_FORMAL_PARAMETER 0, 0;',
+            '@Lnet/jqwik/api/constraints/IntRange;(max=10, min=0) : 
METHOD_FORMAL_PARAMETER 0, 0;',
             '// annotable parameter count: 1 (visible)',
             '@Lnet/jqwik/api/ForAll;() // parameter 0'
         ])

Reply via email to