/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* 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.
*/
/*
*
* @summary Check getEnclosingClass and other methods
* @author Peter von der Ah\u00e9
*
* a) Top level classes
* b) Nested classes (static member classes)
* c) Inner classes (non-static member classes)
* d) Local classes (named classes declared within a method)
* e) Anonymous classes
*/
/*
* TODO:
* Test annotations
* Test Locals in static initializers
* Test Locals in methods
* Test Locals in constructors
* Test interfaces
* Test enums
* Test method with a String[] argument
*/
//package
interface MakeClass {
}
public class EnclosingClass {
public EnclosingClass() {
}
static class Nested {
static class NestedNested {
}
class NestedInner {
}
{
class NestedLocal0 {};
nestedLocal0 = NestedLocal0.class;
}
void nestedMethod1() {
class NestedLocal1 {}
nestedLocal1 = NestedLocal1.class;
}
class NestedLocal2 {}
nestedLocal2 = NestedLocal2.class;
}
static enum NestedNestedEnum {
}
enum NestedInnerEnum {
}
}
class Inner {
class InnerInner {
}
{
class InnerLocal0 {
};
innerLocal0 = InnerLocal0.class;
innerMethod1();
}
void innerMethod1() {
class InnerLocal1 {}
innerLocal1 = InnerLocal1.class;
}
class InnerLocal2 {}
innerLocal2 = InnerLocal2.class;
}
}
encl="null",
simple="EnclosingClass",
canonical="EnclosingClass")
public Class<?> a = EnclosingClass.class;
encl="class EnclosingClass",
simple="Nested",
canonical="EnclosingClass.Nested")
encl="class EnclosingClass",
simple="Inner",
canonical="EnclosingClass.Inner")
encl="class EnclosingClass",
simple="Local0",
hasCanonical=false)
encl="class EnclosingClass",
simple="Local1",
hasCanonical=false)
encl="class EnclosingClass",
simple="Local2",
hasCanonical=false)
encl="class EnclosingClass",
simple="StaticLocal0",
hasCanonical=false)
encl="class EnclosingClass",
simple="StaticLocal1",
hasCanonical=false)
encl="class EnclosingClass",
simple="StaticLocal2",
hasCanonical=false)
{
class Local0 {
class LocalInner {}
{
class LocalLocal {};
dd = LocalLocal.class;
}
};
new Local0();
method1();
sad0 = staticLocal0;
sad1 = staticMethod1();
}
static {
class StaticLocal0 {};
staticLocal0 = StaticLocal0.class;
}
class StaticLocal1 {};
return StaticLocal1.class;
}
class StaticLocal2 {};
return StaticLocal2.class;
}
void method1() {
class Local1 {};
}
class Local2 {};
}
encl="class EnclosingClass",
simple="",
hasCanonical=false)
encl="class EnclosingClass",
simple="",
hasCanonical=false)
encl="class EnclosingClass$Nested",
simple="NestedNested",
canonical="EnclosingClass.Nested.NestedNested")
encl="class EnclosingClass$Nested",
simple="NestedInner",
canonical="EnclosingClass.Nested.NestedInner")
encl="class EnclosingClass$Nested",
simple="NestedLocal0",
hasCanonical=false)
encl="class EnclosingClass$Nested",
simple="NestedLocal1",
hasCanonical=false)
encl="class EnclosingClass$Nested",
simple="NestedLocal2",
hasCanonical=false)
encl="class EnclosingClass$Nested",
simple="",
hasCanonical=false)
encl="class EnclosingClass$Inner",
simple="InnerInner",
canonical="EnclosingClass.Inner.InnerInner")
encl="class EnclosingClass$Inner",
simple="InnerLocal0",
hasCanonical=false)
encl="class EnclosingClass$Inner",
simple="",
hasCanonical=false)
encl="class EnclosingClass$1Local0",
simple="LocalInner",
hasCanonical=false)
encl="class EnclosingClass$1Local0",
simple="LocalLocal",
hasCanonical=false)
encl="class EnclosingClass$1Local0",
simple="",
hasCanonical=false)
encl="class EnclosingClass$3",
simple="AnonymousInner",
hasCanonical=false)
class AnonymousInner {}
}.make();
encl="class EnclosingClass$4",
simple="AnonymousLocal",
hasCanonical=false)
Class<?> c;
{
class AnonymousLocal {}
c = AnonymousLocal.class;
}
}.make();
encl="class EnclosingClass$5",
simple="",
hasCanonical=false)
Class<?> c;
{
}
}.make();
encl="null",
simple="boolean",
canonical="boolean")
encl="null",
simple="char",
canonical="char")
encl="null",
simple="byte",
canonical="byte")
encl="null",
simple="short",
canonical="short")
encl="null",
simple="int",
canonical="int")
encl="null",
simple="long",
canonical="long")
encl="null",
simple="float",
canonical="float")
encl="null",
simple="double",
canonical="double")
encl="null",
simple="void",
canonical="void")
}