All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.zerobuilder.compiler.generate.DtoMethodGoal Maven / Gradle / Ivy

There is a newer version: 1.603
Show newest version
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