@@ -136,36 +136,37 @@ public void generateJavaFiles(
136
136
classBuilder .addMethod (buildConstructor (CryptoKeyPair .class , CREDENTIAL ));
137
137
138
138
classBuilder .addFields (buildFuncNameConstants (abiDefinitions ));
139
+ scanABIDefinitions (abiDefinitions );
139
140
classBuilder .addTypes (this .buildStructTypes (abiDefinitions ));
140
- structsNamedTypeList .addAll (
141
- abiDefinitions
142
- .stream ()
143
- .flatMap (
144
- definition -> {
145
- List <ABIDefinition .NamedType > parameters = new ArrayList <>();
146
- if (definition .getInputs () != null ) {
147
- parameters .addAll (definition .getInputs ());
148
- }
149
-
150
- if (definition .getOutputs () != null ) {
151
- parameters .addAll (definition .getOutputs ());
152
- }
153
- return parameters
154
- .stream ()
155
- .filter (
156
- namedType ->
157
- namedType
158
- .getType ()
159
- .startsWith ("tuple" ));
160
- })
161
- .collect (Collectors .toList ()));
162
141
classBuilder .addMethods (buildFunctionDefinitions (classBuilder , abiDefinitions ));
163
142
classBuilder .addMethod (buildLoad (className , CryptoKeyPair .class , CREDENTIAL ));
164
143
classBuilder .addMethods (buildDeployMethods (className , abiDefinitions ));
165
144
166
145
write (basePackageName , classBuilder .build (), destinationDir );
167
146
}
168
147
148
+ private void scanABIDefinitions (List <ABIDefinition > abiDefinitions ) {
149
+ for (ABIDefinition abiDefinition : abiDefinitions ) {
150
+ scanParameters (abiDefinition .getInputs ());
151
+ scanParameters (abiDefinition .getOutputs ());
152
+ }
153
+ }
154
+
155
+ private void scanParameters (List <ABIDefinition .NamedType > parameters ) {
156
+ if (parameters != null ) {
157
+ for (ABIDefinition .NamedType namedType : parameters ) {
158
+ scanNameType (namedType );
159
+ }
160
+ }
161
+ }
162
+
163
+ private void scanNameType (ABIDefinition .NamedType namedType ) {
164
+ if (namedType .getType ().startsWith ("tuple" )) {
165
+ structsNamedTypeList .add (namedType );
166
+ }
167
+ scanParameters (namedType .getComponents ());
168
+ }
169
+
169
170
protected void write (String packageName , TypeSpec typeSpec , String destinationDir )
170
171
throws IOException {
171
172
JavaFile javaFile =
@@ -571,10 +572,7 @@ private String createMappedParameterTypes(ParameterSpec parameterSpec) {
571
572
return "new "
572
573
+ parameterSpecType
573
574
+ "(\n "
574
- + " "
575
- + componentType
576
- + ".class,\n "
577
- + " org.fisco.bcos.sdk.codec.Utils.typeMap("
575
+ + "org.fisco.bcos.sdk.abi.Utils.typeMap("
578
576
+ parameterSpec .name
579
577
+ ", "
580
578
+ typeMapInput
@@ -621,6 +619,8 @@ protected static TypeName getNativeType(TypeName typeName) {
621
619
return TypeName .get (byte [].class );
622
620
} else if (simpleName .startsWith (Bool .class .getSimpleName ())) {
623
621
return TypeName .get (Boolean .class ); // boolean cannot be a parameterized type
622
+ } else if (simpleName .startsWith ("Struct" )) {
623
+ return typeName ;
624
624
} else {
625
625
throw new UnsupportedOperationException (
626
626
"Unsupported type: " + typeName + ", no native type mapping exists." );
@@ -1383,7 +1383,7 @@ private void buildTupleResultContainer(
1383
1383
.add ("$>$>" );
1384
1384
1385
1385
String resultStringSimple = "\n ($T) results.get($L)" ;
1386
- resultStringSimple + = ".getValue()" ;
1386
+ String resultGetValue = ".getValue()" ;
1387
1387
1388
1388
String resultStringNativeList = "\n convertToNative(($T) results.get($L).getValue())" ;
1389
1389
@@ -1394,11 +1394,14 @@ private void buildTupleResultContainer(
1394
1394
TypeName param = outputParameterTypes .get (i );
1395
1395
TypeName convertTo = typeArguments .get (i );
1396
1396
1397
- String resultString = resultStringSimple ;
1397
+ String resultString = resultStringSimple + resultGetValue ;
1398
1398
1399
- // If we use native java types we need to convert
1400
- // elements of arrays to native java types too
1399
+ if (param .equals (convertTo )) {
1400
+ resultString = resultStringSimple ;
1401
+ }
1401
1402
if (param instanceof ParameterizedTypeName ) {
1403
+ // If we use native java types we need to convert
1404
+ // elements of arrays to native java types too
1402
1405
ParameterizedTypeName oldContainer = (ParameterizedTypeName ) param ;
1403
1406
ParameterizedTypeName newContainer = (ParameterizedTypeName ) convertTo ;
1404
1407
if (newContainer .rawType .compareTo (classList ) == 0
@@ -1439,11 +1442,11 @@ private void buildTupleResultContainer0(
1439
1442
1440
1443
String resultString = resultStringSimple + resultGetValue ;
1441
1444
1442
- // If we use native java types we need to convert
1443
- // elements of arrays to native java types too
1444
1445
if (param .equals (convertTo )) {
1445
1446
resultString = resultStringSimple ;
1446
1447
} else if (param instanceof ParameterizedTypeName ) {
1448
+ // If we use native java types we need to convert
1449
+ // elements of arrays to native java types too
1447
1450
ParameterizedTypeName oldContainer = (ParameterizedTypeName ) param ;
1448
1451
ParameterizedTypeName newContainer = (ParameterizedTypeName ) convertTo ;
1449
1452
if (newContainer .rawType .compareTo (classList ) == 0
@@ -1597,32 +1600,47 @@ private List<TypeSpec> buildStructTypes(List<ABIDefinition> functionDefinitions)
1597
1600
builder .addField (typeName , component .getName (), Modifier .PUBLIC );
1598
1601
constructorBuilder .addParameter (typeName , component .getName ());
1599
1602
nativeConstructorBuilder .addParameter (typeName , component .getName ());
1603
+
1604
+ nativeConstructorBuilder .addStatement (
1605
+ "this." + component .getName () + " = " + component .getName ());
1606
+ constructorBuilder .addStatement (
1607
+ "this." + component .getName () + " = " + component .getName ());
1600
1608
} else if (component .getType ().startsWith ("tuple" )
1601
1609
&& component .getType ().endsWith ("[]" )) {
1602
1610
final TypeName typeName = buildStructArrayTypeName (component );
1603
1611
builder .addField (typeName , component .getName (), Modifier .PUBLIC );
1604
1612
constructorBuilder .addParameter (typeName , component .getName ());
1605
1613
nativeConstructorBuilder .addParameter (typeName , component .getName ());
1614
+
1615
+ nativeConstructorBuilder .addStatement (
1616
+ "this." + component .getName () + " = " + component .getName ());
1617
+ constructorBuilder .addStatement (
1618
+ "this." + component .getName () + " = " + component .getName ());
1606
1619
} else {
1607
1620
final TypeName typeName = buildTypeName (component .getType ());
1608
1621
final TypeName nativeTypeName = getNativeType (typeName );
1609
1622
builder .addField (nativeTypeName , component .getName (), Modifier .PUBLIC );
1610
1623
constructorBuilder .addParameter (typeName , component .getName ());
1611
1624
nativeConstructorBuilder .addParameter (nativeTypeName , component .getName ());
1625
+
1626
+ nativeConstructorBuilder .addStatement (
1627
+ "this." + component .getName () + " = " + component .getName ());
1628
+ if (component .getType ().endsWith ("[]" )) {
1629
+ constructorBuilder .addStatement (
1630
+ "this."
1631
+ + component .getName ()
1632
+ + " = "
1633
+ + component .getName ()
1634
+ + ".getNativeValue()" );
1635
+ } else {
1636
+ constructorBuilder .addStatement (
1637
+ "this."
1638
+ + component .getName ()
1639
+ + " = "
1640
+ + component .getName ()
1641
+ + ".getValue()" );
1642
+ }
1612
1643
}
1613
- nativeConstructorBuilder .addStatement (
1614
- "this." + component .getName () + " = " + component .getName ());
1615
- constructorBuilder .addStatement (
1616
- "this."
1617
- + component .getName ()
1618
- + " = "
1619
- + component .getName ()
1620
- + (structClassNameMap
1621
- .keySet ()
1622
- .stream ()
1623
- .noneMatch (i -> i == component .structIdentifier ())
1624
- ? ".getValue()"
1625
- : "" ));
1626
1644
}
1627
1645
1628
1646
builder .superclass (namedType .isDynamic () ? DynamicStruct .class : StaticStruct .class );
@@ -1744,14 +1762,29 @@ private String buildStructConstructorParameterDefinition(
1744
1762
final ABIDefinition .NamedType component = components .get (i );
1745
1763
stringBuilder .append (i > 0 ? "," : "" );
1746
1764
if (useNativeJavaTypes ) {
1747
- stringBuilder .append (
1748
- !component .getType ().startsWith ("tuple" )
1749
- ? "new "
1750
- + buildTypeName (component .getType ())
1751
- + "("
1752
- + component .getName ()
1753
- + ")"
1754
- : component .getName ());
1765
+ if (component .getType ().startsWith ("tuple" )) {
1766
+ stringBuilder .append (component .getName ());
1767
+ } else if (component .getType ().endsWith ("[]" )) {
1768
+ TypeName typeName = buildTypeName (component .getType ());
1769
+ TypeName baseType = ((ParameterizedTypeName ) typeName ).typeArguments .get (0 );
1770
+
1771
+ stringBuilder .append (
1772
+ "new "
1773
+ + buildTypeName (component .getType ())
1774
+ + "("
1775
+ + component .getName ()
1776
+ + ".stream().map(obj -> new "
1777
+ + baseType
1778
+ + "(obj)).collect(java.util.stream.Collectors.toList())"
1779
+ + ")" );
1780
+ } else {
1781
+ stringBuilder .append (
1782
+ "new "
1783
+ + buildTypeName (component .getType ())
1784
+ + "("
1785
+ + component .getName ()
1786
+ + ")" );
1787
+ }
1755
1788
} else {
1756
1789
stringBuilder .append (component .getName ());
1757
1790
}
0 commit comments