/* * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ package runtime.valhalla.nestmates.p2; // a class that contains all possible nested classes public class InnerClassesHolder { // constants to be referenced from the tests public static final String MODIFIER_PRIVATE = "private"; public static final String MODIFIER_PROTECTED = "protected"; public static final String MODIFIER_PPRIVATE = "pprivate"; public static final String MODIFIER_PUBLIC = "public"; private int fieldPrivate = 1; protected int fieldProtected = 2; int fieldPPrivate = 3; public int fieldPublic = 4; private static int staticFieldPrivate = 1; protected static int staticFieldProtected = 2; static int staticFieldPPrivate = 3; public static int staticFieldPublic = 4; public static class StaticNestedClass { public static int getEnclosingFieldValue(String modifier) { int returnValue = -1; switch (modifier) { case MODIFIER_PRIVATE: { returnValue = staticFieldPrivate; break; } case MODIFIER_PROTECTED: { returnValue = staticFieldProtected; break; } case MODIFIER_PPRIVATE: { returnValue = staticFieldPPrivate; break; } case MODIFIER_PUBLIC: { returnValue = staticFieldPublic; break; } } return returnValue; } } public class InnerBase { public int getEnclosingFieldValue(String modifier) { int returnValue = -1; switch (modifier) { case MODIFIER_PRIVATE: { returnValue = fieldPrivate; break; } case MODIFIER_PROTECTED: { returnValue = fieldProtected; break; } case MODIFIER_PPRIVATE: { returnValue = fieldPPrivate; break; } case MODIFIER_PUBLIC: { returnValue = fieldPublic; break; } } return returnValue; } } public class InnerClass extends InnerBase { } public class InnerCousin { private InnerClass innerClass; public InnerCousin(InnerClass innerClass) { this.innerClass = innerClass; } public int getEnclosingFieldValue(String modifier) { return innerClass.getEnclosingFieldValue(modifier); } } public int getValueFromLocalClass(String modifier) { class Local { public int getEnclosingFieldValue(String modifier) { int returnValue = -1; switch (modifier) { case MODIFIER_PRIVATE: { returnValue = fieldPrivate; break; } case MODIFIER_PROTECTED: { returnValue = fieldProtected; break; } case MODIFIER_PPRIVATE: { returnValue = fieldPPrivate; break; } case MODIFIER_PUBLIC: { returnValue = fieldPublic; break; } } return returnValue; } } Local local = new Local(); return local.getEnclosingFieldValue(modifier); } interface HelloWorld { int getEnclosingFieldValue(String modifier); } public int getValueFromAnonClass(String modifier) { HelloWorld helloWorld = modifier1 -> { int returnValue = -1; switch (modifier1) { case MODIFIER_PRIVATE: { returnValue = fieldPrivate; break; } case MODIFIER_PROTECTED: { returnValue = fieldProtected; break; } case MODIFIER_PPRIVATE: { returnValue = fieldPPrivate; break; } case MODIFIER_PUBLIC: { returnValue = fieldPublic; break; } } return returnValue; }; return helloWorld.getEnclosingFieldValue(modifier); } }