11package io .github .digitalsmile .composers ;
22
33import com .squareup .javapoet .*;
4- import io .github .digitalsmile .functions .Library ;
54import io .github .digitalsmile .PrettyName ;
65import io .github .digitalsmile .annotation .function .NativeCall ;
76import io .github .digitalsmile .annotation .function .NativeMemoryException ;
7+ import io .github .digitalsmile .annotation .structure .NativeMemoryLayout ;
88import io .github .digitalsmile .functions .FunctionNode ;
9+ import io .github .digitalsmile .functions .Library ;
910import io .github .digitalsmile .functions .ParameterNode ;
10- import io .github .digitalsmile .headers .mapping .DeferredObjectTypeMapping ;
11- import io .github .digitalsmile .headers .mapping .ObjectTypeMapping ;
12- import io .github .digitalsmile .headers .mapping .PrimitiveTypeMapping ;
13- import io .github .digitalsmile .headers .type .ArrayOriginalType ;
14- import io .github .digitalsmile .headers .type .ObjectOriginalType ;
15- import io .github .digitalsmile .headers .type .PrimitiveOriginalType ;
11+ import io .github .digitalsmile .headers .mapping .ArrayOriginalType ;
12+ import io .github .digitalsmile .headers .mapping .ObjectOriginalType ;
13+ import io .github .digitalsmile .headers .mapping .PrimitiveOriginalType ;
1614
1715import javax .annotation .processing .Messager ;
1816import javax .lang .model .element .ExecutableElement ;
@@ -66,12 +64,12 @@ public String compose(String packageName, String originalName, String javaName,
6664 for (FunctionNode functionNode : nodes ) {
6765 var returnsCodeBlock = CodeBlock .builder ();
6866 List <CodeBlock > parameters = new ArrayList <>();
69- var nativeReturnTypeMapping = functionNode .nativeReturnType (). typeMapping () ;
67+ var nativeReturnTypeMapping = functionNode .nativeReturnType ();
7068 if (!nativeReturnTypeMapping .carrierClass ().equals (void .class )) {
7169 switch (nativeReturnTypeMapping ) {
72- case PrimitiveTypeMapping primitiveTypeMapping ->
70+ case PrimitiveOriginalType primitiveTypeMapping ->
7371 parameters .add (CodeBlock .builder ().add ("$T.$L" , ValueLayout .class , primitiveTypeMapping .valueLayoutName ()).build ());
74- case ObjectTypeMapping _ , DeferredObjectTypeMapping _ ->
72+ case ObjectOriginalType _ , ArrayOriginalType _ ->
7573 parameters .add (CodeBlock .builder ().add ("$T.ADDRESS" , ValueLayout .class ).build ());
7674 default -> throw new IllegalStateException ("Unexpected value: " + nativeReturnTypeMapping );
7775 }
@@ -80,7 +78,7 @@ public String compose(String packageName, String originalName, String javaName,
8078 var methodBody = CodeBlock .builder ();
8179 for (ParameterNode parameterNode : functionNode .functionParameters ()) {
8280 var prettyName = PrettyName .getVariableName (parameterNode .name ());
83- var parameterTypeMapping = parameterNode .typeMapping (). typeMapping () ;
81+ var parameterTypeMapping = parameterNode .typeMapping ();
8482 if (parameterNode .byAddress ()) {
8583 parameters .add (CodeBlock .builder ().add ("$T.ADDRESS" , ValueLayout .class ).build ());
8684 arguments .add (CodeBlock .builder ().add ("$LMemorySegment" , prettyName ).build ());
@@ -107,7 +105,7 @@ public String compose(String packageName, String originalName, String javaName,
107105 }
108106 } else {
109107 parameters .add (CodeBlock .builder ().add ("$T.$L" , ValueLayout .class , parameterTypeMapping .valueLayoutName ()).build ());
110- if (parameterTypeMapping instanceof ObjectTypeMapping ) {
108+ if (parameterTypeMapping instanceof ObjectOriginalType ) {
111109 arguments .add (CodeBlock .builder ().add ("$LMemorySegment" , prettyName ).build ());
112110 } else {
113111 arguments .add (CodeBlock .builder ().add ("$L" , prettyName ).build ());
@@ -122,6 +120,8 @@ public String compose(String packageName, String originalName, String javaName,
122120 case ObjectOriginalType _ -> {
123121 if (parameterTypeMapping .carrierClass ().equals (String .class )) {
124122 returnsCodeBlock .addStatement ("return $LMemorySegment.getString(0)" , prettyName );
123+ } else if (parameterTypeMapping .carrierClass ().equals (NativeMemoryLayout .class )) {
124+ returnsCodeBlock .addStatement ("return $L.fromBytes($LMemorySegment)" , prettyName , prettyName );
125125 } else {
126126 returnsCodeBlock .addStatement ("return $L.createEmpty().fromBytes($LMemorySegment)" , PrettyName .getObjectName (functionNode .returnType ().typeName ()), prettyName );
127127 }
@@ -158,18 +158,32 @@ public String compose(String packageName, String originalName, String javaName,
158158 methodBody .addStatement ("$L.invoke($L)" , nameMapper .get (functionNode ), CodeBlock .join (arguments , ", " ));
159159 methodBody .addStatement ("processError(capturedState, $S, $L)" , methodsMap .get (functionNode ), CodeBlock .join (arguments , ", " ));
160160 } else {
161- methodBody .addStatement ("var callResult = ($T) $L.invoke($L)" ,
162- nativeReturnTypeMapping .carrierClass ().equals (Object .class ) ? MemorySegment .class : nativeReturnTypeMapping .carrierClass (),
163- nameMapper .get (functionNode ), CodeBlock .join (arguments , ", " ));
161+ switch (functionNode .nativeReturnType ()) {
162+ case ArrayOriginalType _ , ObjectOriginalType _ ->
163+ methodBody .addStatement ("var callResult = ($T) $L.invoke($L)" ,
164+ MemorySegment .class ,
165+ nameMapper .get (functionNode ), CodeBlock .join (arguments , ", " ));
166+ default ->
167+ methodBody .addStatement ("var callResult = ($T) $L.invoke($L)" ,
168+ nativeReturnTypeMapping .carrierClass (),
169+ nameMapper .get (functionNode ), CodeBlock .join (arguments , ", " ));
170+ }
164171 methodBody .addStatement ("processError(callResult, capturedState, $S, $L)" , methodsMap .get (functionNode ), CodeBlock .join (arguments , ", " ));
165172 }
166173 } else {
167174 if (nativeReturnTypeMapping .carrierClass ().equals (void .class )) {
168175 methodBody .addStatement ("$L.invoke($L)" , nameMapper .get (functionNode ), CodeBlock .join (arguments , ", " ));
169176 } else {
170- methodBody .addStatement ("var callResult = ($T) $L.invoke($L)" ,
171- nativeReturnTypeMapping .carrierClass ().equals (Object .class ) ? MemorySegment .class : nativeReturnTypeMapping .carrierClass (),
172- nameMapper .get (functionNode ), CodeBlock .join (arguments , ", " ));
177+ switch (functionNode .nativeReturnType ()) {
178+ case ArrayOriginalType _ , ObjectOriginalType _ ->
179+ methodBody .addStatement ("var callResult = ($T) $L.invoke($L)" ,
180+ MemorySegment .class ,
181+ nameMapper .get (functionNode ), CodeBlock .join (arguments , ", " ));
182+ default ->
183+ methodBody .addStatement ("var callResult = ($T) $L.invoke($L)" ,
184+ nativeReturnTypeMapping .carrierClass (),
185+ nameMapper .get (functionNode ), CodeBlock .join (arguments , ", " ));
186+ }
173187 }
174188 }
175189
0 commit comments