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 <[email protected]>
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, """