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

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

commit c05793f64eaac776452c1c21223f63703ce276c4
Author: Eric Milles <[email protected]>
AuthorDate: Tue Aug 26 11:21:46 2025 -0500

    GROOVY-11743: super trait may not be transformed when creating helper
---
 .../codehaus/groovy/transform/trait/TraitReceiverTransformer.java   | 4 +++-
 src/main/java/org/codehaus/groovy/transform/trait/Traits.java       | 6 ++++--
 .../groovy/transform/traitx/TraitASTTransformationTest.groovy       | 2 +-
 3 files changed, 8 insertions(+), 4 deletions(-)

diff --git 
a/src/main/java/org/codehaus/groovy/transform/trait/TraitReceiverTransformer.java
 
b/src/main/java/org/codehaus/groovy/transform/trait/TraitReceiverTransformer.java
index a4a084b995..d0d9d21cde 100644
--- 
a/src/main/java/org/codehaus/groovy/transform/trait/TraitReceiverTransformer.java
+++ 
b/src/main/java/org/codehaus/groovy/transform/trait/TraitReceiverTransformer.java
@@ -320,7 +320,9 @@ class TraitReceiverTransformer extends 
ClassCodeExpressionTransformer {
         var traits = Traits.findTraits(traitClass); traits.remove(traitClass);
 
         for (ClassNode superTrait : traits) {
-            for (MethodNode methodNode : 
Traits.findHelper(superTrait).getDeclaredMethods(methodName)) {
+            ClassNode traitHelper = Traits.findHelper(superTrait);
+            if (traitHelper == null) continue; // GROOVY-11743: order issue
+            for (MethodNode methodNode : 
traitHelper.getDeclaredMethods(methodName)) {
                 if (methodNode.isPublic() && methodNode.isStatic()
                         // exclude public method with body as it's included in 
trait interface
                         && 
ClassHelper.isClassType(methodNode.getParameters()[0].getType())) {
diff --git a/src/main/java/org/codehaus/groovy/transform/trait/Traits.java 
b/src/main/java/org/codehaus/groovy/transform/trait/Traits.java
index ce078f3789..1d2dc7ec1b 100644
--- a/src/main/java/org/codehaus/groovy/transform/trait/Traits.java
+++ b/src/main/java/org/codehaus/groovy/transform/trait/Traits.java
@@ -142,7 +142,7 @@ public abstract class Traits {
                     staticFieldHelperClassNode = icn;
                 }
             } while (innerClasses.hasNext());
-        } else {
+        } else if (!trait.isPrimaryClassNode()) { // GROOVY-11743
             // precompiled trait
             try {
                 String helperClassName = Traits.helperClassName(trait);
@@ -159,7 +159,9 @@ public abstract class Traits {
             }
         }
         GenericsType[] typeArguments = trait.getGenericsTypes();
-        helperClassNode = GenericsUtils.makeClassSafe0(helperClassNode, 
typeArguments);
+        if (helperClassNode != null) {
+            helperClassNode = GenericsUtils.makeClassSafe0(helperClassNode, 
typeArguments);
+        }
         if (fieldHelperClassNode != null) {
             fieldHelperClassNode = 
GenericsUtils.makeClassSafe0(fieldHelperClassNode, typeArguments);
         }
diff --git 
a/src/test/groovy/org/codehaus/groovy/transform/traitx/TraitASTTransformationTest.groovy
 
b/src/test/groovy/org/codehaus/groovy/transform/traitx/TraitASTTransformationTest.groovy
index f1435791e8..acdb2dc6ce 100644
--- 
a/src/test/groovy/org/codehaus/groovy/transform/traitx/TraitASTTransformationTest.groovy
+++ 
b/src/test/groovy/org/codehaus/groovy/transform/traitx/TraitASTTransformationTest.groovy
@@ -568,7 +568,7 @@ final class TraitASTTransformationTest {
         assertScript shell, """
             $mode
             trait Impl<T> implements Api<T> {
-                @Override T fun() { null }
+                @Override T fun() { print("") }
             }
             $mode
             trait Api<RT> {

Reply via email to