![JAR search and dependency download from the Maven repository](/logo.png)
net.zerobuilder.compiler.generate.DtoMethodGoal Maven / Gradle / Ivy
package net.zerobuilder.compiler.generate;
import com.squareup.javapoet.ClassName;
import com.squareup.javapoet.FieldSpec;
import com.squareup.javapoet.TypeName;
import net.zerobuilder.compiler.generate.DtoContext.BuildersContext;
import net.zerobuilder.compiler.generate.DtoGoalDetails.InstanceMethodGoalDetails;
import net.zerobuilder.compiler.generate.DtoGoalDetails.StaticMethodGoalDetails;
import net.zerobuilder.compiler.generate.DtoRegularGoal.SimpleRegularGoalContext;
import java.util.List;
import java.util.function.Supplier;
import static javax.lang.model.element.Modifier.FINAL;
import static javax.lang.model.element.Modifier.PRIVATE;
import static net.zerobuilder.compiler.generate.DtoContext.BuilderLifecycle.REUSE_INSTANCES;
import static net.zerobuilder.compiler.generate.DtoRegularStep.SimpleRegularStep;
import static net.zerobuilder.compiler.generate.ZeroUtil.downcase;
import static net.zerobuilder.compiler.generate.ZeroUtil.fieldSpec;
import static net.zerobuilder.compiler.generate.ZeroUtil.memoize;
public final class DtoMethodGoal {
public static final class InstanceMethodGoalContext extends SimpleRegularGoalContext {
public final List steps;
InstanceMethodGoalContext(
BuildersContext context,
InstanceMethodGoalDetails details,
List steps,
List thrownTypes) {
super(thrownTypes);
this.details = details;
this.context = context;
this.instanceField = memoizeInstanceField(context);
this.steps = steps;
}
public final BuildersContext context;
public final InstanceMethodGoalDetails details;
private final Supplier instanceField;
/**
* @return An instance of type {@link BuildersContext#type}.
*/
public FieldSpec instanceField() {
return instanceField.get();
}
List methodSteps() {
return steps;
}
@Override
public final R acceptRegular(DtoRegularGoal.RegularGoalContextCases cases) {
return cases.instanceMethod(this);
}
@Override
public final List parameterNames() {
return details.parameterNames;
}
@Override
public final TypeName type() {
return details.goalType;
}
}
public static final class SimpleStaticMethodGoalContext extends SimpleRegularGoalContext {
public final List steps;
SimpleStaticMethodGoalContext(
BuildersContext context,
StaticMethodGoalDetails details,
List steps,
List thrownTypes) {
super(thrownTypes);
this.details = details;
this.context = context;
this.steps = steps;
}
public final BuildersContext context;
public final StaticMethodGoalDetails details;
List methodSteps() {
return steps;
}
@Override
public final R acceptRegular(DtoRegularGoal.RegularGoalContextCases cases) {
return cases.staticMethod(this);
}
@Override
public final List parameterNames() {
return details.parameterNames;
}
@Override
public final TypeName type() {
return details.goalType;
}
}
private static Supplier memoizeInstanceField(BuildersContext context) {
return memoize(() -> {
ClassName type = context.type;
String name = '_' + downcase(type.simpleName());
return context.lifecycle == REUSE_INSTANCES
? fieldSpec(type, name, PRIVATE)
: fieldSpec(type, name, PRIVATE, FINAL);
});
}
private DtoMethodGoal() {
throw new UnsupportedOperationException("no instances");
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy