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

import com.android.tools.r8.androidapi.ComputedApiLevel;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.ir.code.InstancePut;
import com.android.tools.r8.ir.code.Instruction;
import com.android.tools.r8.ir.code.InvokeDirect;
import com.android.tools.r8.ir.code.InvokeMethod;
import com.android.tools.r8.ir.optimize.Inliner.Reason;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import com.android.tools.r8.utils.collections.ProgramMethodSet;
import java.util.Set;

public abstract class WhyAreYouNotInliningReporter {

  public static WhyAreYouNotInliningReporter createFor(
      ProgramMethod callee, AppView<AppInfoWithLiveness> appView, ProgramMethod context) {
    if (appView.appInfo().isWhyAreYouNotInliningMethod(callee.getReference())) {
      return new WhyAreYouNotInliningReporterImpl(
          callee, context, appView.options().testing.whyAreYouNotInliningConsumer);
    }
    return NopWhyAreYouNotInliningReporter.getInstance();
  }

  public static void handleInvokeWithUnknownTarget(
      InvokeMethod invoke, AppView<AppInfoWithLiveness> appView, ProgramMethod context) {
    if (appView.appInfo().hasNoWhyAreYouNotInliningMethods()) {
      return;
    }

    ProgramMethodSet possibleProgramTargets = invoke.lookupProgramDispatchTargets(appView, context);
    if (possibleProgramTargets == null) {
      // In principle, this invoke might target any method in the program, but we do not want to
      // report a message for each of the methods in `AppInfoWithLiveness#whyAreYouNotInlining`,
      // since that would almost never be useful.
      return;
    }

    for (ProgramMethod possibleTarget : possibleProgramTargets) {
      createFor(possibleTarget, appView, context).reportUnknownTarget();
    }
  }

  public abstract void reportCallerNotSameClass();

  public abstract void reportCallerNotSameNest();

  public abstract void reportCallerNotSamePackage();

  public abstract void reportCallerNotSubtype();

  public abstract void reportCallerHasUnknownApiLevel();

  public abstract void reportClasspathMethod();

  public abstract void reportInaccessible();

  public abstract void reportIncorrectArity(int numberOfArguments, int arity);

  public abstract void reportInlineeDoesNotHaveCode();

  public abstract void reportInlineeNotInliningCandidate();

  public abstract void reportInlineeNotProcessed();

  public abstract void reportInlineeNotSimple();

  public abstract void reportInlineeHigherApiCall(
      ComputedApiLevel callerApiLevel, ComputedApiLevel inlineeApiLevel);

  public abstract void reportInlineeRefersToClassesNotInMainDex();

  public abstract void reportInliningAcrossFeatureSplit();

  public abstract void reportInstructionBudgetIsExceeded();

  public abstract void reportInvalidDoubleInliningCandidate();

  public abstract void reportInvalidInliningReason(Reason reason, Set<Reason> validInliningReasons);

  public abstract void reportLibraryMethod();

  public abstract void reportMarkedAsNeverInline();

  public abstract void reportMustTriggerClassInitialization();

  public abstract void reportNoInliningIntoConstructorsWhenGeneratingClassFiles();

  public abstract void reportPinned();

  public abstract void reportPotentialExplosionInExceptionalControlFlowResolutionBlocks(
      int estimatedNumberOfControlFlowResolutionBlocks, int threshold);

  public abstract void reportProcessedConcurrently();

  public abstract void reportReceiverDefinitelyNull();

  public abstract void reportReceiverMaybeNull();

  public abstract void reportRecursiveMethod();

  abstract void reportUnknownTarget();

  public abstract void reportUnsafeConstructorInliningDueToFinalFieldAssignment(
      InstancePut instancePut);

  public abstract void reportUnsafeConstructorInliningDueToIndirectConstructorCall(
      InvokeDirect invoke);

  public abstract void reportUnsafeConstructorInliningDueToUninitializedObjectUse(Instruction user);

  public abstract void reportWillExceedInstructionBudget(int numberOfInstructions, int threshold);

  public abstract void reportWillExceedMaxInliningDepth(int actualInliningDepth, int threshold);

  public abstract void reportWillExceedMonitorEnterValuesBudget(
      int numberOfMonitorEnterValuesAfterInlining, int threshold);

  public abstract boolean unsetReasonHasBeenReportedFlag();
}
