// Copyright (c) 2019, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

package com.android.tools.r8.ir.optimize.info.initializer;

import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.PrunedItems;
import com.android.tools.r8.graph.RewrittenPrototypeDescription.ArgumentInfoCollection;
import com.android.tools.r8.ir.analysis.fieldvalueanalysis.AbstractFieldSet;
import com.android.tools.r8.ir.optimize.info.field.InstanceFieldInitializationInfoCollection;
import com.android.tools.r8.shaking.AppInfoWithLiveness;

public abstract class InstanceInitializerInfo {

  public boolean isDefaultInstanceInitializerInfo() {
    return false;
  }

  public boolean isNonTrivialInstanceInitializerInfo() {
    return false;
  }

  public NonTrivialInstanceInitializerInfo asNonTrivialInstanceInitializerInfo() {
    return null;
  }

  public abstract boolean hasParent();

  public abstract DexMethod getParent();

  public abstract InstanceFieldInitializationInfoCollection fieldInitializationInfos();

  /**
   * Returns an abstraction of the set of fields that may be as a result of executing this
   * initializer.
   */
  public abstract AbstractFieldSet readSet();

  /**
   * Returns true if one of the instance fields on the enclosing class may be initialized with a
   * value that may depend on the runtime environment by this constructor.
   *
   * <p>Example: returns false if all fields are assigned with one of the arguments or a constant.
   *
   * <p>Example: returns true if a field is assigned with the value of a static-get instruction that
   * reads a field from a different class.
   */
  public abstract boolean instanceFieldInitializationMayDependOnEnvironment();

  /**
   * Returns false if the only side effects that this initializer may have is the instance-put
   * instructions that assign a field on the enclosing class.
   *
   * <p>Example: returns true if the initializer invokes {@link java.io.PrintStream#println()}.
   *
   * <p>Example: returns false if the initializer merely assigns the value of one of the arguments
   * or a constant to an instance-field on the enclosing class.
   */
  public abstract boolean mayHaveOtherSideEffectsThanInstanceFieldAssignments();

  /**
   * The receiver always escapes from a constructor, since it is passed to the constructor in the
   * super class. This method returns true if the receiver never escapes outside this constructor or
   * any of its (transitive) super constructors.
   */
  public abstract boolean receiverNeverEscapesOutsideConstructorChain();

  public final boolean receiverMayEscapeOutsideConstructorChain() {
    return !receiverNeverEscapesOutsideConstructorChain();
  }

  public abstract InstanceInitializerInfo fixupAfterParametersChanged(
      AppView<AppInfoWithLiveness> appView, ArgumentInfoCollection argumentInfoCollection);

  public abstract InstanceInitializerInfo rewrittenWithLens(
      AppView<AppInfoWithLiveness> appView, GraphLens lens, PrunedItems prunedItems);
}
