Skip to content

Commit 743956a

Browse files
committed
API tool fails to correctly detect parameter type fix jooby-project#1079
1 parent 539af74 commit 743956a

File tree

3 files changed

+76
-1
lines changed

3 files changed

+76
-1
lines changed

modules/jooby-apitool/src/main/java/org/jooby/internal/apitool/BytecodeRouteParser.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -950,7 +950,7 @@ private java.lang.reflect.Type parameterType(final ClassLoader loader, final Abs
950950
/** to(String.class); toOptional; toList(); */
951951
String owner = Type.getReturnType(node.desc).getClassName();
952952
AbstractInsnNode prev = node.getPrevious();
953-
if (prev instanceof FieldInsnNode) {
953+
if (prev instanceof FieldInsnNode && ((MethodInsnNode) n).name.equals("toEnum")) {
954954
/** toEnum(Letter.A); */
955955
return loadType(loader, ((FieldInsnNode) prev).owner);
956956
}
@@ -961,6 +961,8 @@ private java.lang.reflect.Type parameterType(final ClassLoader loader, final Abs
961961
if (cst instanceof Type) {
962962
toType = loadType(loader, ((Type) cst).getClassName());
963963
}
964+
} else if (prev instanceof FieldInsnNode) {
965+
toType = loadType(loader, ((FieldInsnNode) prev).owner);
964966
}
965967
// JoobyKt.toOptional
966968
AbstractInsnNode next = node.getNext();
@@ -1022,6 +1024,15 @@ private java.lang.reflect.Type parameterType(final ClassLoader loader, final Abs
10221024
result = parameterType(loader, next);
10231025
}
10241026
return result;
1027+
} else if (n instanceof FieldInsnNode) {
1028+
AbstractInsnNode next = n.getNext();
1029+
if (next instanceof MethodInsnNode) {
1030+
if (((MethodInsnNode) next).name.equals("toOptional")) {
1031+
return Types.newParameterizedType(Optional.class, loadType(loader, ((FieldInsnNode) n).owner));
1032+
} else if (((MethodInsnNode) next).name.equals("getOrCreateKotlinClass")) {
1033+
return loadType(loader, ((FieldInsnNode) n).owner);
1034+
}
1035+
}
10251036
}
10261037
return Object.class;
10271038
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package issues;
2+
3+
import kt.App1079;
4+
import org.jooby.apitool.ApiParser;
5+
import org.jooby.apitool.RouteMethod;
6+
import org.jooby.apitool.RouteMethodAssert;
7+
import org.jooby.apitool.RouteParameter;
8+
import org.junit.Test;
9+
10+
import java.nio.file.Path;
11+
import java.nio.file.Paths;
12+
import java.util.List;
13+
14+
public class Issue1079 {
15+
16+
@Test
17+
public void shouldDetectKotlinNativeType() throws Exception {
18+
List<RouteMethod> routes = new ApiParser(dir()).parseFully(new App1079());
19+
20+
new RouteMethodAssert(routes)
21+
.next(r -> {
22+
r.returnType(String.class);
23+
r.method("GET");
24+
r.pattern("/");
25+
r.description(null);
26+
r.summary(null);
27+
r.returns("java.lang.String");
28+
r.param(p -> {
29+
p.type("java.util.Optional<java.lang.Integer>");
30+
p.name("p1");
31+
p.kind(RouteParameter.Kind.QUERY);
32+
}).param(p -> {
33+
p.type("java.util.Optional<java.lang.Integer>");
34+
p.name("p2");
35+
p.kind(RouteParameter.Kind.QUERY);
36+
}).param(p -> {
37+
p.type("int");
38+
p.name("p3");
39+
p.kind(RouteParameter.Kind.QUERY);
40+
});
41+
})
42+
.done();
43+
}
44+
45+
private Path dir() {
46+
Path userdir = Paths.get(System.getProperty("user.dir"));
47+
if (!userdir.toString().endsWith("jooby-apitool")) {
48+
userdir = userdir.resolve("modules").resolve("jooby-apitool");
49+
}
50+
return userdir;
51+
}
52+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package kt
2+
3+
import org.jooby.*
4+
5+
class App1079 : Kooby({
6+
get {
7+
val page = param("p1").toOptional(Int::class) // uses org.jooby.toOptional
8+
val pageSize = param("p2").toOptional(Int::class.java)
9+
val p3 = param("p3").to(Int::class)
10+
"optional"
11+
}
12+
})

0 commit comments

Comments
 (0)