blob: e6b44b31e7db326acf70cbf63651b4bad326ee32 [file] [log] [blame]
// Copyright (c) 2018, 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.naming;
public class LambdaRenamingTest {
public static final Class[] CLASSES = {
LambdaRenamingTest.class,
Interface.class,
DummyInterface1.class,
DummyInterface2.class,
DummyInterface3.class,
DummyInterface4.class,
ObjectInterface.class,
IntegerInterface.class,
ReservedNameObjectInterface1.class,
ReservedNameIntegerInterface1.class,
ReservedNameObjectInterface2.class,
ReservedNameIntegerInterface2.class,
InexactImplementation.class,
DummyImplementation.class,
ReservedImplementation1.class,
ReservedImplementation2.class,
};
interface Interface {
String method();
}
// Interface methods are renamed in decreasing order of number of interfaces they appear in.
// Define many interfaces with "Object foo();" so that it will receive the first name "a".
// Define "Object inexactMethod();" in one of them so that it will be named "b".
// Then define "Integer inexactMethod();" in an unrelated interface so it will be named "a"
// (when renaming aggressively).
interface DummyInterface1 {
Object foo();
Object inexactMethod();
}
interface DummyInterface2 {
Object foo();
}
interface DummyInterface3 {
Object foo();
}
interface DummyInterface4 {
Object foo();
}
interface ObjectInterface {
Object inexactMethod();
}
interface IntegerInterface {
Integer inexactMethod();
}
interface ReservedNameObjectInterface1 {
// The following method is explicitly kept in the test's ProGuard config.
Object reservedMethod1();
}
interface ReservedNameIntegerInterface1 {
Integer reservedMethod1();
}
interface ReservedNameObjectInterface2 {
Object reservedMethod2();
}
interface ReservedNameIntegerInterface2 {
// The following method is explicitly kept in the test's ProGuard config.
Integer reservedMethod2();
}
static class InexactImplementation implements ObjectInterface, DummyInterface1, IntegerInterface {
@Override
public Object foo() {
return null;
}
@Override
public Integer inexactMethod() {
return 10;
}
}
static class DummyImplementation implements DummyInterface1 {
@Override
public Object foo() {
return null;
}
@Override
public Integer inexactMethod() {
return 11;
}
}
static class ReservedImplementation1
implements ReservedNameIntegerInterface1, ReservedNameObjectInterface1 {
@Override
public Integer reservedMethod1() {
return 101;
}
}
static class ReservedImplementation2
implements ReservedNameIntegerInterface2, ReservedNameObjectInterface2 {
@Override
public Integer reservedMethod2() {
return 102;
}
}
public static void main(String[] args) {
dummyMethod(new InexactImplementation(), () -> null, () -> null, () -> null);
dummyMethod(new DummyImplementation(), () -> null, () -> null, () -> null);
invokeInteger(new InexactImplementation());
invokeInteger((IntegerInterface) getInexactLambda());
invokeObject(new InexactImplementation());
invokeObject((ObjectInterface) getInexactLambda());
invokeIntegerReserved1(new ReservedImplementation1());
invokeIntegerReserved1((ReservedNameIntegerInterface1) getReservedLambda1());
invokeObjectReserved1(new ReservedImplementation1());
invokeObjectReserved1((ReservedNameObjectInterface1) getReservedLambda1());
invokeIntegerReserved2(new ReservedImplementation2());
invokeIntegerReserved2((ReservedNameIntegerInterface2) getReservedLambda2());
invokeObjectReserved2(new ReservedImplementation2());
invokeObjectReserved2((ReservedNameObjectInterface2) getReservedLambda2());
}
private static Object getInexactLambda() {
return (IntegerInterface & ObjectInterface) () -> 30;
}
private static Object getReservedLambda1() {
return (ReservedNameIntegerInterface1 & ReservedNameObjectInterface1) () -> 301;
}
private static Object getReservedLambda2() {
return (ReservedNameIntegerInterface2 & ReservedNameObjectInterface2) () -> 302;
}
private static void dummyMethod(
DummyInterface1 instance1,
DummyInterface2 instance2,
DummyInterface3 instance3,
DummyInterface4 instance4) {
System.out.println(instance1.foo());
System.out.println(instance2.foo());
System.out.println(instance3.foo());
System.out.println(instance4.foo());
System.out.println(instance1.inexactMethod());
}
private static void invokeInteger(IntegerInterface instance) {
System.out.println(instance.inexactMethod());
}
private static void invokeObject(ObjectInterface instance) {
System.out.println(instance.inexactMethod());
}
private static void invokeIntegerReserved1(ReservedNameIntegerInterface1 instance) {
System.out.println(instance.reservedMethod1());
}
private static void invokeObjectReserved1(ReservedNameObjectInterface1 instance) {
System.out.println(instance.reservedMethod1());
}
private static void invokeIntegerReserved2(ReservedNameIntegerInterface2 instance) {
System.out.println(instance.reservedMethod2());
}
private static void invokeObjectReserved2(ReservedNameObjectInterface2 instance) {
System.out.println(instance.reservedMethod2());
}
}