1515import java .util .stream .Stream ;
1616
1717import javax .lang .model .element .TypeElement ;
18+ import javax .lang .model .type .TypeKind ;
1819import javax .lang .model .util .ElementFilter ;
1920
2021import io .avaje .http .generator .core .APContext ;
2829import io .avaje .http .generator .core .PathSegments .Segment ;
2930import io .avaje .http .generator .core .ProcessingContext ;
3031import io .avaje .http .generator .core .RequestTimeoutPrism ;
31- import io .avaje .http .generator .core .UType ;
3232import io .avaje .http .generator .core .Util ;
3333import 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
3841final 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 ;
0 commit comments