// 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.bridgeremoval.hoisting.testclasses;

import com.android.tools.r8.KeepConstantArguments;
import com.android.tools.r8.NeverInline;
import com.android.tools.r8.NoHorizontalClassMerging;
import com.android.tools.r8.NoVerticalClassMerging;
import com.android.tools.r8.bridgeremoval.hoisting.BridgeHoistingAccessibilityTest;
import com.android.tools.r8.bridgeremoval.hoisting.BridgeHoistingAccessibilityTest.CWithRangedInvoke;

public class BridgeHoistingAccessibilityTestClasses {

  @NoHorizontalClassMerging
  @NoVerticalClassMerging
  public static class A {

    @NeverInline
    public Object m(String arg) {
      return System.currentTimeMillis() > 0 ? arg : null;
    }
  }

  public static class User {

    @NeverInline
    public static String invokeBridgeC(BridgeHoistingAccessibilityTest.C instance) {
      return instance.bridgeC(" world!");
    }
  }

  @NoVerticalClassMerging
  public static class AWithRangedInvoke {

    @KeepConstantArguments
    @NeverInline
    public Object m(String arg, int a, int b, int c, int d, int e) {
      return System.currentTimeMillis() > 0 ? arg + a + b + c + d + e : null;
    }
  }

  public static class UserWithRangedInvoke {

    @NeverInline
    public static String invokeBridgeC(CWithRangedInvoke instance) {
      return instance.bridgeC(" world! ", 1, 2, 3, 4, 5);
    }
  }
}
