public MethodSpec createFactoryMethod()

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();
  }