Skip to content

Commit 40debfa

Browse files
committed
GROOVY-12091: fix type of trait property placeholder in setter method
1 parent 742d920 commit 40debfa

2 files changed

Lines changed: 33 additions & 8 deletions

File tree

src/main/java/org/codehaus/groovy/transform/trait/TraitComposer.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -149,8 +149,8 @@ private static void applyTrait(final ClassNode trait, final ClassNode cNode, fin
149149

150150
for (int i = 1; i < nParams; i += 1) {
151151
Parameter parameter = helperMethodParams[i];
152-
ClassNode originType = parameter.getOriginType();
153-
ClassNode fixedType = GenericsUtils.correctToGenericsSpecRecurse(methodGenericsSpec, originType);
152+
ClassNode paramType = parameter.getOriginType();
153+
ClassNode fixedType = GenericsUtils.correctToGenericsSpecRecurse(methodGenericsSpec, paramType);
154154
Parameter newParam = new Parameter(fixedType, parameter.getName());
155155
List<AnnotationNode> copied = new LinkedList<>();
156156
List<AnnotationNode> notCopied = new LinkedList<>();
@@ -253,7 +253,7 @@ private static void applyTrait(final ClassNode trait, final ClassNode cNode, fin
253253
}
254254
if (getter) {
255255
// add field
256-
if (helperField!=null) {
256+
if (helperField != null) {
257257
List<AnnotationNode> copied = new LinkedList<>();
258258
List<AnnotationNode> notCopied = new LinkedList<>();
259259
GeneralUtils.copyAnnotatedNodeAnnotations(helperField, copied, notCopied);
@@ -281,8 +281,8 @@ private static void applyTrait(final ClassNode trait, final ClassNode cNode, fin
281281
if (getter) {
282282
newParams = Parameter.EMPTY_ARRAY;
283283
} else {
284-
ClassNode originType = methodNode.getParameters()[0].getOriginType();
285-
ClassNode fixedType = originType.isGenericsPlaceHolder()?ClassHelper.OBJECT_TYPE:GenericsUtils.correctToGenericsSpecRecurse(genericsSpec, originType);
284+
ClassNode paramType = methodNode.getParameters()[0].getOriginType();
285+
ClassNode fixedType = GenericsUtils.correctToGenericsSpecRecurse(genericsSpec, paramType); // GROOVY-12091
286286
newParams = new Parameter[]{new Parameter(fixedType, "val")};
287287
}
288288

@@ -447,7 +447,7 @@ private static void createSuperForwarder(final ClassNode targetNode, final Metho
447447
for (ClassNode node : interfaces) {
448448
if (Traits.isTrait(node)) {
449449
MethodNode method = node.getDeclaredMethod(name, forwarderParameters);
450-
if (method!=null) {
450+
if (method != null) {
451451
// a similar method exists, we need a super bridge
452452
// trait$super$foo(Class currentTrait, ...)
453453
traits.add(node);
@@ -477,8 +477,8 @@ private static void doCreateSuperForwarder(final ClassNode targetNode, final Met
477477
Parameter[] superForwarderParams = new Parameter[parameters.length];
478478
for (int i = 0; i < parameters.length; i++) {
479479
Parameter parameter = parameters[i];
480-
ClassNode originType = parameter.getOriginType();
481-
superForwarderParams[i] = new Parameter(GenericsUtils.correctToGenericsSpecRecurse(genericsSpec, originType), parameter.getName());
480+
ClassNode paramType = parameter.getOriginType();
481+
superForwarderParams[i] = new Parameter(GenericsUtils.correctToGenericsSpecRecurse(genericsSpec, paramType), parameter.getName());
482482
}
483483
for (int i = 0; i < interfacesToGenerateForwarderFor.length; i++) {
484484
final ClassNode current = interfacesToGenerateForwarderFor[i];

src/test/groovy/org/codehaus/groovy/transform/traitx/TraitASTTransformationTest.groovy

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -736,6 +736,31 @@ final class TraitASTTransformationTest {
736736
"""
737737
}
738738

739+
// GROOVY-12091
740+
@CompileModesTest
741+
void testTraitWithGenericProperty4(String mode) {
742+
assertScript shell, """
743+
$mode
744+
trait Foo<T extends Serializable> {
745+
T foo
746+
}
747+
$mode
748+
class Bar implements Serializable, Foo<Bar> {
749+
String name
750+
Bar() {
751+
setFoo(this)
752+
}
753+
}
754+
$mode
755+
void test() {
756+
def bar = new Bar(name:'Frank Grimes')
757+
assert bar.name == 'Frank Grimes'
758+
assert bar.foo === bar
759+
}
760+
test()
761+
"""
762+
}
763+
739764
@Test
740765
void testRuntimeTrait() {
741766
assertScript shell, '''

0 commit comments

Comments
 (0)