// Copyright (c) 2019, 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 nesthostexample;

import com.android.tools.r8.NeverInline;
import com.android.tools.r8.NeverPropagateValue;

public class NestPvtMethodCallInlined {

  public static class Inner {

    public String methodWithPvtCallToInline() {
      return notInlinedPvtCall();
    }

    @NeverInline
    @NeverPropagateValue
    private String notInlinedPvtCall() {
      return "notInlinedPvtCallInner";
    }

    private String nestPvtCallToInline() {
      return "nestPvtCallToInlineInner";
    }
  }

  public interface InnerInterface {

    default String methodWithPvtCallToInline() {
      return notInlinedPvtCall();
    }

    @NeverInline
    @NeverPropagateValue
    private String notInlinedPvtCall() {
      return "notInlinedPvtCallInnerInterface";
    }

    private String nestPvtCallToInline() {
      return "nestPvtCallToInlineInnerInterface";
    }

    default String dispatch(InnerSub sub) {
      return sub.notInlinedPvtCall();
    }

    @NeverInline
    @NeverPropagateValue
    default String dispatchInlining(InnerSub iSub) {
      return iSub.dispatch(this);
    }
  }

  public static class InnerInterfaceImpl implements InnerInterface {}

  public static class InnerSub extends Inner {

    @NeverInline
    @NeverPropagateValue
    public String dispatchInlining(InnerInterface impl) {
      return impl.dispatch(this);
    }

    public String dispatch(InnerInterface itf) {
      return itf.notInlinedPvtCall();
    }

    @NeverInline
    @NeverPropagateValue
    private String notInlinedPvtCall() {
      return "notInlinedPvtCallInnerSub";
    }

    private String nestPvtCallToInline() {
      return "nestPvtCallToInlineInnerSub";
    }
  }

  public static void main(String[] args) {
    Inner i = new Inner();
    InnerSub iSub = new InnerSub();
    InnerInterface impl = new InnerInterfaceImpl();

    // Inlining through nest access (invoke virtual/interface).
    System.out.println(i.nestPvtCallToInline());
    System.out.println(impl.nestPvtCallToInline());

    // Inlining transformations.
    // Invoke direct -> invoke virtual.
    System.out.println(i.methodWithPvtCallToInline());
    // Invoke interface -> invoke virtual.
    System.out.println(impl.methodWithPvtCallToInline());
    // Invoke virtual -> invoke direct.
    System.out.println(iSub.dispatchInlining(impl));
    // Invoke interface -> invoke direct.
    System.out.println(impl.dispatchInlining(iSub));

    // Inheritance + invoke virtual and nest access.
    // This may mess up lookup logic.
    System.out.println(iSub.nestPvtCallToInline());
    System.out.println(((Inner) iSub).nestPvtCallToInline());
  }
}
