package org.checkerframework.dataflow.expression;

import java.util.List;
import org.checkerframework.checker.nullness.qual.Nullable;

/**
 * This class has methods to viewpoint-adapt {@link JavaExpression} by replacing {@link
 * ThisReference} and {@link FormalParameter} expressions with the given {@link JavaExpression}s.
 */
public class ViewpointAdaptJavaExpression extends JavaExpressionConverter {

  // Public static methods

  /**
   * Replace {@link FormalParameter}s by {@code args} in {@code javaExpr}. ({@link ThisReference}s
   * are not converted.)
   *
   * @param javaExpr the expression to viewpoint-adapt
   * @param args the expressions that replace {@link FormalParameter}s; if null, {@link
   *     FormalParameter}s are not replaced
   * @return the viewpoint-adapted expression
   */
  public static JavaExpression viewpointAdapt(
      JavaExpression javaExpr, @Nullable List<JavaExpression> args) {
    return viewpointAdapt(javaExpr, null, args);
  }
  /**
   * Replace {@link ThisReference} with {@code thisReference} in {@code javaExpr}. ({@link
   * FormalParameter} are not replaced.
   *
   * @param javaExpr the expression to viewpoint-adapt
   * @param thisReference the expression that replaces occurrences of {@link ThisReference}; if
   *     null, {@link ThisReference}s are not replaced
   * @return the viewpoint-adapted expression
   */
  public static JavaExpression viewpointAdapt(
      JavaExpression javaExpr, @Nullable JavaExpression thisReference) {
    return viewpointAdapt(javaExpr, thisReference, null);
  }

  /**
   * Replace {@link FormalParameter}s with {@code args} and {@link ThisReference} with {@code
   * thisReference} in {@code javaExpr}.
   *
   * @param javaExpr the expression to viewpoint-adapt
   * @param thisReference the expression that replaces occurrences of {@link ThisReference}; if
   *     null, {@link ThisReference}s are not replaced
   * @param args the expressions that replaces {@link FormalParameter}s; if null, {@link
   *     FormalParameter}s are not replaced
   * @return the viewpoint-adapted expression
   */
  public static JavaExpression viewpointAdapt(
      JavaExpression javaExpr,
      @Nullable JavaExpression thisReference,
      @Nullable List<JavaExpression> args) {
    return new ViewpointAdaptJavaExpression(thisReference, args).convert(javaExpr);
  }

  // Fields

  /** List of arguments used to replace occurrences {@link FormalParameter}s. */
  private final @Nullable List<JavaExpression> args;

  /** The expression to replace occurrences of {@link ThisReference}s. */
  private final @Nullable JavaExpression thisReference;

  // Instance methods

  /**
   * Creates a {@link JavaExpressionConverter} that viewpoint-adapts using the given {@code
   * thisReference} and {@code args}.
   *
   * @param thisReference the expression that replaces occurrences of {@link ThisReference}; {@code
   *     null} means don't replace
   * @param args list of arguments that replaces occurrences {@link FormalParameter}s; {@code null}
   *     means don't replace
   */
  private ViewpointAdaptJavaExpression(
      @Nullable JavaExpression thisReference, @Nullable List<JavaExpression> args) {
    this.args = args;
    this.thisReference = thisReference;
  }

  @Override
  protected JavaExpression visitThisReference(ThisReference thisExpr, Void unused) {
    if (thisReference != null) {
      return thisReference;
    }
    return super.visitThisReference(thisExpr, unused);
  }

  @Override
  protected JavaExpression visitFormalParameter(FormalParameter parameterExpr, Void unused) {
    if (args != null) {
      int index = parameterExpr.getIndex() - 1;
      if (index < args.size()) {
        return args.get(index);
      }
    }
    return super.visitFormalParameter(parameterExpr, unused);
  }
}
