assert classNameString != null;
assert baseClass != null;
assert slots != null;
ModelFactory f = environment.getModelFactory();
SimpleName className = f.newSimpleName(classNameString);
ImportBuilder importer = new ImportBuilder(
f,
f.newPackageDeclaration(environment.getEpiloguePackageName(moduleId)),
Strategy.TOP_LEVEL);
importer.resolvePackageMember(className);
List<Expression> elements = Lists.create();
for (Slot slot : slots) {
if (requiresReducer(slot)) {
List<Expression> arguments = Lists.create();
arguments.add(f.newClassLiteral(importer.toType(slot.valueType)));
arguments.add(Models.toLiteral(f, slot.basePath));
arguments.add(f.newClassLiteral(importer.toType(slot.formatClass)));
arguments.add(f.newClassLiteral(importer.toType(slot.namingClass)));
arguments.add(f.newClassLiteral(importer.toType(slot.orderClass)));
elements.add(new TypeBuilder(f, importer.toType(DirectOutputSpec.class))
.newObject(arguments)
.toExpression());
} else {
elements.add(Models.toNullLiteral(f));
}
}
return emitConstructorClass(
className,
importer.toType(baseClass),
importer,
Collections.singletonList(f.newArrayCreationExpression(
(ArrayType) importer.toType(DirectOutputSpec[].class),
f.newArrayInitializer(elements))));
}