blob: 1b6675c31f7b95d24a2d1ef01a41b4f4439ff4b1 [file] [log] [blame]
J. Duke319a3b92007-12-01 00:00:00 +00001/*
2 * Copyright 2004 Sun Microsystems, Inc. All Rights Reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
20 * CA 95054 USA or visit www.sun.com if you need additional information or
21 * have any questions.
22 */
23
24/*
25 *
26 * @summary Check getEnclosingClass and other methods
27 * @author Peter von der Ah\u00e9
28 *
29 * a) Top level classes
30 * b) Nested classes (static member classes)
31 * c) Inner classes (non-static member classes)
32 * d) Local classes (named classes declared within a method)
33 * e) Anonymous classes
34 */
35
36/*
37 * TODO:
38 * Test annotations
39 * Test Locals in static initializers
40 * Test Locals in methods
41 * Test Locals in constructors
42 * Test interfaces
43 * Test enums
44 * Test method with a String[] argument
45 */
46
47//package
48
49import common.TestMe;
50
51interface MakeClass {
52 Class<?> make();
53}
54
55public class EnclosingClass {
56 public EnclosingClass() {
57 aec = (new Object() {}).getClass();
58 }
59 static class Nested {
60 static class NestedNested {
61 }
62 class NestedInner {
63 }
64 Class<?> nestedLocal0;
65 Class<?> nestedLocal1;
66 Class<?> nestedLocal2;
67 {
68 class NestedLocal0 {};
69 nestedLocal0 = NestedLocal0.class;
70 nestedMethod1();
71 nestedMethod2(null);
72 }
73 void nestedMethod1() {
74 class NestedLocal1 {}
75 nestedLocal1 = NestedLocal1.class;
76 }
77 void nestedMethod2(String[] args) {
78 class NestedLocal2 {}
79 nestedLocal2 = NestedLocal2.class;
80 }
81 Class<?> nestedAnonymous = (new Object() {}).getClass();
82 static enum NestedNestedEnum {
83 }
84 enum NestedInnerEnum {
85 }
86 }
87
88 class Inner {
89 class InnerInner {
90 }
91 Class<?> innerLocal0;
92 Class<?> innerLocal1;
93 Class<?> innerLocal2;
94 {
95 class InnerLocal0 {
96 };
97 innerLocal0 = InnerLocal0.class;
98 innerMethod1();
99 innerMethod2(null);
100 }
101 void innerMethod1() {
102 class InnerLocal1 {}
103 innerLocal1 = InnerLocal1.class;
104 }
105 void innerMethod2(String[] args) {
106 class InnerLocal2 {}
107 innerLocal2 = InnerLocal2.class;
108 }
109 Class<?> innerAnonymous = (new Object() {}).getClass();
110 }
111
112 @TestMe(desc="top level class",
113 encl="null",
114 simple="EnclosingClass",
115 canonical="EnclosingClass")
116 public Class<?> a = EnclosingClass.class;
117
118 @TestMe(desc="nested class within top level class",
119 encl="class EnclosingClass",
120 simple="Nested",
121 canonical="EnclosingClass.Nested")
122 public Class<?> ab = Nested.class;
123 @TestMe(desc="inner class within top level class",
124 encl="class EnclosingClass",
125 simple="Inner",
126 canonical="EnclosingClass.Inner")
127 public Class<?> ac = Inner.class;
128 @TestMe(desc="local class within top level class",
129 encl="class EnclosingClass",
130 simple="Local0",
131 hasCanonical=false)
132 public Class<?> ad0;
133 @TestMe(desc="local class within top level class",
134 encl="class EnclosingClass",
135 simple="Local1",
136 hasCanonical=false)
137 public Class<?> ad1;
138 @TestMe(desc="local class within top level class",
139 encl="class EnclosingClass",
140 simple="Local2",
141 hasCanonical=false)
142 public Class<?> ad2;
143 @TestMe(desc="local class within a top level class static initializer" ,
144 encl="class EnclosingClass",
145 simple="StaticLocal0",
146 hasCanonical=false)
147 public Class<?> sad0;
148 @TestMe(desc="local class within a top level class static method" ,
149 encl="class EnclosingClass",
150 simple="StaticLocal1",
151 hasCanonical=false)
152 public Class<?> sad1;
153 @TestMe(desc="local class within a top level class static method",
154 encl="class EnclosingClass",
155 simple="StaticLocal2",
156 hasCanonical=false)
157 public Class<?> sad2;
158 {
159 class Local0 {
160 class LocalInner {}
161 {
162 class LocalLocal {};
163 dd = LocalLocal.class;
164 de = (new Object() {}).getClass();
165 }
166 };
167 ad0 = Local0.class;
168 dc = Local0.LocalInner.class;
169 new Local0();
170 method1();
171 method2(null);
172 sad0 = staticLocal0;
173 sad1 = staticMethod1();
174 sad2 = staticMethod2(null);
175 }
176 static Class<?> staticLocal0;
177 static {
178 class StaticLocal0 {};
179 staticLocal0 = StaticLocal0.class;
180 }
181 static Class<?> staticMethod1() {
182 class StaticLocal1 {};
183 return StaticLocal1.class;
184 }
185 static Class<?> staticMethod2(String[] args) {
186 class StaticLocal2 {};
187 return StaticLocal2.class;
188 }
189 void method1() {
190 class Local1 {};
191 ad1 = Local1.class;
192 }
193 void method2(String[] args) {
194 class Local2 {};
195 ad2 = Local2.class;
196 }
197 @TestMe(desc="anonymous class within top level class",
198 encl="class EnclosingClass",
199 simple="",
200 hasCanonical=false)
201 public Class<?> ae = (new Object() {}).getClass();
202 @TestMe(desc="anonymous class within top level class constructor",
203 encl="class EnclosingClass",
204 simple="",
205 hasCanonical=false)
206 public Class<?> aec;
207
208 @TestMe(desc="nested class within nested class",
209 encl="class EnclosingClass$Nested",
210 simple="NestedNested",
211 canonical="EnclosingClass.Nested.NestedNested")
212 public Class<?> bb = Nested.NestedNested.class;
213 @TestMe(desc="inner class within nested class",
214 encl="class EnclosingClass$Nested",
215 simple="NestedInner",
216 canonical="EnclosingClass.Nested.NestedInner")
217 public Class<?> bc = Nested.NestedInner.class;
218 @TestMe(desc="local class within nested class",
219 encl="class EnclosingClass$Nested",
220 simple="NestedLocal0",
221 hasCanonical=false)
222 public Class<?> bd0 = (new Nested()).nestedLocal0;
223 @TestMe(desc="local class within nested class",
224 encl="class EnclosingClass$Nested",
225 simple="NestedLocal1",
226 hasCanonical=false)
227 public Class<?> bd1 = (new Nested()).nestedLocal1;
228 @TestMe(desc="local class within nested class",
229 encl="class EnclosingClass$Nested",
230 simple="NestedLocal2",
231 hasCanonical=false)
232 public Class<?> bd2 = (new Nested()).nestedLocal2;
233 @TestMe(desc="anonymous class within nested class",
234 encl="class EnclosingClass$Nested",
235 simple="",
236 hasCanonical=false)
237 public Class<?> be = (new Nested()).nestedAnonymous;
238
239 @TestMe(desc="nested class within an inner class", encl="", simple="")
240 public Class<?> cb = Void.class; // not legal
241 @TestMe(desc="inner class within an inner class",
242 encl="class EnclosingClass$Inner",
243 simple="InnerInner",
244 canonical="EnclosingClass.Inner.InnerInner")
245 public Class<?> cc = ((new Inner()).new InnerInner()).getClass();
246 @TestMe(desc="local class within an inner class",
247 encl="class EnclosingClass$Inner",
248 simple="InnerLocal0",
249 hasCanonical=false)
250 public Class<?> cd = (new Inner()).innerLocal0;
251 @TestMe(desc="anonymous class within an inner class",
252 encl="class EnclosingClass$Inner",
253 simple="",
254 hasCanonical=false)
255 public Class<?> ce = (new Inner()).innerAnonymous;
256
257 @TestMe(desc="nested class within a local class", encl="", simple="")
258 public Class<?> db = Void.class; // not legal
259 @TestMe(desc="inner class within a local class",
260 encl="class EnclosingClass$1Local0",
261 simple="LocalInner",
262 hasCanonical=false)
263 public Class<?> dc; // initialized above
264 @TestMe(desc="local class within a local class",
265 encl="class EnclosingClass$1Local0",
266 simple="LocalLocal",
267 hasCanonical=false)
268 public Class<?> dd; // initialized above
269 @TestMe(desc="anonymous class within a local class",
270 encl="class EnclosingClass$1Local0",
271 simple="",
272 hasCanonical=false)
273 public Class<?> de; // initialized above
274
275 @TestMe(desc="nested class within an anonymous class", encl="", simple="")
276 public Class<?> eb = Void.class; // not legal
277 @TestMe(desc="inner class within an anonymous class",
278 encl="class EnclosingClass$3",
279 simple="AnonymousInner",
280 hasCanonical=false)
281 public Class<?> ec = new MakeClass() {
282 class AnonymousInner {}
283 public Class<?> make() { return AnonymousInner.class; }
284 }.make();
285 @TestMe(desc="local class within an anonymous class",
286 encl="class EnclosingClass$4",
287 simple="AnonymousLocal",
288 hasCanonical=false)
289 public Class<?> ed = new MakeClass() {
290 Class<?> c;
291 {
292 class AnonymousLocal {}
293 c = AnonymousLocal.class;
294 }
295 public Class<?> make() { return c; }
296 }.make();
297 @TestMe(desc="anonymous class within an anonymous class",
298 encl="class EnclosingClass$5",
299 simple="",
300 hasCanonical=false)
301 public Class<?> ee = new MakeClass() {
302 Class<?> c;
303 {
304 c = new Object() {}.getClass();
305 }
306 public Class<?> make() { return c; }
307 }.make();
308
309 @TestMe(desc="the primitive boolean type",
310 encl="null",
311 simple="boolean",
312 canonical="boolean")
313 public Class<?> booleanClass = boolean.class;
314
315 @TestMe(desc="the primitive char type",
316 encl="null",
317 simple="char",
318 canonical="char")
319 public Class<?> charClass = char.class;
320
321 @TestMe(desc="the primitive byte type",
322 encl="null",
323 simple="byte",
324 canonical="byte")
325 public Class<?> byteClass = byte.class;
326
327 @TestMe(desc="the primitive short type",
328 encl="null",
329 simple="short",
330 canonical="short")
331 public Class<?> shortClass = short.class;
332
333 @TestMe(desc="the primitive int type",
334 encl="null",
335 simple="int",
336 canonical="int")
337 public Class<?> intClass = int.class;
338
339 @TestMe(desc="the primitive long type",
340 encl="null",
341 simple="long",
342 canonical="long")
343 public Class<?> longClass = long.class;
344
345 @TestMe(desc="the primitive float type",
346 encl="null",
347 simple="float",
348 canonical="float")
349 public Class<?> floatClass = float.class;
350
351 @TestMe(desc="the primitive double type",
352 encl="null",
353 simple="double",
354 canonical="double")
355 public Class<?> doubleClass = double.class;
356
357 @TestMe(desc="the primitive void type",
358 encl="null",
359 simple="void",
360 canonical="void")
361 public Class<?> voidClass = void.class;
362
363}