// 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());
  }
}
