Skip to content

Commit 048f259

Browse files
Fully Resolve generics to parameterized type name
1 parent a746886 commit 048f259

File tree

2 files changed

+22
-1
lines changed

2 files changed

+22
-1
lines changed

src/main/java/org/springframework/data/javapoet/TypeNames.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
*/
1616
package org.springframework.data.javapoet;
1717

18+
import java.util.Arrays;
19+
1820
import org.springframework.core.ResolvableType;
1921
import org.springframework.javapoet.ArrayTypeName;
2022
import org.springframework.javapoet.ClassName;
@@ -98,7 +100,8 @@ public static TypeName resolvedTypeName(ResolvableType resolvableType) {
98100
}
99101

100102
if (resolvableType.hasResolvableGenerics()) {
101-
return ParameterizedTypeName.get(resolvableType.toClass(), resolvableType.resolveGenerics());
103+
return ParameterizedTypeName.get(ClassName.get(resolvableType.toClass()),
104+
Arrays.stream(resolvableType.getGenerics()).map(TypeNames::resolvedTypeName).toArray(TypeName[]::new));
102105
}
103106

104107
return ClassName.get(resolvableType.toClass());

src/test/java/org/springframework/data/javapoet/TypeNamesUnitTests.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@
2727
import org.junit.jupiter.params.provider.MethodSource;
2828
import org.springframework.core.MethodParameter;
2929
import org.springframework.core.ResolvableType;
30+
import org.springframework.data.geo.Distance;
31+
import org.springframework.data.geo.GeoResult;
32+
import org.springframework.data.geo.Point;
3033
import org.springframework.javapoet.ClassName;
3134
import org.springframework.javapoet.ParameterizedTypeName;
3235
import org.springframework.javapoet.TypeName;
@@ -136,6 +139,20 @@ void resolvedTypeNamesForMethodParameters() {
136139
assertThat(TypeNames.typeName(resolvedReturnType)).extracting(TypeName::toString).isEqualTo("RT");
137140
assertThat(TypeNames.resolvedTypeName(resolvedReturnType)).isEqualTo(TypeName.get(Object.class));
138141
});
142+
143+
ReflectionUtils.doWithMethods(Concrete.class, method -> {
144+
if (!method.getName().contains("findByLocationNear")) {
145+
return;
146+
}
147+
148+
ResolvableType resolvedReturnType = ResolvableType.forMethodReturnType(method, Concrete.class);
149+
150+
assertThat(TypeNames.typeName(resolvedReturnType)).extracting(TypeName::toString).isEqualTo(
151+
"java.util.List<org.springframework.data.geo.GeoResult<org.springframework.data.javapoet.TypeNamesUnitTests.MyType>>");
152+
assertThat(TypeNames.resolvedTypeName(resolvedReturnType)).isEqualTo(ParameterizedTypeName
153+
.get(ClassName.get(java.util.List.class), ParameterizedTypeName.get(GeoResult.class, MyType.class)));
154+
});
155+
139156
}
140157

141158
interface GenericBase<T> {
@@ -147,6 +164,7 @@ interface GenericBase<T> {
147164

148165
interface Concrete extends GenericBase<MyType> {
149166

167+
List<GeoResult<MyType>> findByLocationNear(Point point, Distance maxDistance);
150168
}
151169

152170
static class MyType {}

0 commit comments

Comments
 (0)