|  | // 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 | 
|  | } | 
|  | } |