// Copyright (c) 2017, 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 invokecustom;

import java.lang.invoke.CallSite;
import java.lang.invoke.ConstantCallSite;
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;

class ArgumentType {
}

class ReturnType {
}

interface I {
  default ReturnType targetMethodTest4(ArgumentType arg) {
    System.out.println("I.targetMethodTest4");
    return new ReturnType();
  }
}

class Middle implements I {
}

class Sub extends Middle {
}

interface I2 {
  default ReturnType targetMethodTest5(ArgumentType arg) {
    System.out.println("I2.targetMethodTest5");
    return new ReturnType();
  }
}

class Impl implements I2 {
  @Override
  public ReturnType targetMethodTest5(ArgumentType arg) {
    System.out.println("Impl.targetMethodTest5");
    return new ReturnType();
  }
}

public class InvokeCustom {

  private static String staticField1 = "StaticField1";

  private static void targetMethodTest1() {
    System.out.println("Hello World!");
  }

  private static void targetMethodTest2(MethodHandle mhInvokeStatic, MethodHandle mhGetStatic)
      throws Throwable {
    mhInvokeStatic.invokeExact();
    System.out.println(mhGetStatic.invoke());
  }

  private static void targetMethodTest3(MethodType mt)
      throws Throwable {
    System.out.println("MethodType: " + mt.toString());
  }

  public static CallSite bsmLookupStatic(MethodHandles.Lookup caller, String name, MethodType type)
      throws NoSuchMethodException, IllegalAccessException {
    final MethodHandles.Lookup lookup = MethodHandles.lookup();
    final MethodHandle targetMH = lookup.findStatic(lookup.lookupClass(), name, type);
    return new ConstantCallSite(targetMH.asType(type));
  }

  public static void doInvokeSubWithArg(MethodHandle handle) throws Throwable {
    handle.invoke(new Sub(), new ArgumentType());
  }

  public static void doInvokeExactImplWithArg(MethodHandle handle) throws Throwable {
    ReturnType result = (ReturnType) handle.invokeExact(new Impl(), new ArgumentType());
  }
}
