Skip to content

Commit 580ad0f

Browse files
committed
#208 ensure support for generics in return types, especially from annotations
(closes #208)
1 parent e8c3b7e commit 580ad0f

4 files changed

Lines changed: 40 additions & 20 deletions

File tree

src/main/java/unquietcode/tools/flapi/IntrospectorSupport.java

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -91,30 +91,38 @@ else if (parameterType.isArray()) {
9191
typeName = parameterType.getName();
9292
}
9393

94-
// raw type
95-
signature.append(typeName);
96-
97-
// generics
94+
// type
9895
Class<?>[] generics = ResolvableType.forMethodParameter(MethodParameter.forMethodOrConstructor(method, i)).resolveGenerics();
96+
signature.append(makeTypeWithGenerics(typeName, generics));
9997

100-
if (generics != null && generics.length > 0) {
101-
signature.append("<");
98+
// parameter name
99+
signature.append(" p").append(i);
100+
}
102101

103-
for (int p = 0; p < generics.length; ++p) {
104-
if (p != 0) { signature.append(", "); }
102+
signature.append(")");
103+
return signature.toString();
104+
}
105105

106-
Class<?> generic = generics[p];
107-
signature.append(generic.getName());
108-
}
106+
protected static String makeTypeWithGenerics(Class<?> base, Class<?>[] generics) {
107+
return makeTypeWithGenerics(base.getName(), generics);
108+
}
109109

110-
signature.append("> ");
110+
protected static String makeTypeWithGenerics(String base, Class<?>[] generics) {
111+
StringBuilder sb = new StringBuilder(base);
112+
113+
if (generics != null && generics.length > 0) {
114+
sb.append("<");
115+
116+
for (int p = 0; p < generics.length; ++p) {
117+
if (p != 0) { sb.append(", "); }
118+
119+
Class<?> generic = generics[p];
120+
sb.append(generic.getName());
111121
}
112122

113-
// parameter name
114-
signature.append(" p").append(i);
123+
sb.append("> ");
115124
}
116125

117-
signature.append(")");
118-
return signature.toString();
126+
return sb.toString();
119127
}
120128
}

src/main/java/unquietcode/tools/flapi/annotations/AnnotationIntrospector.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,8 @@ private void handleMethod(MethodOutline methodOutline, Method method) {
195195
if (returnType == void.class) {
196196
helper.last();
197197
} else {
198-
helper.last(returnType);
198+
Class<?>[] generics = ResolvableType.forMethodReturnType(method).resolveGenerics();
199+
helper.last(makeTypeWithGenerics(returnType, generics));
199200
}
200201
}
201202

src/main/java/unquietcode/tools/flapi/graph/processors/ReturnTypeProcessor.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import com.sun.codemodel.JClass;
2020
import com.sun.codemodel.JType;
21+
import unquietcode.tools.flapi.MethodParser;
2122
import unquietcode.tools.flapi.generator.AbstractGenerator;
2223
import unquietcode.tools.flapi.generator.GeneratorContext;
2324
import unquietcode.tools.flapi.graph.TransitionVisitor;
@@ -64,10 +65,12 @@ public void visit(TerminalTransition transition) {
6465
? Void.class.getName()
6566
: transition.getReturnType();
6667

67-
if (!clazz.equals(Void.class.getName()) || !transition.getStateChain().isEmpty()) {
68-
initialType.set(ctx.model.ref(clazz));
69-
} else {
68+
if (clazz.equals(Void.class.getName()) && transition.getStateChain().isEmpty()) {
7069
initialType.set(ctx.model.VOID);
70+
} else {
71+
MethodParser fakeParsed = new MethodParser(clazz+" fake()");
72+
JType returnType = getType(fakeParsed.returnType);
73+
initialType.set(returnType);
7174
}
7275
}
7376
});

src/test/java/unquietcode/tools/flapi/MethodParser_T.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -293,6 +293,14 @@ public void multiDimensionalDuplicate() {
293293
new MethodParser(methodSignature);
294294
}
295295

296+
@Test
297+
public void genericReturnType() {
298+
MethodParser parsed = new MethodParser("List<String> method()");
299+
assertEquals(1, parsed.returnType.typeParameters.size());
300+
assertEquals("List", parsed.returnType.typeName);
301+
assertEquals("String", parsed.returnType.typeParameters.get(0).typeName);
302+
}
303+
296304
@Test
297305
public void methodEqualityTests() {
298306

0 commit comments

Comments
 (0)