// 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 ClassWithLongName {
  @Override
  public String toString() {
    return getClass().getName();
  }
}

class AnotherClassWithALongName {
  @Override
  public String toString() {
    return getClass().getName();
  }
}

interface J {

  default void targetMethodTest8() {
    System.out.println("targetMethodTest8 from J");
  }

  default void targetMethodTest7() {
    System.out.println("targetMethodTest7 from J");
  }

  default void targetMethodTest6() {
    System.out.println("targetMethodTest6 from J");
  }
}

interface I extends J {
  void targetMethodTest8();

  default void targetMethodTest6() {
    System.out.println("targetMethodTest6 from I");
  }

  default void targetMethodTest9() {
    System.out.println("targetMethodTest9 from I");
  }

  default void targetMethodTest10() {
    System.out.println("targetMethodTest10 from I");
  }

  default AnotherClassWithALongName targetMethodTest11(ClassWithLongName a) {
    System.out.println("targetMethodTest11 from I");
    return new AnotherClassWithALongName();
  }
}

abstract class Super {
  public void targetMethodTest5() {
    System.out.println("targetMethodTest5 from Super");
  }

  abstract void targetMethodTest10();
}

public class InvokeCustom extends Super implements I {

  private static String staticField1 = "StaticField1";

  private String instanceField1 = "instanceField1";

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

  private static void targetMethodTest2(boolean z, byte b, char c, short s, int i, float f, long l,
      double d, String str) {
    System.out.println(z);
    System.out.println(b);
    System.out.println(c);
    System.out.println(s);
    System.out.println(i);
    System.out.println(f);
    System.out.println(l);
    System.out.println(d);
    System.out.println(str);
  }

  private static void targetMethodTest3() {
  }

  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 CallSite bsmLookupStaticWithExtraArgs(
      MethodHandles.Lookup caller, String name, MethodType type, int i, long l, float f, double d)
      throws NoSuchMethodException, IllegalAccessException {
    System.out.println(i);
    System.out.println(l);
    System.out.println(f);
    System.out.println(d);
    final MethodHandles.Lookup lookup = MethodHandles.lookup();
    final MethodHandle targetMH = lookup.findStatic(lookup.lookupClass(), name, type);
    return new ConstantCallSite(targetMH.asType(type));
  }

  @Override
  public void targetMethodTest5() {
    System.out.println("targetMethodTest5 from InvokeCustom");
  }

  private static void targetMethodTest4() {
    System.out.println("targetMethodTest4");
  }

  public void targetMethodTest8() {
    System.out.println("targetMethodTest8 from InvokeCustom");
  }

  public void targetMethodTest10() {
    System.out.println("targetMethodTest10 from InvokeCustom");
  }

  public static CallSite bsmCreateCallSite(
      MethodHandles.Lookup caller, String name, MethodType type, MethodHandle mh)
      throws Throwable {
    return new ConstantCallSite(mh);
  }
}
