| // 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 enum ExampleEnumCompilation { |
| CASE1, |
| CASE2, |
| CASE3; |
| } |
| |
| 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 join( |
| ", ", |
| new String[] { |
| 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 join( |
| ", ", |
| new String[] { |
| 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 join( |
| ", ", |
| new String[] { |
| 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 join( |
| ", ", |
| new String[] { |
| 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(); |
| } |
| } |
| } |
| |
| public static String join(String separator, String[] strings) { |
| StringBuilder sb = new StringBuilder(strings[0]); |
| for (int i = 1; i < strings.length; i++) { |
| sb.append(separator).append(strings[i]); |
| } |
| return sb.toString(); |
| } |
| |
| @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)); |
| |
| System.out.println(ExampleEnumCompilation.values().length); |
| } |
| } |