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