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

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


The following commit(s) were added to refs/heads/GROOVY_5_0_X by this push:
     new ce40108719 GROOVY-11743: super trait may not be transformed when 
creating helper
ce40108719 is described below

commit ce401087195e8a31b82ca26e95ed51895358955a
Author: Eric Milles <eric.mil...@thomsonreuters.com>
AuthorDate: Tue Aug 26 11:21:46 2025 -0500

    GROOVY-11743: super trait may not be transformed when creating helper
---
 .../transform/trait/TraitReceiverTransformer.java   |  4 +++-
 .../org/codehaus/groovy/transform/trait/Traits.java |  6 ++++--
 .../traitx/TraitASTTransformationTest.groovy        | 21 +++++++++++++++++++++
 3 files changed, 28 insertions(+), 3 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 53b3c731e6..acdb2dc6ce 100644
--- 
a/src/test/groovy/org/codehaus/groovy/transform/traitx/TraitASTTransformationTest.groovy
+++ 
b/src/test/groovy/org/codehaus/groovy/transform/traitx/TraitASTTransformationTest.groovy
@@ -562,6 +562,27 @@ final class TraitASTTransformationTest {
         """
     }
 
+    // GROOVY-11743
+    @CompileModesTest
+    void testTraitWithGenerics5(String mode) {
+        assertScript shell, """
+            $mode
+            trait Impl<T> implements Api<T> {
+                @Override T fun() { print("") }
+            }
+            $mode
+            trait Api<RT> {
+                abstract RT fun()
+            }
+            $mode
+            void test() {
+                def obj = new Impl<String>() {}
+                assert obj.fun() == null
+            }
+            test()
+        """
+    }
+
     @CompileModesTest
     void testTraitWithGenericProperty1(String mode) {
         assertScript shell, """

Reply via email to