in dataenum-processor/src/main/java/com/spotify/dataenum/processor/generator/value/ValueMethods.java [43:104]
public MethodSpec createFactoryMethod(OutputSpec spec) {
MethodSpec.Builder factory =
MethodSpec.methodBuilder(asCamelCase(value.name()))
.addTypeVariables(spec.typeVariables())
.addModifiers(Modifier.PUBLIC, Modifier.STATIC)
.returns(spec.parameterizedOutputClass());
if (value.javadoc() != null) {
factory.addJavadoc(value.javadoc() + "\n\n");
}
factory.addJavadoc(
"@return a {@link $T} (see {@link $T#$L} for source)\n",
value.outputClass(),
spec.specClass(),
value.name());
for (AnnotationSpec annotationSpec : value.annotations()) {
factory.addAnnotation(annotationSpec);
}
StringBuilder newString = new StringBuilder();
List<Object> newArgs = new ArrayList<>();
newString.append("return new $T(");
newArgs.add(value.parameterizedOutputClass());
boolean first = true;
for (Parameter parameter : value.parameters()) {
ParameterSpec.Builder builder = ParameterSpec.builder(parameter.type(), parameter.name());
if (!parameter.type().isPrimitive()) {
if (parameter.canBeNull()) {
builder.addAnnotation(Nullable.class);
} else {
builder.addAnnotation(Nonnull.class);
}
}
factory.addParameter(builder.build());
if (first) {
newString.append("$L");
first = false;
} else {
newString.append(", $L");
}
newArgs.add(parameter.name());
}
newString.append(")");
if (spec.hasTypeVariables()) {
newString.append(".as$L()");
newArgs.add(spec.outputClass().simpleName());
}
factory.addStatement(newString.toString(), newArgs.toArray());
return factory.build();
}