Skip to content

Commit e5085c1

Browse files
authored
[Client] Fix Nested Map Generation (#635)
* default to inject * recursive generic writing
1 parent 57c4e5b commit e5085c1

File tree

2 files changed

+41
-23
lines changed

2 files changed

+41
-23
lines changed

http-generator-client/src/main/java/io/avaje/http/generator/client/ClientMethodWriter.java

Lines changed: 35 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import java.util.stream.Stream;
1616

1717
import javax.lang.model.element.TypeElement;
18+
import javax.lang.model.type.TypeKind;
1819
import javax.lang.model.util.ElementFilter;
1920

2021
import io.avaje.http.generator.core.APContext;
@@ -28,13 +29,15 @@
2829
import io.avaje.http.generator.core.PathSegments.Segment;
2930
import io.avaje.http.generator.core.ProcessingContext;
3031
import io.avaje.http.generator.core.RequestTimeoutPrism;
31-
import io.avaje.http.generator.core.UType;
3232
import io.avaje.http.generator.core.Util;
3333
import io.avaje.http.generator.core.WebMethod;
34+
import io.avaje.prism.GenerateUtils;
35+
import io.avaje.http.generator.client.UType;
3436

3537
/**
3638
* Write code to register Web route for a given controller method.
3739
*/
40+
@GenerateUtils
3841
final class ClientMethodWriter {
3942
private static final KnownResponse KNOWN_RESPONSE = new KnownResponse();
4043
private static final String BODY_HANDLER = "java.net.http.HttpResponse.BodyHandler";
@@ -61,7 +64,7 @@ final class ClientMethodWriter {
6164
this.method = method;
6265
this.writer = writer;
6366
this.webMethod = method.webMethod();
64-
this.returnType = Util.parseType(method.returnType());
67+
this.returnType = UType.parse(method.returnType());
6568
this.timeout = method.timeout();
6669
this.useConfig = ProcessingContext.typeElement("io.avaje.config.Config") != null;
6770

@@ -89,12 +92,12 @@ final class ClientMethodWriter {
8992
}
9093

9194
void addImportTypes(ControllerReader reader) {
92-
if (useJsonb) {
95+
if (useInject) {
96+
reader.addImportType("io.avaje.inject.spi.GenericType");
97+
} else if (useJsonb) {
9398
reader.addImportType("io.avaje.jsonb.Types");
9499
} else if (useJackson) {
95100
reader.addImportType("com.fasterxml.jackson.core.type.TypeReference");
96-
} else if (useInject) {
97-
reader.addImportType("io.avaje.inject.spi.GenericType");
98101
}
99102
reader.addImportTypes(returnType.importTypes());
100103
method.throwsList().stream()
@@ -195,7 +198,7 @@ private void writeTimeout(RequestTimeoutPrism p) {
195198
private void writeEnd() {
196199
final var webMethod = method.webMethod();
197200
writer.append(" .%s()", webMethod.name()).eol();
198-
if (returnType == UType.VOID) {
201+
if (returnType.kind() == TypeKind.VOID) {
199202
writer.append(" .asVoid();").eol();
200203
} else {
201204
String known = KNOWN_RESPONSE.get(returnType.full());
@@ -219,17 +222,17 @@ private void writeSyncResponse() {
219222

220223
private void writeAsyncResponse() {
221224
writer.append(" .async()");
222-
writeResponse(returnType.paramRaw());
225+
writeResponse(returnType.param0());
223226
}
224227

225228
private void writeCallResponse() {
226229
writer.append(" .call()");
227-
writeResponse(returnType.paramRaw());
230+
writeResponse(returnType.param0());
228231
}
229232

230233
private void writeResponse(UType type) {
231234
final var mainType = type.mainType();
232-
final var param1 = type.paramRaw();
235+
final var param1 = type.param0();
233236
if (isList(mainType)) {
234237
writer.append(".list(");
235238
writeGeneric(param1);
@@ -240,13 +243,13 @@ private void writeResponse(UType type) {
240243
writer.append(");").eol();
241244
} else if (isHttpResponse(mainType)) {
242245
if (bodyHandlerParam == null) {
243-
final UType paramType = type.paramRaw();
246+
final UType paramType = type.param0();
244247
if ("java.util.List".equals(paramType.mainType())) {
245248
writer.append(".asList(");
246-
writeGeneric(paramType.paramRaw());
249+
writeGeneric(paramType.param0());
247250
} else if ("java.util.stream.Stream".equals(paramType.mainType())) {
248251
writer.append(".asStream(");
249-
writeGeneric(paramType.paramRaw());
252+
writeGeneric(paramType.param0());
250253
} else {
251254
writer.append(".as(");
252255
writeGeneric(paramType);
@@ -263,23 +266,32 @@ private void writeResponse(UType type) {
263266
}
264267

265268
void writeGeneric(UType type) {
266-
if (type.isGeneric() && useJsonb) {
267-
final var params =
268-
type.importTypes().stream()
269-
.skip(1)
270-
.map(Util::shortName)
271-
.collect(Collectors.joining(".class, "));
272-
273-
writer.append("Types.newParameterizedType(%s.class, %s.class)", Util.shortName(type.mainType()), params);
269+
if (type.isGeneric() && useInject) {
270+
writer.append("new GenericType<%s>() {}.type()", type.shortType());
271+
} else if (type.isGeneric() && useJsonb) {
272+
writer.append(jsonbGeneric(type));
274273
} else if (type.isGeneric() && useJackson) {
275274
writer.append("new TypeReference<%s>() {}.getType()", type.shortType());
276-
} else if (type.isGeneric() && useInject) {
277-
writer.append("new GenericType<%s>() {}.getType()", type.shortType());
278275
} else {
279276
writer.append("%s.class", Util.shortName(type.mainType()));
280277
}
281278
}
282279

280+
private String jsonbGeneric(UType type) {
281+
final var params =
282+
type.componentTypes().stream()
283+
.map(c -> {
284+
if (c.isGeneric()) {
285+
return jsonbGeneric(c);
286+
} else {
287+
return c.shortWithoutAnnotations() + ".class";
288+
}
289+
})
290+
.collect(Collectors.joining(", "));
291+
292+
return String.format("Types.newParameterizedType(%s.class, %s)", Util.shortName(type.mainType()), params);
293+
}
294+
283295
private void writeQueryParams(PathSegments pathSegments) {
284296
boolean clientImportError = false;
285297
for (final MethodParam param : method.params()) {
@@ -371,7 +383,7 @@ private void writeBody() {
371383
writer.append(" .body(%s)", param.name()).eol();
372384
} else {
373385
writer.append(" .body(%s, ", param.name());
374-
writeGeneric(param.utype());
386+
writeGeneric(UType.parse(param.element().asType()));
375387
writer.append(")").eol();
376388
}
377389
return;

http-generator-client/src/test/java/io/avaje/http/generator/client/clients/TitanFall.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
package io.avaje.http.generator.client.clients;
22

3+
import java.util.List;
4+
import java.util.Map;
5+
36
import io.avaje.http.api.Client;
47
import io.avaje.http.api.Get;
58
import io.avaje.http.api.Headers;
@@ -12,6 +15,9 @@ public interface TitanFall {
1215
@Headers("Something: \\invalid\n\t")
1316
Titan titanFall();
1417

18+
@Get("/masterpiece")
19+
Map<String, List<Titan>> titanFall2();
20+
1521

1622
@Get("/${titan}/copium")
1723
@Headers(" Accept : applicaton/json")

0 commit comments

Comments
 (0)