package joist.codegen.passes;
import joist.codegen.Codegen;
import joist.codegen.dtos.Entity;
import joist.sourcegen.Argument;
import joist.sourcegen.GClass;
import joist.sourcegen.GMethod;
import joist.util.Copy;
public class GenerateBuildersClassPass implements Pass<Codegen> {
public void pass(Codegen codegen) {
GClass builders = codegen.getOutputCodegenDirectory().getClass(codegen.getConfig().getBuildersPackage() + ".Builders");
for (Entity entity : codegen.getSchema().getEntities().values()) {
if (entity.isCodeEntity()) {
continue;
}
builders.addImports(entity.getFullClassName());
if (entity.isConcrete()) {
this.aMethod(builders, entity);
}
this.existingMethod(builders, entity);
this.theMethodWithLong(builders, entity);
this.theMethodWithInt(builders, entity);
}
}
private void aMethod(GClass builders, Entity entity) {
GMethod m = builders//
.getMethod("a" + entity.getClassName())
.returnType(entity.getBuilderClassName())
.setStatic();
m.body.line("return new {}(new {}());", entity.getBuilderClassName(), entity.getClassName());
}
private void existingMethod(GClass builders, Entity entity) {
GMethod m = builders
.getMethod("existing", Argument.arg(entity.getFullClassName(), entity.getVariableName()))
.returnType(entity.getBuilderClassName())
.setStatic();
for (Entity sub : Copy.reverse(entity.getSubEntitiesRecursively())) {
m.body.line("if ({} instanceof {}) {", entity.getVariableName(), sub.getClassName());
m.body.line("_ return new {}(({}) {});", sub.getBuilderClassName(), sub.getClassName(), entity.getVariableName());
m.body.line("}");
}
m.body.line("return new {}({});", entity.getBuilderClassName(), entity.getVariableName());
}
private void theMethodWithInt(GClass builders, Entity entity) {
GMethod m = builders.//
getMethod("the" + entity.getClassName(), Argument.arg("int", "id"))
.returnType(entity.getBuilderClassName())
.setStatic();
m.body.line("return new {}({}.queries.find((long) id));", entity.getBuilderClassName(), entity.getClassName());
}
private void theMethodWithLong(GClass builders, Entity entity) {
GMethod m = builders//
.getMethod("the" + entity.getClassName(), Argument.arg("long", "id"))
.returnType(entity.getBuilderClassName())
.setStatic();
m.body.line("return new {}({}.queries.find(id));", entity.getBuilderClassName(), entity.getClassName());
}
}