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