// 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;

import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.ir.analysis.inlining.SimpleInliningConstraint;
import com.android.tools.r8.ir.analysis.type.DynamicType;
import com.android.tools.r8.ir.analysis.value.AbstractValue;
import com.android.tools.r8.ir.code.InvokeDirect;
import com.android.tools.r8.ir.code.InvokeMethod;
import com.android.tools.r8.ir.optimize.classinliner.constraint.ClassInlinerMethodConstraint;
import com.android.tools.r8.ir.optimize.enums.classification.EnumUnboxerMethodClassification;
import com.android.tools.r8.ir.optimize.info.bridge.BridgeInfo;
import com.android.tools.r8.ir.optimize.info.initializer.InstanceInitializerInfo;
import com.android.tools.r8.utils.InternalOptions;
import com.android.tools.r8.utils.OptionalBool;
import java.util.BitSet;
import java.util.Set;

public abstract class MethodOptimizationInfo
    implements MemberOptimizationInfo<MutableMethodOptimizationInfo> {

  enum InlinePreference {
    MultiCallerInline,
    ForceInline,
    Default
  }

  public abstract boolean cannotBeKept();

  public abstract boolean classInitializerMayBePostponed();

  public abstract CallSiteOptimizationInfo getArgumentInfos();

  public abstract ClassInlinerMethodConstraint getClassInlinerMethodConstraint();

  public abstract EnumUnboxerMethodClassification getEnumUnboxerMethodClassification();

  public abstract DynamicType getDynamicType();

  public final boolean hasNonNullParamOrThrow() {
    return getNonNullParamOrThrow() != null;
  }

  public abstract BitSet getNonNullParamOrThrow();

  public final boolean hasNonNullParamOnNormalExits() {
    return getNonNullParamOnNormalExits() != null;
  }

  public abstract BitSet getNonNullParamOnNormalExits();

  public abstract boolean hasBeenInlinedIntoSingleCallSite();

  public abstract boolean isReachabilitySensitive();

  public abstract boolean returnsArgument();

  public abstract int getReturnedArgument();

  public abstract boolean neverReturnsNormally();

  public abstract BridgeInfo getBridgeInfo();

  public abstract Set<DexType> getInitializedClassesOnNormalExit();

  public abstract InstanceInitializerInfo getContextInsensitiveInstanceInitializerInfo();

  public abstract InstanceInitializerInfo getInstanceInitializerInfo(InvokeDirect invoke);

  public abstract boolean isInitializerEnablingJavaVmAssertions();

  public abstract AbstractValue getAbstractReturnValue();

  public abstract SimpleInliningConstraint getNopInliningConstraint(InternalOptions options);

  public abstract SimpleInliningConstraint getSimpleInliningConstraint();

  public final boolean hasUnusedArguments() {
    assert getUnusedArguments() == null || !getUnusedArguments().isEmpty();
    return getUnusedArguments() != null;
  }

  public abstract BitSet getUnusedArguments();

  public abstract boolean isMultiCallerMethod();

  public abstract OptionalBool isReturnValueUsed();

  public abstract boolean forceInline();

  public abstract boolean triggersClassInitBeforeAnySideEffect();

  public abstract boolean mayHaveSideEffects();

  /** Context sensitive version of {@link #mayHaveSideEffects()}. */
  public abstract boolean mayHaveSideEffects(InvokeMethod invoke, InternalOptions options);

  public abstract boolean returnValueOnlyDependsOnArguments();

  public abstract boolean returnValueHasBeenPropagated();

  @Override
  public boolean isMethodOptimizationInfo() {
    return true;
  }

  @Override
  public MethodOptimizationInfo asMethodOptimizationInfo() {
    return this;
  }
}
