net.zerobuilder.compiler.generate.UpdaterContextV Maven / Gradle / Ivy
package net.zerobuilder.compiler.generate;
import com.squareup.javapoet.FieldSpec;
import com.squareup.javapoet.MethodSpec;
import com.squareup.javapoet.ParameterSpec;
import com.squareup.javapoet.TypeName;
import net.zerobuilder.compiler.generate.DtoRegularGoalContext.RegularGoalContext;
import net.zerobuilder.compiler.generate.DtoStep.EmptyOption;
import net.zerobuilder.compiler.generate.DtoStep.RegularStep;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
import java.util.function.Function;
import static com.squareup.javapoet.MethodSpec.methodBuilder;
import static java.util.Collections.singletonList;
import static javax.lang.model.element.Modifier.PRIVATE;
import static javax.lang.model.element.Modifier.PUBLIC;
import static net.zerobuilder.compiler.generate.DtoRegularGoalContext.isInstance;
import static net.zerobuilder.compiler.generate.DtoRegularGoalContext.regularSteps;
import static net.zerobuilder.compiler.generate.StepContext.nullCheck;
import static net.zerobuilder.compiler.generate.UpdaterContext.updaterType;
import static net.zerobuilder.compiler.generate.Utilities.fieldSpec;
import static net.zerobuilder.compiler.generate.Utilities.parameterSpec;
import static net.zerobuilder.compiler.generate.Utilities.presentInstances;
final class UpdaterContextV {
static final Function> fields
= goal -> {
DtoBuildersContext.BuildersContext buildersContext = DtoRegularGoalContext.buildersContext.apply(goal);
List builder = new ArrayList<>();
builder.addAll(isInstance.apply(goal)
? singletonList(buildersContext.field)
: Collections.emptyList());
for (RegularStep step : regularSteps.apply(goal)) {
String name = step.validParameter.name;
TypeName type = step.validParameter.type;
builder.add(fieldSpec(type, name, PRIVATE));
}
return builder;
};
static final Function> updateMethods
= goal -> {
List builder = new ArrayList<>();
for (RegularStep step : regularSteps.apply(goal)) {
builder.addAll(updateMethods(goal, step));
}
return builder;
};
private static List updateMethods(RegularGoalContext goal, RegularStep step) {
List builder = new ArrayList<>();
builder.add(normalUpdate(goal, step));
builder.addAll(presentInstances(regularEmptyCollection(goal, step)));
return builder;
}
private static Optional regularEmptyCollection(RegularGoalContext goal, RegularStep step) {
Optional maybeEmptyOption = step.emptyOption();
if (!maybeEmptyOption.isPresent()) {
return Optional.empty();
}
EmptyOption emptyOption = maybeEmptyOption.get();
return Optional.of(methodBuilder(emptyOption.name)
.returns(updaterType(goal))
.addStatement("this.$N = $L",
step.field(), emptyOption.initializer)
.addStatement("return this")
.addModifiers(PUBLIC)
.build());
}
private static MethodSpec normalUpdate(RegularGoalContext goal, RegularStep step) {
String name = step.validParameter.name;
TypeName type = step.validParameter.type;
ParameterSpec parameter = parameterSpec(type, name);
return methodBuilder(name)
.returns(updaterType(goal))
.addParameter(parameter)
.addCode(nullCheck.apply(step))
.addStatement("this.$N = $N", step.field(), parameter)
.addStatement("return this")
.addModifiers(PUBLIC)
.build();
}
private UpdaterContextV() {
throw new UnsupportedOperationException("no instances");
}
}