blob: e2e3c845379ee69ddb5ae616058648e356aab384 [file] [log] [blame]
// Copyright 2019 The Bazel Authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package com.google.devtools.build.android.desugar.nest.testsrc.simpleunit.method;
/** A nest for testing private method desugaring. */
@SuppressWarnings("MethodCanBeStatic") // Intentional for testing.
public class MethodNest {
/** A nest member that encloses private methods with cross-mate invocations. */
public static class MethodOwnerMate {
static long staticMethod(long x, int y) {
return x + y;
}
long instanceMethod(long x, int y) {
return x + y;
}
private static long privateStaticMethod(long x, int y) {
return x + y;
}
private long privateInstanceMethod(long x, int y) throws Exception {
return x + y;
}
// No generation of bridge methods.
private long inClassBoundInstanceMethod(long x) {
return x == 0 ? 0 : x + inClassBoundInstanceMethod(x - 1);
}
// No generation of bridge methods.
private static long inClassBoundStaticMethod(long x) {
return x == 0 ? 0 : x + inClassBoundStaticMethod(x - 1);
}
}
/** A nest member that has access to cross-mate private methods through inheritance. */
public static class SubMate extends MethodOwnerMate {
public static long invokePrivateStaticMethod(long x, int y) {
return MethodOwnerMate.privateStaticMethod(x, y);
}
public long superAccessPrivateInstanceMethod(long x, int y) throws Exception {
return 1 + super.privateInstanceMethod(x, y);
}
public long castAccessPrivateInstanceMethod(long x, int y) throws Exception {
return 2 + ((MethodOwnerMate) this).privateInstanceMethod(x, y);
}
}
public static long populatedFromInvokePrivateStaticMethod;
public long populatedFromInvokePrivateInstanceMethod;
// For testing a static initializer block.
static {
long t = MethodOwnerMate.privateStaticMethod(128L, 256);
populatedFromInvokePrivateStaticMethod = 1 + t;
}
// For testing a instance initializer block.
{
try {
populatedFromInvokePrivateInstanceMethod =
new MethodOwnerMate().privateInstanceMethod(256L, 512);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@SuppressWarnings("StaticQualifiedUsingExpression") // Intentionally for testing.
public static long invokeStaticMethod(long x, int y) {
MethodOwnerMate methodOwnerMate = null;
return methodOwnerMate.staticMethod(x, y);
}
public static long invokeInstanceMethod(MethodOwnerMate mateInstance, long x, int y) {
return mateInstance.instanceMethod(x, y);
}
public static long invokePrivateStaticMethod(long x, int y) {
return MethodOwnerMate.privateStaticMethod(x, y);
}
public static long invokePrivateInstanceMethod(MethodOwnerMate mateInstance, long x, int y)
throws Exception {
return mateInstance.privateInstanceMethod(x, y);
}
public static long invokeSuperAccessPrivateInstanceMethod(SubMate subMate, long x, int y)
throws Exception {
return subMate.superAccessPrivateInstanceMethod(x, y);
}
public static long invokeCastAccessPrivateInstanceMethod(SubMate subMate, long x, int y)
throws Exception {
return subMate.castAccessPrivateInstanceMethod(x, y);
}
public static void main(String[] args) {
System.out.println("hello2");
}
}