Skip to content

Commit f58b99e

Browse files
Additional tests for arrays.
1 parent 52fc31e commit f58b99e

File tree

2 files changed

+85
-10
lines changed

2 files changed

+85
-10
lines changed

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

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
package org.springframework.data.javapoet;
1717

1818
import org.springframework.core.ResolvableType;
19+
import org.springframework.javapoet.ArrayTypeName;
20+
import org.springframework.javapoet.ClassName;
1921
import org.springframework.javapoet.ParameterizedTypeName;
2022
import org.springframework.javapoet.TypeName;
2123
import org.springframework.util.ClassUtils;
@@ -81,14 +83,25 @@ public static TypeName resolvedTypeName(ResolvableType resolvableType) {
8183
}
8284

8385
if (!resolvableType.hasGenerics()) {
84-
return TypeName.get(resolvableType.toClass());
86+
Class<?> resolvedType = resolvableType.toClass();
87+
if (!resolvableType.isArray()) {
88+
return TypeName.get(resolvedType);
89+
}
90+
91+
if (resolvedType.isArray()) {
92+
return TypeName.get(resolvedType);
93+
}
94+
if (resolvableType.isArray()) {
95+
return ArrayTypeName.of(resolvedType);
96+
}
97+
return TypeName.get(resolvedType);
8598
}
8699

87100
if (resolvableType.hasResolvableGenerics()) {
88101
return ParameterizedTypeName.get(resolvableType.toClass(), resolvableType.resolveGenerics());
89102
}
90103

91-
return TypeName.get(resolvableType.getType());
104+
return ClassName.get(resolvableType.toClass());
92105
}
93106

94107
/**

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

Lines changed: 70 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat;
1919

20+
import java.util.List;
2021
import java.util.Set;
2122
import java.util.stream.Stream;
2223

@@ -26,6 +27,7 @@
2627
import org.junit.jupiter.params.provider.MethodSource;
2728
import org.springframework.core.MethodParameter;
2829
import org.springframework.core.ResolvableType;
30+
import org.springframework.javapoet.ClassName;
2931
import org.springframework.javapoet.ParameterizedTypeName;
3032
import org.springframework.javapoet.TypeName;
3133
import org.springframework.javapoet.TypeVariableName;
@@ -63,30 +65,90 @@ void classNames(ResolvableType resolvableType, TypeName expected) {
6365
assertThat(TypeNames.className(resolvableType)).isEqualTo(expected);
6466
}
6567

66-
@Test
67-
void typeNameQuirksForMethodParameters() {
68+
@Test // GH-3374
69+
void resolvedTypeNamesWithoutGenerics() {
70+
71+
ResolvableType resolvableType = ResolvableType.forClass(List.class);
72+
assertThat(TypeNames.resolvedTypeName(resolvableType)).extracting(TypeName::toString).isEqualTo("java.util.List");
73+
}
74+
75+
@Test // GH-3374
76+
void resolvedTypeNamesForMethodParameters() {
6877

6978
ReflectionUtils.doWithMethods(Concrete.class, method -> {
7079
if (!method.getName().contains("baseMethod")) {
7180
return;
7281
}
7382

74-
MethodParameter methodParameter = new MethodParameter(method, 0).withContainingClass(Concrete.class);
75-
ResolvableType resolvableType = ResolvableType.forMethodParameter(methodParameter);
83+
MethodParameter refiedObjectMethodParameter = new MethodParameter(method, 0).withContainingClass(Concrete.class);
84+
ResolvableType resolvedObjectParameterType = ResolvableType.forMethodParameter(refiedObjectMethodParameter);
85+
assertThat(TypeNames.typeName(resolvedObjectParameterType)).isEqualTo(TypeVariableName.get("T"));
86+
assertThat(TypeNames.resolvedTypeName(resolvedObjectParameterType)).isEqualTo(TypeName.get(MyType.class));
87+
88+
MethodParameter refiedCollectionMethodParameter = new MethodParameter(method, 1)
89+
.withContainingClass(Concrete.class);
90+
ResolvableType resolvedCollectionParameterType = ResolvableType
91+
.forMethodParameter(refiedCollectionMethodParameter);
92+
assertThat(TypeNames.typeName(resolvedCollectionParameterType))
93+
.isEqualTo(ParameterizedTypeName.get(ClassName.get(java.util.List.class), TypeVariableName.get("T")));
94+
assertThat(TypeNames.resolvedTypeName(resolvedCollectionParameterType))
95+
.isEqualTo(ParameterizedTypeName.get(java.util.List.class, MyType.class));
96+
97+
MethodParameter refiedArrayMethodParameter = new MethodParameter(method, 2).withContainingClass(Concrete.class);
98+
ResolvableType resolvedArrayParameterType = ResolvableType.forMethodParameter(refiedArrayMethodParameter);
99+
assertThat(TypeNames.typeName(resolvedArrayParameterType)).extracting(TypeName::toString).isEqualTo("T[]");
100+
assertThat(TypeNames.resolvedTypeName(resolvedArrayParameterType)).extracting(TypeName::toString)
101+
.isEqualTo("org.springframework.data.javapoet.TypeNamesUnitTests.MyType[]");
102+
103+
ResolvableType resolvedReturnType = ResolvableType.forMethodReturnType(method, Concrete.class);
104+
assertThat(TypeNames.typeName(resolvedReturnType))
105+
.isEqualTo(ParameterizedTypeName.get(ClassName.get(java.util.List.class), TypeVariableName.get("T")));
106+
assertThat(TypeNames.resolvedTypeName(resolvedReturnType))
107+
.isEqualTo(ParameterizedTypeName.get(java.util.List.class, MyType.class));
108+
});
109+
110+
ReflectionUtils.doWithMethods(Concrete.class, method -> {
111+
if (!method.getName().contains("otherMethod")) {
112+
return;
113+
}
76114

77-
assertThat(TypeNames.typeName(resolvableType)).isEqualTo(TypeVariableName.get("T"));
78-
assertThat(TypeNames.resolvedTypeName(resolvableType)).isEqualTo(TypeName.get(MyType.class));
115+
MethodParameter refiedObjectMethodParameter = new MethodParameter(method, 0).withContainingClass(Concrete.class);
116+
ResolvableType resolvedObjectParameterType = ResolvableType.forMethodParameter(refiedObjectMethodParameter);
117+
assertThat(TypeNames.typeName(resolvedObjectParameterType)).isEqualTo(TypeVariableName.get("RT"));
118+
assertThat(TypeNames.resolvedTypeName(resolvedObjectParameterType)).isEqualTo(TypeName.get(Object.class));
119+
120+
MethodParameter refiedCollectionMethodParameter = new MethodParameter(method, 1)
121+
.withContainingClass(Concrete.class);
122+
ResolvableType resolvedCollectionParameterType = ResolvableType
123+
.forMethodParameter(refiedCollectionMethodParameter);
124+
assertThat(TypeNames.typeName(resolvedCollectionParameterType))
125+
.isEqualTo(ParameterizedTypeName.get(ClassName.get(java.util.List.class), TypeVariableName.get("RT")));
126+
assertThat(TypeNames.resolvedTypeName(resolvedCollectionParameterType))
127+
.isEqualTo(ClassName.get(java.util.List.class));
128+
129+
MethodParameter refiedArrayMethodParameter = new MethodParameter(method, 2).withContainingClass(Concrete.class);
130+
ResolvableType resolvedArrayParameterType = ResolvableType.forMethodParameter(refiedArrayMethodParameter);
131+
assertThat(TypeNames.typeName(resolvedArrayParameterType)).extracting(TypeName::toString).isEqualTo("RT[]");
132+
assertThat(TypeNames.resolvedTypeName(resolvedArrayParameterType)).extracting(TypeName::toString)
133+
.isEqualTo("java.lang.Object[]");
134+
135+
ResolvableType resolvedReturnType = ResolvableType.forMethodReturnType(method, Concrete.class);
136+
assertThat(TypeNames.typeName(resolvedReturnType)).extracting(TypeName::toString).isEqualTo("RT");
137+
assertThat(TypeNames.resolvedTypeName(resolvedReturnType)).isEqualTo(TypeName.get(Object.class));
79138
});
80139
}
81140

82141
interface GenericBase<T> {
83-
java.util.List<T> baseMethod(T arg0);
142+
143+
java.util.List<T> baseMethod(T arg0, java.util.List<T> arg1, T... arg2);
144+
145+
<RT> RT otherMethod(RT arg0, java.util.List<RT> arg1, RT... arg2);
84146
}
85147

86148
interface Concrete extends GenericBase<MyType> {
87149

88150
}
89151

90-
class MyType {}
152+
static class MyType {}
91153

92154
}

0 commit comments

Comments
 (0)