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, """