// Copyright (c) 2024, 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 switchpatternmatching;

import com.android.tools.r8.TestParameters;
import com.android.tools.r8.utils.codeinspector.InstructionSubject;
import com.android.tools.r8.utils.codeinspector.MethodSubject;

public class SwitchTestHelper {

  public static boolean hasJdk21TypeSwitch(MethodSubject methodSubject) {
    return hasJdk21Switch(methodSubject, "typeSwitch");
  }

  public static boolean hasJdk21EnumSwitch(MethodSubject methodSubject) {
    return hasJdk21Switch(methodSubject, "enumSwitch");
  }

  private static boolean hasJdk21Switch(MethodSubject methodSubject, String switchMethod) {
    assert methodSubject.isPresent();
    // javac generated an invokedynamic using bootstrap method
    // java.lang.runtime.SwitchBootstraps.typeSwitch|enumSwitch.
    return methodSubject
        .streamInstructions()
        .filter(InstructionSubject::isInvokeDynamic)
        .map(
            instruction ->
                instruction
                    .asCfInstruction()
                    .getInstruction()
                    .asInvokeDynamic()
                    .getCallSite()
                    .getBootstrapMethod()
                    .member
                    .asDexMethod())
        .filter(
            method ->
                method.getHolderType().toString().contains("java.lang.runtime.SwitchBootstraps"))
        .anyMatch(method -> method.toString().contains(switchMethod));
  }

  public static String matchException(TestParameters parameters) {
    return parameters.isCfRuntime() ? matchException() : desugarMatchException();
  }

  public static String matchException() {
    return "java.lang.MatchException";
  }

  public static String desugarMatchException() {
    return "java.lang.RuntimeException";
  }
}
