This is an automated email from the ASF dual-hosted git repository. emilles pushed a commit to branch GROOVY-11743 in repository https://gitbox.apache.org/repos/asf/groovy.git
commit a7bab8bba9dab95bc19d44ea9fcbdfa847979ae2 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> {
