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