Skip to content

Commit

Permalink
Manual merge of #733
Browse files Browse the repository at this point in the history
  • Loading branch information
snazha-blkio committed Mar 7, 2019
1 parent 54efcc4 commit 133e2f8
Show file tree
Hide file tree
Showing 4 changed files with 179 additions and 54 deletions.
48 changes: 34 additions & 14 deletions codegen/src/main/java/org/web3j/codegen/AbiTypesGenerator.java
Expand Up @@ -49,8 +49,8 @@ private void generate(String destinationDir) throws IOException {
// generateFixedTypes(Fixed.class, destinationDir);
// generateFixedTypes(Ufixed.class, destinationDir);

generateBytesTypes(Bytes.class, destinationDir);
generateStaticArrayTypes(StaticArray.class, destinationDir);
generateBytesTypes(destinationDir);
generateStaticArrayTypes(destinationDir);
}

private <T extends Type> void generateIntTypes(
Expand Down Expand Up @@ -145,9 +145,8 @@ private <T extends Type> void generateFixedTypes(
}
}

private <T extends Type> void generateBytesTypes(
Class<T> superclass, String path) throws IOException {
String packageName = createPackageName(superclass);
private <T extends Type> void generateBytesTypes(String path) throws IOException {
String packageName = createPackageName(Bytes.class);
ClassName className;

for (int byteSize = 1; byteSize <= 32; byteSize++) {
Expand All @@ -158,7 +157,7 @@ private <T extends Type> void generateBytesTypes(
.addStatement("super($L, $N)", byteSize, "value")
.build();

className = ClassName.get(packageName, superclass.getSimpleName() + byteSize);
className = ClassName.get(packageName, Bytes.class.getSimpleName() + byteSize);

FieldSpec defaultFieldSpec = FieldSpec
.builder(className, DEFAULT, Modifier.PUBLIC, Modifier.STATIC, Modifier.FINAL)
Expand All @@ -168,7 +167,7 @@ private <T extends Type> void generateBytesTypes(
TypeSpec bytesType = TypeSpec
.classBuilder(className.simpleName())
.addJavadoc(CODEGEN_WARNING)
.superclass(superclass)
.superclass(Bytes.class)
.addModifiers(Modifier.PUBLIC)
.addField(defaultFieldSpec)
.addMethod(constructorSpec)
Expand All @@ -178,39 +177,60 @@ private <T extends Type> void generateBytesTypes(
}
}

private <T extends Type> void generateStaticArrayTypes(
Class<T> superclass, String path) throws IOException {
String packageName = createPackageName(superclass);
private <T extends Type> void generateStaticArrayTypes(String path) throws IOException {
String packageName = createPackageName(StaticArray.class);
ClassName className;

for (int length = 1; length <= StaticArray.MAX_SIZE_OF_STATIC_ARRAY; length++) {

TypeVariableName typeVariableName = TypeVariableName.get("T").withBounds(Type.class);

MethodSpec constructorSpec = MethodSpec.constructorBuilder()
MethodSpec oldConstructorSpec = MethodSpec.constructorBuilder()
.addAnnotation(Deprecated.class)
.addModifiers(Modifier.PUBLIC)
.addParameter(ParameterizedTypeName.get(ClassName.get(List.class),
typeVariableName), "values")
.addStatement("super($L, $N)", length, "values")
.build();

MethodSpec arrayOverloadConstructorSpec = MethodSpec.constructorBuilder()
MethodSpec oldArrayOverloadConstructorSpec = MethodSpec.constructorBuilder()
.addAnnotation(Deprecated.class)
.addAnnotation(SafeVarargs.class)
.addModifiers(Modifier.PUBLIC)
.addParameter(ArrayTypeName.of(typeVariableName), "values")
.varargs()
.addStatement("super($L, $N)", length, "values")
.build();

className = ClassName.get(packageName, superclass.getSimpleName() + length);
MethodSpec constructorSpec = MethodSpec.constructorBuilder()
.addModifiers(Modifier.PUBLIC)
.addParameter(ParameterizedTypeName.get(ClassName.get(Class.class),
typeVariableName), "type")
.addParameter(ParameterizedTypeName.get(ClassName.get(List.class),
typeVariableName), "values")
.addStatement("super(type, $L, values)", length)
.build();

MethodSpec arrayOverloadConstructorSpec = MethodSpec.constructorBuilder()
.addAnnotation(SafeVarargs.class)
.addModifiers(Modifier.PUBLIC)
.addParameter(ParameterizedTypeName.get(ClassName.get(Class.class),
typeVariableName), "type")
.addParameter(ArrayTypeName.of(typeVariableName), "values")
.varargs()
.addStatement("super(type, $L, values)", length)
.build();

className = ClassName.get(packageName, StaticArray.class.getSimpleName() + length);

TypeSpec bytesType = TypeSpec
.classBuilder(className.simpleName())
.addTypeVariable(typeVariableName)
.addJavadoc(CODEGEN_WARNING)
.superclass(ParameterizedTypeName.get(ClassName.get(superclass),
.superclass(ParameterizedTypeName.get(ClassName.get(StaticArray.class),
typeVariableName))
.addModifiers(Modifier.PUBLIC)
.addMethods(Arrays.asList(oldConstructorSpec, oldArrayOverloadConstructorSpec))
.addMethods(Arrays.asList(constructorSpec, arrayOverloadConstructorSpec))
.build();

Expand Down
@@ -1,6 +1,7 @@
package org.web3j.codegen;

import java.io.IOException;

import javax.lang.model.element.Modifier;

import com.squareup.javapoet.ClassName;
Expand Down Expand Up @@ -42,12 +43,35 @@ private void generate(String destinationDir) throws IOException {
String typesPackageName = "org.web3j.abi.datatypes";
String autoGeneratedTypesPackageName = typesPackageName + ".generated";

MethodSpec getTypeSpec = getTypeMethodSpec(typesPackageName, autoGeneratedTypesPackageName);
MethodSpec getTypeAsStringSpec = getTypeAsStringMethodSpec();

MethodSpec constructorSpec = MethodSpec.constructorBuilder()
.addModifiers(Modifier.PRIVATE)
.build();

TypeSpec typeSpec = TypeSpec
.classBuilder("AbiTypes")
.addJavadoc(buildWarning(AbiTypesMapperGenerator.class))
.addModifiers(Modifier.PUBLIC, Modifier.FINAL)
.addMethod(constructorSpec)
.addMethod(getTypeSpec)
.addMethod(getTypeAsStringSpec)
.build();

write(autoGeneratedTypesPackageName, typeSpec, destinationDir);
}

private MethodSpec getTypeMethodSpec(
final String typesPackageName,
final String autoGeneratedTypesPackageName) {

MethodSpec.Builder builder = MethodSpec.methodBuilder("getType")
.addModifiers(Modifier.PUBLIC, Modifier.STATIC)
.addParameter(String.class, TYPE)
.returns(
ParameterizedTypeName.get(ClassName.get(Class.class),
WildcardTypeName.subtypeOf(Object.class))
WildcardTypeName.subtypeOf(Type.class))
)
.beginControlFlow("switch (type)");

Expand All @@ -58,21 +82,7 @@ private void generate(String destinationDir) throws IOException {
"Unsupported type encountered: ", TYPE);
builder.endControlFlow();

MethodSpec methodSpec = builder.build();

MethodSpec constructorSpec = MethodSpec.constructorBuilder()
.addModifiers(Modifier.PRIVATE)
.build();

TypeSpec typeSpec = TypeSpec
.classBuilder("AbiTypes")
.addJavadoc(buildWarning(AbiTypesMapperGenerator.class))
.addModifiers(Modifier.PUBLIC, Modifier.FINAL)
.addMethod(constructorSpec)
.addMethod(methodSpec)
.build();

write(autoGeneratedTypesPackageName, typeSpec, destinationDir);
return builder.build();
}

private MethodSpec.Builder addTypes(MethodSpec.Builder builder, String packageName) {
Expand Down Expand Up @@ -146,4 +156,24 @@ private MethodSpec.Builder addStatement(MethodSpec.Builder builder, String packa
"case \"$L\":\nreturn $T.class", typeName, ClassName.get(packageName, className));
}

private MethodSpec getTypeAsStringMethodSpec() {

String controlCondition = "if ($T.class.equals(" + TYPE + "))";

MethodSpec.Builder builder = MethodSpec.methodBuilder("getTypeAString")
.addModifiers(Modifier.PUBLIC, Modifier.STATIC)
.addParameter(ParameterizedTypeName.get(ClassName.get(Class.class),
WildcardTypeName.subtypeOf(Type.class)), TYPE)
.returns(String.class)
.beginControlFlow(controlCondition, Utf8String.class)
.addStatement("return \"string\"")
.nextControlFlow("else " + controlCondition, DynamicBytes.class)
.addStatement("return \"bytes\"")
.nextControlFlow("else")
.addStatement("return type.getSimpleName().toLowerCase()")
.endControlFlow();

return builder.build();
}

}
Expand Up @@ -540,19 +540,21 @@ private String createMappedParameterTypes(ParameterSpec parameterSpec) {
String parameterSpecType = parameterSpec.type.toString();
TypeName typeName = typeNames.get(0);
String typeMapInput = typeName + ".class";
String componentType = typeName.toString();
if (typeName instanceof ParameterizedTypeName) {
List<TypeName> typeArguments = ((ParameterizedTypeName) typeName).typeArguments;
if (typeArguments.size() != 1) {
throw new UnsupportedOperationException(
"Only a single parameterized type is supported");
}
TypeName innerTypeName = typeArguments.get(0);
parameterSpecType = ((ParameterizedTypeName) parameterSpec.type)
.rawType.toString();
typeMapInput = ((ParameterizedTypeName) typeName).rawType + ".class, "
+ innerTypeName + ".class";
componentType = ((ParameterizedTypeName) typeName).rawType.toString();
parameterSpecType = ((ParameterizedTypeName) parameterSpec.type).rawType
+ "<" + componentType + ">";
typeMapInput = componentType + ".class,\n" + innerTypeName + ".class";
}
return "new " + parameterSpecType + "(\n"
+ " " + componentType + ".class,\n"
+ " org.web3j.abi.Utils.typeMap("
+ parameterSpec.name + ", " + typeMapInput + "))";
}
Expand Down Expand Up @@ -868,7 +870,7 @@ MethodSpec buildEventFlowableFunction(
Strings.lowercaseFirstLetter(functionName) + "EventFlowable";
ParameterizedTypeName parameterizedTypeName =
ParameterizedTypeName.get(ClassName.get(Flowable.class),
ClassName.get("", responseClassName));
ClassName.get("", responseClassName));

MethodSpec.Builder flowableMethodBuilder =
MethodSpec.methodBuilder(generatedFunctionName)
Expand Down Expand Up @@ -912,7 +914,7 @@ MethodSpec buildDefaultEventFlowableFunction(
Strings.lowercaseFirstLetter(functionName) + "EventFlowable";
ParameterizedTypeName parameterizedTypeName =
ParameterizedTypeName.get(ClassName.get(Flowable.class),
ClassName.get("", responseClassName));
ClassName.get("", responseClassName));

MethodSpec.Builder flowableMethodBuilder =
MethodSpec.methodBuilder(generatedFunctionName)
Expand Down

0 comments on commit 133e2f8

Please sign in to comment.