in tensorflow-core/tensorflow-core-generator/src/main/java/org/tensorflow/op/generator/ClassGenerator.java [368:447]
private void buildOptionsClass() {
if (optionalAttributes.isEmpty()) {
return;
}
TypeSpec.Builder optionsBuilder =
TypeSpec.classBuilder("Options").addModifiers(Modifier.PUBLIC, Modifier.STATIC);
optionsBuilder.addJavadoc("$L", "Optional attributes for {@link " + fullClassName() + "}");
ClassName optionsClassName = ClassName.get(fullPackage, className, "Options");
for (AttrDef attr : optionalAttributes) {
ResolvedType type = resolver.typeOf(attr);
String name = getJavaName(attr);
ApiDef.Attr apiAttr = attrApis.get(attr);
String description =
apiAttr.getDescription().isEmpty()
? String.format("the %s option", name)
: apiAttr.getDescription();
// add the setter method, adding one with varargs and one with List if the attribute is
// iterable
if (type.iterable) {
optionsBuilder.addMethod(
MethodSpec.methodBuilder(name)
.returns(optionsClassName)
.addModifiers(Modifier.PUBLIC)
.addParameter(type.classIfGeneric().listIfIterable().javaType, name)
.addJavadoc("Sets the $L option.\n", name)
.addJavadoc("\n@param $L $L", name, parseDocumentation(description))
.addJavadoc("\n@return this Options instance.")
.addCode("this.$L = $L;\nreturn this;\n", name, name)
.build());
optionsBuilder.addMethod(
MethodSpec.methodBuilder(name)
.returns(optionsClassName)
.addModifiers(Modifier.PUBLIC)
.addParameter(type.classIfGeneric().arrayIfIterable().javaType, name)
.addJavadoc("Sets the $L option.\n", name)
.addJavadoc("\n@param $L $L", name, parseDocumentation(description))
.addJavadoc("\n@return this Options instance.")
.addCode("this.$L = $T.asList($L);\nreturn this;\n", name, Arrays.class, name)
.varargs()
.build());
} else {
optionsBuilder.addMethod(
MethodSpec.methodBuilder(name)
.returns(optionsClassName)
.addModifiers(Modifier.PUBLIC)
.addParameter(type.classIfGeneric().javaType, name)
.addJavadoc("Sets the $L option.\n", name)
.addJavadoc("\n@param $L $L", name, parseDocumentation(description))
.addJavadoc("\n@return this Options instance.")
.addCode("this.$L = $L;\nreturn this;\n", name, name)
.build());
}
FieldSpec.Builder field =
FieldSpec.builder(type.classIfGeneric().listIfIterable().javaType, name);
if (!isStateSelector) {
field.addModifiers(Modifier.PRIVATE);
}
// add the field
optionsBuilder.addField(field.build());
}
// add a private constructor
optionsBuilder.addMethod(
MethodSpec.constructorBuilder().addModifiers(Modifier.PRIVATE).build());
optionsClass = optionsBuilder.build();
builder.addType(optionsClass);
}