blob: a9863cc21bbab9aa1b06ae51d73804373d98f9d8 [file] [log] [blame]
// 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;
// Warning: This requires Java 9+ to be compiled (private interface methods)
// This file builds all the possible combinations of private members:
// - static VS non-static
// - fields VS methods
// - multiple nesting levels
// - nested interfaces
// Note: Inner interfaces have to be static.
// Then the accessPrivate methods generate all possibles calls.
// Each instance is created through a private constructor to test them too.
@SuppressWarnings("WeakerAccess")
public class NestHostExample {
private String method() {
return "hostMethod";
}
private static String staticMethod() {
return "staticHostMethod";
}
private String field;
private static String staticField = "staticField";
private NestHostExample(String field) {
this.field = field;
}
public StaticNestMemberInner createStaticNestMemberInner(String field) {
return new StaticNestMemberInner(field);
}
public NestMemberInner createNestMemberInner(String field) {
return new NestMemberInner(field);
}
@SuppressWarnings("static-access") // we want to test that too.
public String accessPrivate(
NestHostExample o0,
StaticNestMemberInner o1,
StaticNestMemberInner.StaticNestMemberInnerInner o2,
NestMemberInner o3,
NestMemberInner.NestMemberInnerInner o4) {
return o0.field
+ o0.staticField
+ NestHostExample.staticField
+ o0.method()
+ o0.staticMethod()
+ NestHostExample.staticMethod()
+ o1.field
+ o1.staticField
+ StaticNestMemberInner.staticField
+ o1.method()
+ o1.staticMethod()
+ StaticNestMemberInner.staticMethod()
+ o2.field
+ o2.staticField
+ StaticNestMemberInner.StaticNestMemberInnerInner.staticField
+ o2.method()
+ o2.staticMethod()
+ StaticNestMemberInner.StaticNestMemberInnerInner.staticMethod()
+ o3.field
+ o3.method()
+ o4.field
+ o4.method();
}
public String accessPrivateInterface(StaticNestInterfaceInner i1) {
return i1.interfaceMethod() + StaticNestInterfaceInner.staticInterfaceMethod();
}
// Nested interface (has to be static)
public interface StaticNestInterfaceInner {
private String interfaceMethod() {
return "staticInterfaceMethod";
}
private static String staticInterfaceMethod() {
return "staticStaticInterfaceMethod";
}
public static NestHostExample createNestHostExample(String field) {
return new NestHostExample(field);
}
@SuppressWarnings("static-access") // we want to test that too.
default String accessPrivate(
NestHostExample o0,
StaticNestMemberInner o1,
StaticNestMemberInner.StaticNestMemberInnerInner o2,
NestMemberInner o3,
NestMemberInner.NestMemberInnerInner o4) {
return o0.field
+ o0.staticField
+ NestHostExample.staticField
+ o0.method()
+ o0.staticMethod()
+ NestHostExample.staticMethod()
+ o1.field
+ o1.staticField
+ StaticNestMemberInner.staticField
+ o1.method()
+ o1.staticMethod()
+ StaticNestMemberInner.staticMethod()
+ o2.field
+ o2.staticField
+ StaticNestMemberInner.StaticNestMemberInnerInner.staticField
+ o2.method()
+ o2.staticMethod()
+ StaticNestMemberInner.StaticNestMemberInnerInner.staticMethod()
+ o3.field
+ o3.method()
+ o4.field
+ o4.method();
}
default String accessPrivateInterface(StaticNestInterfaceInner i1) {
return i1.interfaceMethod() + StaticNestInterfaceInner.staticInterfaceMethod();
}
}
// Static Nest mates
public static class StaticNestMemberInner {
private String method() {
return "nest1SMethod";
}
private static String staticMethod() {
return "staticNest1SMethod";
}
private String field;
private static String staticField = "staticNest1SField";
private StaticNestMemberInner(String field) {
this.field = field;
}
public static StaticNestMemberInnerInner createStaticNestMemberInnerInner(String field) {
return new StaticNestMemberInnerInner(field);
}
public static class StaticNestMemberInnerInner implements StaticNestInterfaceInner {
private String method() {
return "nest2SMethod";
}
private static String staticMethod() {
return "staticNest2SMethod";
}
private String field;
private static String staticField = "staticNest2SField";
private StaticNestMemberInnerInner(String field) {
this.field = field;
}
@SuppressWarnings("static-access") // we want to test that too.
public String accessPrivate(
NestHostExample o0,
StaticNestMemberInner o1,
StaticNestMemberInner.StaticNestMemberInnerInner o2,
NestMemberInner o3,
NestMemberInner.NestMemberInnerInner o4) {
return o0.field
+ o0.staticField
+ NestHostExample.staticField
+ o0.method()
+ o0.staticMethod()
+ NestHostExample.staticMethod()
+ o1.field
+ o1.staticField
+ StaticNestMemberInner.staticField
+ o1.method()
+ o1.staticMethod()
+ StaticNestMemberInner.staticMethod()
+ o2.field
+ o2.staticField
+ StaticNestMemberInner.StaticNestMemberInnerInner.staticField
+ o2.method()
+ o2.staticMethod()
+ StaticNestMemberInner.StaticNestMemberInnerInner.staticMethod()
+ o3.field
+ o3.method()
+ o4.field
+ o4.method();
}
public String accessPrivateInterface(StaticNestInterfaceInner i1) {
return i1.interfaceMethod() + StaticNestInterfaceInner.staticInterfaceMethod();
}
}
}
// Non static Nest mates
public class NestMemberInner {
private String method() {
return "nest1Method";
}
private String field;
private NestMemberInner(String field) {
this.field = field;
}
public NestMemberInnerInner createNestMemberInnerInner(String field) {
return new NestMemberInnerInner(field);
}
public class NestMemberInnerInner {
private String method() {
return "nest2Method";
}
private String field;
private NestMemberInnerInner(String field) {
this.field = field;
}
@SuppressWarnings("static-access") // we want to test that too.
public String accessPrivate(
NestHostExample o0,
StaticNestMemberInner o1,
StaticNestMemberInner.StaticNestMemberInnerInner o2,
NestMemberInner o3,
NestMemberInner.NestMemberInnerInner o4) {
return o0.field
+ o0.staticField
+ NestHostExample.staticField
+ o0.method()
+ o0.staticMethod()
+ NestHostExample.staticMethod()
+ o1.field
+ o1.staticField
+ StaticNestMemberInner.staticField
+ o1.method()
+ o1.staticMethod()
+ StaticNestMemberInner.staticMethod()
+ o2.field
+ o2.staticField
+ StaticNestMemberInner.StaticNestMemberInnerInner.staticField
+ o2.method()
+ o2.staticMethod()
+ StaticNestMemberInner.StaticNestMemberInnerInner.staticMethod()
+ o3.field
+ o3.method()
+ o4.field
+ o4.method();
}
public String accessPrivateInterface(StaticNestInterfaceInner i1) {
return i1.interfaceMethod() + StaticNestInterfaceInner.staticInterfaceMethod();
}
}
}
@SuppressWarnings("all") // do not know how to remove the redundant i1 variable
public static void main(String[] args) {
NestHostExample o0 = StaticNestInterfaceInner.createNestHostExample("field");
StaticNestMemberInner o1 = o0.createStaticNestMemberInner("nest1SField");
StaticNestMemberInner.StaticNestMemberInnerInner o2 =
o1.createStaticNestMemberInnerInner("nest2SField");
NestMemberInner o3 = o0.createNestMemberInner("nest1Field");
NestMemberInner.NestMemberInnerInner o4 = o3.createNestMemberInnerInner("nest2Field");
StaticNestInterfaceInner i1 = o2;
System.out.println(o0.accessPrivate(o0, o1, o2, o3, o4));
System.out.println(o2.accessPrivate(o0, o1, o2, o3, o4));
System.out.println(o4.accessPrivate(o0, o1, o2, o3, o4));
System.out.println(i1.accessPrivate(o0, o1, o2, o3, o4));
System.out.println(o0.accessPrivateInterface(i1));
System.out.println(o2.accessPrivateInterface(i1));
System.out.println(o4.accessPrivateInterface(i1));
System.out.println(i1.accessPrivateInterface(i1));
// Expected results: 4x
// fieldstaticFieldstaticFieldhostMethodstaticHostMethodstaticHostMethodnest1SField
// staticNest1SFieldstaticNest1SFieldnest1SMethodstaticNest1SMethodstaticNest1SMethod
// nest2SFieldstaticNest2SFieldstaticNest2SFieldnest2SMethodstaticNest2SMethod
// staticNest2SMethodnest1Fieldnest1Methodnest2Fieldnest2Method
// staticInterfaceMethodstaticStaticInterfaceMethod
}
}