Skip to content

Commit 512e0e2

Browse files
committed
jooby-apt generates incorrect import statement for bounded wildcards
fix jooby-project#1814
1 parent e530a65 commit 512e0e2

File tree

7 files changed

+88
-10
lines changed

7 files changed

+88
-10
lines changed

modules/jooby-apt/src/main/java/io/jooby/internal/apt/HandlerCompiler.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
import javax.lang.model.type.TypeKind;
2727
import javax.lang.model.type.TypeMirror;
2828
import javax.lang.model.util.Types;
29-
3029
import java.lang.reflect.Method;
3130
import java.util.Collections;
3231
import java.util.List;
@@ -68,7 +67,8 @@ public class HandlerCompiler {
6867
private Types typeUtils;
6968
private TypeMirror annotation;
7069

71-
public HandlerCompiler(ProcessingEnvironment environment, TypeElement owner, ExecutableElement executable,
70+
public HandlerCompiler(ProcessingEnvironment environment, TypeElement owner,
71+
ExecutableElement executable,
7272
TypeElement httpMethod, String pattern) {
7373
this.httpMethod = httpMethod.getSimpleName().toString().toLowerCase();
7474
this.annotation = httpMethod.asType();

modules/jooby-apt/src/main/java/io/jooby/internal/apt/ModuleCompiler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ private void makeExtension(ClassWriter writer, String methodName) {
152152
private void install(ClassWriter writer, List<HandlerCompiler> handlers) throws Exception {
153153
MethodVisitor visitor = writer.visitMethod(ACC_PRIVATE | ACC_STATIC, "install",
154154
"(Lio/jooby/Jooby;Ljavax/inject/Provider;)V",
155-
"(Lio/jooby/Jooby;Ljavax/inject/Provider<" + moduleDescriptorName + ">;)V",
155+
"(Lio/jooby/Jooby;Ljavax/inject/Provider<" + controllerClass + ">;)V",
156156
new String[]{"java/lang/Exception"});
157157
visitor.visitParameter("app", 0);
158158
visitor.visitParameter("provider", 0);

modules/jooby-apt/src/main/java/io/jooby/internal/apt/TypeDefinition.java

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,6 @@ public TypeDefinition(Types types, TypeMirror type) {
4040
this.type = type;
4141
}
4242

43-
public String getSimpleName() {
44-
String name = getName();
45-
int i = name.lastIndexOf('.');
46-
return i > 0 ? name.substring(i + 1) : name;
47-
}
48-
4943
public String getName() {
5044
return getRawType().toString();
5145
}
@@ -122,7 +116,7 @@ public List<TypeDefinition> getArguments() {
122116
}
123117

124118
public Type toJvmType() {
125-
return asmType(getName(type));
119+
return asmType(getName(typeUtils.erasure(type)));
126120
}
127121

128122
public boolean isRawType() {
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package tests.i1814;
2+
3+
import io.jooby.Reified;
4+
import io.jooby.Route;
5+
import io.jooby.annotations.GET;
6+
import io.jooby.annotations.QueryParam;
7+
8+
import javax.annotation.Nonnull;
9+
import java.util.Collections;
10+
import java.util.List;
11+
12+
import static org.junit.jupiter.api.Assertions.assertEquals;
13+
14+
public class C1814 {
15+
@GET("/1814")
16+
public List<? extends U1814> getUsers(@QueryParam @Nonnull String type, Route route) {
17+
assertEquals(Reified.list(U1814.class).getType(), route.getReturnType());
18+
return Collections.singletonList(new U1814(type));
19+
}
20+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package tests.i1814;
2+
3+
import io.jooby.Extension;
4+
import io.jooby.MvcFactory;
5+
import io.jooby.Route;
6+
7+
import javax.annotation.Nonnull;
8+
import javax.inject.Provider;
9+
10+
public class Expected1814 implements MvcFactory {
11+
12+
@Override public boolean supports(@Nonnull Class type) {
13+
return false;
14+
}
15+
16+
@Nonnull @Override public Extension create(@Nonnull Provider provider) {
17+
return application -> {
18+
Route route = application.get("/1814", ctx -> {
19+
C1814 controller = (C1814) provider.get();
20+
String type = ctx.query("type").value();
21+
return controller.getUsers(type, ctx.getRoute());
22+
});
23+
route.setReturnType(U1814.class);
24+
};
25+
}
26+
27+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package tests.i1814;
2+
3+
import io.jooby.MockContext;
4+
import io.jooby.MockRouter;
5+
import io.jooby.apt.MvcModuleCompilerRunner;
6+
import org.junit.jupiter.api.Test;
7+
8+
import static org.junit.jupiter.api.Assertions.assertEquals;
9+
10+
public class Issue1814 {
11+
12+
@Test
13+
public void shouldIgnoreWildcardResponseType() throws Exception {
14+
new MvcModuleCompilerRunner(new C1814())
15+
.example(Expected1814.class)
16+
.module(app -> {
17+
MockRouter router = new MockRouter(app);
18+
MockContext ctx = new MockContext();
19+
ctx.setQueryString("?type=foo");
20+
assertEquals("[foo]", router.get("/1814", ctx).value().toString());
21+
});
22+
}
23+
24+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package tests.i1814;
2+
3+
public class U1814 {
4+
private final String type;
5+
6+
public U1814(String type) {
7+
this.type = type;
8+
}
9+
10+
@Override public String toString() {
11+
return type;
12+
}
13+
}

0 commit comments

Comments
 (0)