// Copyright (c) 2020, 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 com.android.tools.r8.cf.methodhandles;

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

interface InvalidBootstrapMethodHandleTestInterface {
  CallSite virtualMethod(MethodHandles.Lookup caller, String name, MethodType type)
      throws Exception;
}

// Test data class for InvalidBootstrapMethodHandleTest.
// Making this an inner class of the test causes changes to the VMs reflection.
public class InvalidBootstrapMethodHandleTestClass
    implements InvalidBootstrapMethodHandleTestInterface {

  // Static field to target.
  public static int staticField = 42;

  // Non-static field to target.
  public int nonStaticField = 42;

  // Virtual method to target.
  @Override
  public CallSite virtualMethod(MethodHandles.Lookup caller, String name, MethodType type)
      throws Exception {
    return new ConstantCallSite(caller.findStatic(caller.lookupClass(), name, type));
  }

  // Actual valid static bootstrap method.
  public static CallSite staticMethod(MethodHandles.Lookup caller, String name, MethodType type)
      throws Exception {
    return new ConstantCallSite(caller.findStatic(caller.lookupClass(), name, type));
  }

  // Constructor to target.
  public InvalidBootstrapMethodHandleTestClass() {}

  // Called by the valid virtual invoke.
  public static void foo() {
    System.out.println("Called foo!");
  }

  public static void main(String[] args) {
    try {
      // Rewritten to invoke-dynamic for each handle type.
      foo();
    } catch (BootstrapMethodError e) {
      System.out.println(e.getCause().getMessage());
      throw e;
    }
  }
}
