public static TypeSpec create()

in dataenum-processor/src/main/java/com/spotify/dataenum/processor/generator/spec/SpecTypeFactory.java [48:102]


  public static TypeSpec create(
      OutputSpec spec, Optional<Modifier> constructorAccessModifier, Element element)
      throws ParserException {
    List<TypeSpec> valueTypes = new ArrayList<>();
    List<MethodSpec> factoryMethods = new ArrayList<>();
    List<MethodSpec> isMethods = new ArrayList<>();
    List<MethodSpec> asMethods = new ArrayList<>();

    MatchMethods matchMethods = new MatchMethods(spec.outputValues());
    MapMethods mapMethods = new MapMethods(spec.outputValues());

    for (OutputValue value : spec.outputValues()) {
      valueTypes.add(
          ValueTypeFactory.create(
              value, spec, matchMethods, mapMethods, constructorAccessModifier));

      ValueMethods valueMethods = new ValueMethods(value);
      factoryMethods.add(valueMethods.createFactoryMethod(spec));
      isMethods.add(valueMethods.createIsMethod());
      asMethods.add(valueMethods.createAsMethod(spec));
    }

    TypeSpec.Builder enumBuilder =
        TypeSpec.classBuilder(spec.outputClass())
            .addOriginatingElement(element)
            .addJavadoc("Generated from {@link $T}\n", spec.specClass())
            .addAnnotation(
                AnnotationSpec.builder(Generated.class)
                    .addMember(
                        "value", CodeBlock.of("$S", DataEnumProcessor.class.getCanonicalName()))
                    .build())
            .addModifiers(Modifier.PUBLIC, Modifier.ABSTRACT)
            .addTypeVariables(spec.typeVariables())
            .addSuperinterfaces(spec.superInterfaces());

    // add constructor with correct access
    enumBuilder.addMethod(
        MethodSpec.constructorBuilder()
            .addModifiers(fromOptional(constructorAccessModifier))
            .build());

    enumBuilder.addTypes(valueTypes);
    enumBuilder.addMethods(factoryMethods);
    enumBuilder.addMethods(isMethods);
    enumBuilder.addMethods(asMethods);

    if (!Iterables.isEmpty(spec.outputValues())) {
      enumBuilder.addMethod(matchMethods.createAbstractFoldVoidMethod());
      enumBuilder.addMethod(mapMethods.createAbstractFoldMethod());
    }

    enumBuilder.addMethods(spec.methods());

    return enumBuilder.build();
  }