NestedTypes.java revision 1754:ddb4a2bfcd82
1/*
2 * Copyright (c) 2012, 2013, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24import static com.sun.tools.classfile.TypeAnnotation.TargetType.*;
25
26/*
27 * @test
28 * @summary Test population of reference info for nested types
29 * @compile -g Driver.java ReferenceInfoUtil.java NestedTypes.java
30 * @run main Driver NestedTypes
31 */
32public class NestedTypes {
33
34    // method parameters
35
36    @TADescriptions({
37        @TADescription(annotation = "TA", type = METHOD_FORMAL_PARAMETER,
38                genericLocation = {}, paramIndex = 0),
39        @TADescription(annotation = "TB", type = METHOD_FORMAL_PARAMETER,
40                genericLocation = {1, 0}, paramIndex = 0)
41    })
42    public String testParam1() {
43        return "void test(@TA Outer.@TB Inner a) { }";
44    }
45
46    @TADescriptions({
47        @TADescription(annotation = "TA", type = METHOD_FORMAL_PARAMETER,
48                genericLocation = {3, 0}, paramIndex = 0),
49        @TADescription(annotation = "TB", type = METHOD_FORMAL_PARAMETER,
50                genericLocation = {3, 0, 1, 0}, paramIndex = 0)
51    })
52    public String testParam1b() {
53        return "void test(List<@TA Outer.@TB Inner> a) { }";
54    }
55
56    // TODO: the tests that use @TA Map.Entry should fail, as
57    // Map cannot be annotated.
58    // We need some tests for the fully qualified name syntax.
59    /*
60    @TADescription(annotation = "TA", type = METHOD_FORMAL_PARAMETER,
61            genericLocation = {}, paramIndex = 0)
62    public String testParam1c() {
63        return "void test(java.util.@TA Map.Entry a) { }";
64    }
65
66    @TADescriptions({
67        @TADescription(annotation = "TA", type = METHOD_FORMAL_PARAMETER,
68                genericLocation = {}, paramIndex = 0),
69        @TADescription(annotation = "TB", type = METHOD_FORMAL_PARAMETER,
70                genericLocation = {1, 0}, paramIndex = 0)
71    })
72    public String testParam1d() {
73        return "void test(java.util.@TA Map.@TB Entry a) { }";
74    }
75
76    @TADescription(annotation = "TA", type = METHOD_FORMAL_PARAMETER,
77            genericLocation = {3, 0}, paramIndex = 0)
78    public String testParam1e() {
79        return "void test(List<java.util.@TA Map.Entry> a) { }";
80    }
81
82    @TADescriptions({
83        @TADescription(annotation = "TA", type = METHOD_FORMAL_PARAMETER,
84                genericLocation = {3, 0}, paramIndex = 0),
85        @TADescription(annotation = "TB", type = METHOD_FORMAL_PARAMETER,
86                genericLocation = {3, 0, 1, 0}, paramIndex = 0)
87    })
88    public String testParam1f() {
89        return "void test(List<java.util.@TA Map. @TB Entry> a) { }";
90    }
91    */
92
93    @TADescription(annotation = "TB", type = METHOD_FORMAL_PARAMETER,
94           genericLocation = {3, 0}, paramIndex = 0)
95    public String testParam1g() {
96        return "void test(List<java.util.Map. @TB Entry> a) { }";
97    }
98
99    @TADescriptions({
100        @TADescription(annotation = "TA", type = METHOD_FORMAL_PARAMETER,
101                genericLocation = {}, paramIndex = 0),
102        @TADescription(annotation = "TB", type = METHOD_FORMAL_PARAMETER,
103                genericLocation = {1, 0}, paramIndex = 0)
104    })
105    public String testParam2() {
106        return "void test(@TA GOuter<String,String>.@TB GInner<String,String> a) { }";
107    }
108
109    @TADescriptions({
110        @TADescription(annotation = "TA", type = METHOD_FORMAL_PARAMETER,
111                genericLocation = {3, 0}, paramIndex = 0),
112        @TADescription(annotation = "TB", type = METHOD_FORMAL_PARAMETER,
113                genericLocation = {3, 0, 1, 0}, paramIndex = 0)
114    })
115    public String testParam2b() {
116        return "void test(List<@TA GOuter<String,String>.@TB GInner<String,String>> a) { }";
117    }
118
119    @TADescriptions({
120        @TADescription(annotation = "TA", type = METHOD_FORMAL_PARAMETER,
121                genericLocation = {0, 0, 0, 0}, paramIndex = 0),
122        @TADescription(annotation = "TB", type = METHOD_FORMAL_PARAMETER,
123                genericLocation = {0, 0, 0, 0, 1, 0}, paramIndex = 0),
124        @TADescription(annotation = "TC", type = METHOD_FORMAL_PARAMETER,
125                genericLocation = {0, 0, 0, 0, 1, 0, 3, 0}, paramIndex = 0),
126        @TADescription(annotation = "TD", type = METHOD_FORMAL_PARAMETER,
127                genericLocation = {0, 0, 0, 0, 1, 0, 3, 0, 3, 0, 0, 0, 0, 0}, paramIndex = 0),
128        @TADescription(annotation = "TE", type = METHOD_FORMAL_PARAMETER,
129                genericLocation = {0, 0, 0, 0, 1, 0, 3, 0, 3, 0}, paramIndex = 0),
130        @TADescription(annotation = "TF", type = METHOD_FORMAL_PARAMETER,
131                genericLocation = {0, 0, 0, 0, 1, 0, 3, 0, 3, 0, 0, 0}, paramIndex = 0),
132        @TADescription(annotation = "TG", type = METHOD_FORMAL_PARAMETER,
133                genericLocation = {0, 0, 0, 0, 1, 0, 1, 0}, paramIndex = 0),
134        @TADescription(annotation = "TH", type = METHOD_FORMAL_PARAMETER,
135                genericLocation = {0, 0, 0, 0, 1, 0, 1, 0, 3, 0}, paramIndex = 0),
136        @TADescription(annotation = "TI", type = METHOD_FORMAL_PARAMETER,
137                genericLocation = {0, 0, 0, 0, 1, 0, 1, 0, 3, 1}, paramIndex = 0),
138        @TADescription(annotation = "TJ", type = METHOD_FORMAL_PARAMETER, paramIndex = 0),
139        @TADescription(annotation = "TK", type = METHOD_FORMAL_PARAMETER,
140                genericLocation = {0, 0}, paramIndex = 0)
141    })
142    public String testParam3() {
143        return "class Outer {\n" +
144                " class GInner<X> {\n" +
145                "  class GInner2<Y, Z> {}\n" +
146                "}}\n\n" +
147                "class Test {\n" +
148                " void test(@TA Outer . @TB GInner<@TC List<@TD Object @TE[] @TF[]>>. @TG GInner2<@TH Integer, @TI Object> @TJ[] @TK[] a) { }\n" +
149                "}";
150    }
151
152    @TADescriptions({
153        @TADescription(annotation = "TA", type = METHOD_FORMAL_PARAMETER,
154                genericLocation = {3, 0, 0, 0, 0, 0}, paramIndex = 0),
155        @TADescription(annotation = "TB", type = METHOD_FORMAL_PARAMETER,
156                genericLocation = {3, 0, 0, 0, 0, 0, 1, 0}, paramIndex = 0),
157        @TADescription(annotation = "TC", type = METHOD_FORMAL_PARAMETER,
158                genericLocation = {3, 0, 0, 0, 0, 0, 1, 0, 3, 0}, paramIndex = 0),
159        @TADescription(annotation = "TD", type = METHOD_FORMAL_PARAMETER,
160                genericLocation = {3, 0, 0, 0, 0, 0, 1, 0, 3, 0, 3, 0, 0, 0, 0, 0}, paramIndex = 0),
161        @TADescription(annotation = "TE", type = METHOD_FORMAL_PARAMETER,
162                genericLocation = {3, 0, 0, 0, 0, 0, 1, 0, 3, 0, 3, 0}, paramIndex = 0),
163        @TADescription(annotation = "TF", type = METHOD_FORMAL_PARAMETER,
164                genericLocation = {3, 0, 0, 0, 0, 0, 1, 0, 3, 0, 3, 0, 0, 0}, paramIndex = 0),
165        @TADescription(annotation = "TG", type = METHOD_FORMAL_PARAMETER,
166                genericLocation = {3, 0, 0, 0, 0, 0, 1, 0, 1, 0}, paramIndex = 0),
167        @TADescription(annotation = "TH", type = METHOD_FORMAL_PARAMETER,
168                genericLocation = {3, 0, 0, 0, 0, 0, 1, 0, 1, 0, 3, 0}, paramIndex = 0),
169        @TADescription(annotation = "TI", type = METHOD_FORMAL_PARAMETER,
170                genericLocation = {3, 0, 0, 0, 0, 0, 1, 0, 1, 0, 3, 1}, paramIndex = 0),
171        @TADescription(annotation = "TJ", type = METHOD_FORMAL_PARAMETER,
172                genericLocation = {3, 0}, paramIndex = 0),
173        @TADescription(annotation = "TK", type = METHOD_FORMAL_PARAMETER,
174                genericLocation = {3, 0, 0, 0}, paramIndex = 0)
175    })
176    public String testParam4() {
177        return "class Outer {\n" +
178                " class GInner<X> {\n" +
179                "  class GInner2<Y, Z> {}\n" +
180                "}}\n\n" +
181                "class Test {\n" +
182                " void test(List<@TA Outer . @TB GInner<@TC List<@TD Object @TE[] @TF[]>>. @TG GInner2<@TH Integer, @TI Object> @TJ[] @TK[]> a) { }\n" +
183                "}";
184    }
185
186
187    // Local variables
188
189    @TADescriptions({
190        @TADescription(annotation = "TA", type = LOCAL_VARIABLE,
191                genericLocation = {},
192                lvarOffset = {2}, lvarLength = {1}, lvarIndex = {1}),
193        @TADescription(annotation = "TB", type = LOCAL_VARIABLE,
194                genericLocation = {1, 0},
195                lvarOffset = {2}, lvarLength = {1}, lvarIndex = {1})
196    })
197    public String testLocal1a() {
198        return "void test() { @TA Outer.@TB Inner a = null; }";
199    }
200
201    @TADescription(annotation = "TA", type = LOCAL_VARIABLE,
202            genericLocation = {},
203            lvarOffset = {2}, lvarLength = {1}, lvarIndex = {1})
204    public String testLocal1b() {
205        return "void test() { @TA Outer.Inner a = null; }";
206    }
207
208    @TADescription(annotation = "TB", type = LOCAL_VARIABLE,
209            genericLocation = {1, 0},
210            lvarOffset = {2}, lvarLength = {1}, lvarIndex = {1})
211    public String testLocal1c() {
212        return "void test() { Outer.@TB Inner a = null; }";
213    }
214
215    @TADescriptions({
216        @TADescription(annotation = "TA", type = LOCAL_VARIABLE,
217                genericLocation = {},
218                lvarOffset = {2}, lvarLength = {1}, lvarIndex = {1}),
219        @TADescription(annotation = "TB", type = LOCAL_VARIABLE,
220                genericLocation = {1, 0},
221                lvarOffset = {2}, lvarLength = {1}, lvarIndex = {1})
222    })
223    public String testLocal2() {
224        return "void test() { @TA GOuter<String,String>.@TB GInner<String,String> a = null; }";
225    }
226
227    @TADescriptions({
228        @TADescription(annotation = "TA", type = LOCAL_VARIABLE,
229                genericLocation = {0, 0, 0, 0},
230                lvarOffset = {5}, lvarLength = {1}, lvarIndex = {1}),
231        @TADescription(annotation = "TB", type = LOCAL_VARIABLE,
232                genericLocation = {0, 0, 0, 0, 1, 0},
233                lvarOffset = {5}, lvarLength = {1}, lvarIndex = {1}),
234        @TADescription(annotation = "TC", type = LOCAL_VARIABLE,
235                genericLocation = {0, 0, 0, 0, 1, 0, 3, 0},
236                lvarOffset = {5}, lvarLength = {1}, lvarIndex = {1}),
237        @TADescription(annotation = "TD", type = LOCAL_VARIABLE,
238                genericLocation = {0, 0, 0, 0, 1, 0, 3, 0, 3, 0, 0, 0, 0, 0},
239                lvarOffset = {5}, lvarLength = {1}, lvarIndex = {1}),
240        @TADescription(annotation = "TE", type = LOCAL_VARIABLE,
241                genericLocation = {0, 0, 0, 0, 1, 0, 3, 0, 3, 0},
242                lvarOffset = {5}, lvarLength = {1}, lvarIndex = {1}),
243        @TADescription(annotation = "TF", type = LOCAL_VARIABLE,
244                genericLocation = {0, 0, 0, 0, 1, 0, 3, 0, 3, 0, 0, 0},
245                lvarOffset = {5}, lvarLength = {1}, lvarIndex = {1}),
246        @TADescription(annotation = "TG", type = LOCAL_VARIABLE,
247                genericLocation = {0, 0, 0, 0, 1, 0, 1, 0},
248                lvarOffset = {5}, lvarLength = {1}, lvarIndex = {1}),
249        @TADescription(annotation = "TH", type = LOCAL_VARIABLE,
250                genericLocation = {0, 0, 0, 0, 1, 0, 1, 0, 3, 0},
251                lvarOffset = {5}, lvarLength = {1}, lvarIndex = {1}),
252        @TADescription(annotation = "TI", type = LOCAL_VARIABLE,
253                genericLocation = {0, 0, 0, 0, 1, 0, 1, 0, 3, 1},
254                lvarOffset = {5}, lvarLength = {1}, lvarIndex = {1}),
255        @TADescription(annotation = "TJ", type = LOCAL_VARIABLE,
256                genericLocation = {},
257                lvarOffset = {5}, lvarLength = {1}, lvarIndex = {1}),
258        @TADescription(annotation = "TK", type = LOCAL_VARIABLE,
259                genericLocation = {0, 0},
260                lvarOffset = {5}, lvarLength = {1}, lvarIndex = {1})
261    })
262    public String testLocal3() {
263        return "class Outer {\n" +
264                " class GInner<X> {\n" +
265                "  class GInner2<Y, Z> {}\n" +
266                "}}\n\n" +
267                "class Test {\n" +
268                " void test() { @TA Outer . @TB GInner<@TC List<@TD Object @TE[] @TF[]>>. @TG GInner2<@TH Integer, @TI Object> @TJ[] @TK[] a = null; }\n" +
269                "}";
270    }
271
272    @TADescriptions({
273        @TADescription(annotation = "TA", type = LOCAL_VARIABLE,
274                genericLocation = {3, 0, 0, 0, 0, 0},
275                lvarOffset = {2}, lvarLength = {1}, lvarIndex = {1}),
276        @TADescription(annotation = "TB", type = LOCAL_VARIABLE,
277                genericLocation = {3, 0, 0, 0, 0, 0, 1, 0},
278                lvarOffset = {2}, lvarLength = {1}, lvarIndex = {1}),
279        @TADescription(annotation = "TC", type = LOCAL_VARIABLE,
280                genericLocation = {3, 0, 0, 0, 0, 0, 1, 0, 3, 0},
281                lvarOffset = {2}, lvarLength = {1}, lvarIndex = {1}),
282        @TADescription(annotation = "TD", type = LOCAL_VARIABLE,
283                genericLocation = {3, 0, 0, 0, 0, 0, 1, 0, 3, 0, 3, 0, 0, 0, 0, 0},
284                lvarOffset = {2}, lvarLength = {1}, lvarIndex = {1}),
285        @TADescription(annotation = "TE", type = LOCAL_VARIABLE,
286                genericLocation = {3, 0, 0, 0, 0, 0, 1, 0, 3, 0, 3, 0},
287                lvarOffset = {2}, lvarLength = {1}, lvarIndex = {1}),
288        @TADescription(annotation = "TF", type = LOCAL_VARIABLE,
289                genericLocation = {3, 0, 0, 0, 0, 0, 1, 0, 3, 0, 3, 0, 0, 0},
290                lvarOffset = {2}, lvarLength = {1}, lvarIndex = {1}),
291        @TADescription(annotation = "TG", type = LOCAL_VARIABLE,
292                genericLocation = {3, 0, 0, 0, 0, 0, 1, 0, 1, 0},
293                lvarOffset = {2}, lvarLength = {1}, lvarIndex = {1}),
294        @TADescription(annotation = "TH", type = LOCAL_VARIABLE,
295                genericLocation = {3, 0, 0, 0, 0, 0, 1, 0, 1, 0, 3, 0},
296                lvarOffset = {2}, lvarLength = {1}, lvarIndex = {1}),
297        @TADescription(annotation = "TI", type = LOCAL_VARIABLE,
298                genericLocation = {3, 0, 0, 0, 0, 0, 1, 0, 1, 0, 3, 1},
299                lvarOffset = {2}, lvarLength = {1}, lvarIndex = {1}),
300        @TADescription(annotation = "TJ", type = LOCAL_VARIABLE,
301                genericLocation = {3, 0},
302                lvarOffset = {2}, lvarLength = {1}, lvarIndex = {1}),
303        @TADescription(annotation = "TK", type = LOCAL_VARIABLE,
304                genericLocation = {3, 0, 0, 0},
305                lvarOffset = {2}, lvarLength = {1}, lvarIndex = {1})
306    })
307    public String testLocal4() {
308        return "class Outer {\n" +
309                " class GInner<X> {\n" +
310                "  class GInner2<Y, Z> {}\n" +
311                "}}\n\n" +
312                "class Test {\n" +
313                " void test() { List<@TA Outer . @TB GInner<@TC List<@TD Object @TE[] @TF[]>>. @TG GInner2<@TH Integer, @TI Object> @TJ[] @TK[]> a = null; }\n" +
314                "}";
315    }
316
317
318    // fields
319
320    @TADescriptions({
321        @TADescription(annotation = "TA", type = FIELD,
322                genericLocation = {}),
323        @TADescription(annotation = "TB", type = FIELD,
324                genericLocation = {1, 0})
325    })
326    public String testField1a() {
327        return "@TA Outer.@TB Inner a;";
328    }
329
330    @TADescription(annotation = "TA", type = FIELD,
331            genericLocation = {})
332    public String testField1b() {
333        return "@TA Outer.Inner a;";
334    }
335
336    @TADescription(annotation = "TB", type = FIELD,
337            genericLocation = {1, 0})
338    public String testField1c() {
339        return "Outer.@TB Inner a;";
340    }
341
342    @TADescriptions({
343        @TADescription(annotation = "TA", type = FIELD,
344                genericLocation = {}),
345        @TADescription(annotation = "TB", type = FIELD,
346                genericLocation = {1, 0})
347    })
348    public String testField2() {
349        return "@TA GOuter<String,String>.@TB GInner<String,String> a;";
350    }
351
352    @TADescriptions({
353        @TADescription(annotation = "TA", type = FIELD,
354                genericLocation = {0, 0, 0, 0}),
355        @TADescription(annotation = "TB", type = FIELD,
356                genericLocation = {0, 0, 0, 0, 1, 0}),
357        @TADescription(annotation = "TC", type = FIELD,
358                genericLocation = {0, 0, 0, 0, 1, 0, 3, 0}),
359        @TADescription(annotation = "TD", type = FIELD,
360                genericLocation = {0, 0, 0, 0, 1, 0, 3, 0, 3, 0, 0, 0, 0, 0}),
361        @TADescription(annotation = "TE", type = FIELD,
362                genericLocation = {0, 0, 0, 0, 1, 0, 3, 0, 3, 0}),
363        @TADescription(annotation = "TF", type = FIELD,
364                genericLocation = {0, 0, 0, 0, 1, 0, 3, 0, 3, 0, 0, 0}),
365        @TADescription(annotation = "TG", type = FIELD,
366                genericLocation = {0, 0, 0, 0, 1, 0, 1, 0}),
367        @TADescription(annotation = "TH", type = FIELD,
368                genericLocation = {0, 0, 0, 0, 1, 0, 1, 0, 3, 0}),
369        @TADescription(annotation = "TI", type = FIELD,
370                genericLocation = {0, 0, 0, 0, 1, 0, 1, 0, 3, 1}),
371        @TADescription(annotation = "TJ", type = FIELD),
372        @TADescription(annotation = "TK", type = FIELD,
373                genericLocation = {0, 0})
374    })
375    public String testField3() {
376        return "class Outer {\n" +
377                " class GInner<X> {\n" +
378                "  class GInner2<Y, Z> {}\n" +
379                "}}\n\n" +
380                "class Test {\n" +
381                " @TA Outer . @TB GInner<@TC List<@TD Object @TE[] @TF[]>>. @TG GInner2<@TH Integer, @TI Object> @TJ[] @TK[] a;\n" +
382                "}";
383    }
384
385    @TADescriptions({
386        @TADescription(annotation = "TA", type = FIELD,
387                genericLocation = {3, 0, 0, 0, 0, 0}),
388        @TADescription(annotation = "TB", type = FIELD,
389                genericLocation = {3, 0, 0, 0, 0, 0, 1, 0}),
390        @TADescription(annotation = "TC", type = FIELD,
391                genericLocation = {3, 0, 0, 0, 0, 0, 1, 0, 3, 0}),
392        @TADescription(annotation = "TD", type = FIELD,
393                genericLocation = {3, 0, 0, 0, 0, 0, 1, 0, 3, 0, 3, 0, 0, 0, 0, 0}),
394        @TADescription(annotation = "TE", type = FIELD,
395                genericLocation = {3, 0, 0, 0, 0, 0, 1, 0, 3, 0, 3, 0}),
396        @TADescription(annotation = "TF", type = FIELD,
397                genericLocation = {3, 0, 0, 0, 0, 0, 1, 0, 3, 0, 3, 0, 0, 0}),
398        @TADescription(annotation = "TG", type = FIELD,
399                genericLocation = {3, 0, 0, 0, 0, 0, 1, 0, 1, 0}),
400        @TADescription(annotation = "TH", type = FIELD,
401                genericLocation = {3, 0, 0, 0, 0, 0, 1, 0, 1, 0, 3, 0}),
402        @TADescription(annotation = "TI", type = FIELD,
403                genericLocation = {3, 0, 0, 0, 0, 0, 1, 0, 1, 0, 3, 1}),
404        @TADescription(annotation = "TJ", type = FIELD,
405                genericLocation = {3, 0}),
406        @TADescription(annotation = "TK", type = FIELD,
407                genericLocation = {3, 0, 0, 0})
408    })
409    public String testField4() {
410        return "class Outer {\n" +
411                " class GInner<X> {\n" +
412                "  class GInner2<Y, Z> {}\n" +
413                "}}\n\n" +
414                "class Test {\n" +
415                " List<@TA Outer . @TB GInner<@TC List<@TD Object @TE[] @TF[]>>. @TG GInner2<@TH Integer, @TI Object> @TJ[] @TK[]> a;\n" +
416                "}";
417    }
418
419
420    // return types
421
422    @TADescriptions({
423        @TADescription(annotation = "TA", type = METHOD_RETURN,
424                genericLocation = {}),
425        @TADescription(annotation = "TB", type = METHOD_RETURN,
426                genericLocation = {1, 0})
427    })
428    public String testReturn1() {
429        return "@TA Outer.@TB Inner test() { return null; }";
430    }
431
432    @TADescriptions({
433        @TADescription(annotation = "TA", type = METHOD_RETURN,
434                genericLocation = {}),
435        @TADescription(annotation = "TB", type = METHOD_RETURN,
436                genericLocation = {1, 0})
437    })
438    public String testReturn2() {
439        return "@TA GOuter<String,String>.@TB GInner<String,String> test() { return null; }";
440    }
441
442    @TADescriptions({
443        @TADescription(annotation = "TA", type = METHOD_RETURN,
444                genericLocation = {0, 0, 0, 0}),
445        @TADescription(annotation = "TB", type = METHOD_RETURN,
446                genericLocation = {0, 0, 0, 0, 1, 0}),
447        @TADescription(annotation = "TC", type = METHOD_RETURN,
448                genericLocation = {0, 0, 0, 0, 1, 0, 3, 0}),
449        @TADescription(annotation = "TD", type = METHOD_RETURN,
450                genericLocation = {0, 0, 0, 0, 1, 0, 3, 0, 3, 0, 0, 0, 0, 0}),
451        @TADescription(annotation = "TE", type = METHOD_RETURN,
452                genericLocation = {0, 0, 0, 0, 1, 0, 3, 0, 3, 0}),
453        @TADescription(annotation = "TF", type = METHOD_RETURN,
454                genericLocation = {0, 0, 0, 0, 1, 0, 3, 0, 3, 0, 0, 0}),
455        @TADescription(annotation = "TG", type = METHOD_RETURN,
456                genericLocation = {0, 0, 0, 0, 1, 0, 1, 0}),
457        @TADescription(annotation = "TH", type = METHOD_RETURN,
458                genericLocation = {0, 0, 0, 0, 1, 0, 1, 0, 3, 0}),
459        @TADescription(annotation = "TI", type = METHOD_RETURN,
460                genericLocation = {0, 0, 0, 0, 1, 0, 1, 0, 3, 1}),
461        @TADescription(annotation = "TJ", type = METHOD_RETURN),
462        @TADescription(annotation = "TK", type = METHOD_RETURN,
463                genericLocation = {0, 0})
464    })
465    public String testReturn3() {
466        return "class Outer {\n" +
467                " class GInner<X> {\n" +
468                "  class GInner2<Y, Z> {}\n" +
469                "}}\n\n" +
470                "class Test {\n" +
471                " @TA Outer . @TB GInner<@TC List<@TD Object @TE[] @TF[]>>. @TG GInner2<@TH Integer, @TI Object> @TJ[] @TK[] test() { return null; }\n" +
472                "}";
473    }
474
475    @TADescriptions({
476        @TADescription(annotation = "TA", type = METHOD_RETURN,
477                genericLocation = {3, 0, 0, 0, 0, 0}),
478        @TADescription(annotation = "TB", type = METHOD_RETURN,
479                genericLocation = {3, 0, 0, 0, 0, 0, 1, 0}),
480        @TADescription(annotation = "TC", type = METHOD_RETURN,
481                genericLocation = {3, 0, 0, 0, 0, 0, 1, 0, 3, 0}),
482        @TADescription(annotation = "TD", type = METHOD_RETURN,
483                genericLocation = {3, 0, 0, 0, 0, 0, 1, 0, 3, 0, 3, 0, 0, 0, 0, 0}),
484        @TADescription(annotation = "TE", type = METHOD_RETURN,
485                genericLocation = {3, 0, 0, 0, 0, 0, 1, 0, 3, 0, 3, 0}),
486        @TADescription(annotation = "TF", type = METHOD_RETURN,
487                genericLocation = {3, 0, 0, 0, 0, 0, 1, 0, 3, 0, 3, 0, 0, 0}),
488        @TADescription(annotation = "TG", type = METHOD_RETURN,
489                genericLocation = {3, 0, 0, 0, 0, 0, 1, 0, 1, 0}),
490        @TADescription(annotation = "TH", type = METHOD_RETURN,
491                genericLocation = {3, 0, 0, 0, 0, 0, 1, 0, 1, 0, 3, 0}),
492        @TADescription(annotation = "TI", type = METHOD_RETURN,
493                genericLocation = {3, 0, 0, 0, 0, 0, 1, 0, 1, 0, 3, 1}),
494        @TADescription(annotation = "TJ", type = METHOD_RETURN,
495                genericLocation = {3, 0}),
496        @TADescription(annotation = "TK", type = METHOD_RETURN,
497                genericLocation = {3, 0, 0, 0})
498    })
499    public String testReturn4() {
500        return "class Outer {\n" +
501                " class GInner<X> {\n" +
502                "  class GInner2<Y, Z> {}\n" +
503                "}}\n\n" +
504                "class Test {\n" +
505                " List<@TA Outer . @TB GInner<@TC List<@TD Object @TE[] @TF[]>>. @TG GInner2<@TH Integer, @TI Object> @TJ[] @TK[]> test() { return null; }\n" +
506                "}";
507    }
508
509    @TADescriptions({
510        @TADescription(annotation = "TA", type = METHOD_RETURN,
511                genericLocation = {3, 0}),
512        @TADescription(annotation = "TB", type = METHOD_RETURN,
513                genericLocation = {3, 0, 3, 0}),
514        @TADescription(annotation = "TC", type = METHOD_RETURN,
515                genericLocation = {3, 0, 3, 1}),
516        @TADescription(annotation = "TD", type = METHOD_RETURN,
517                genericLocation = {3, 0, 3, 1, 3, 0}),
518        @TADescription(annotation = "TE", type = METHOD_RETURN,
519                genericLocation = {3, 0, 1, 0}),
520        @TADescription(annotation = "TF", type = METHOD_RETURN,
521                genericLocation = {3, 0, 1, 0, 3, 0}),
522        @TADescription(annotation = "TG", type = METHOD_RETURN,
523                genericLocation = {3, 0, 1, 0, 3, 0, 3, 0, 0, 0, 0, 0}),
524        @TADescription(annotation = "TH", type = METHOD_RETURN,
525                genericLocation = {3, 0, 1, 0, 3, 0, 3, 0}),
526        @TADescription(annotation = "TI", type = METHOD_RETURN,
527                genericLocation = {3, 0, 1, 0, 3, 0, 3, 0, 0, 0}),
528        @TADescription(annotation = "TJ", type = METHOD_RETURN,
529                genericLocation = {3, 0, 1, 0, 1, 0}),
530    })
531    public String testReturn5() {
532        return "class GOuter<A, B> {\n" +
533                " class GInner<X> {\n" +
534                "  class GInner2<Y, Z> {}\n" +
535                "}}\n\n" +
536                "class Test {\n" +
537                " List<@TA GOuter<@TB String, @TC List<@TD Object>> . @TE GInner<@TF List<@TG Object @TH[] @TI[]>>. @TJ GInner2<String, String>> test() { return null; }\n" +
538                "}";
539    }
540
541
542    // type parameters
543
544    @TADescriptions({
545        @TADescription(annotation = "TA", type = METHOD_TYPE_PARAMETER_BOUND,
546                genericLocation = {}, paramIndex = 0, boundIndex = 0),
547        @TADescription(annotation = "TB", type = METHOD_TYPE_PARAMETER_BOUND,
548                genericLocation = {1, 0}, paramIndex = 0, boundIndex = 0)
549    })
550    public String testTypeparam1() {
551        return "<X extends @TA Outer.@TB Inner> X test() { return null; }";
552    }
553
554    @TADescriptions({
555        @TADescription(annotation = "TA", type = METHOD_TYPE_PARAMETER_BOUND,
556                genericLocation = {}, paramIndex = 0, boundIndex = 0),
557        @TADescription(annotation = "TB", type = METHOD_TYPE_PARAMETER_BOUND,
558                genericLocation = {1, 0}, paramIndex = 0, boundIndex = 0)
559    })
560    public String testTypeparam2() {
561        return "<X extends @TA GOuter<String,String>.@TB GInner<String,String>> X test() { return null; }";
562    }
563
564    @TADescriptions({
565        @TADescription(annotation = "TA", type = METHOD_TYPE_PARAMETER_BOUND,
566                genericLocation = {},
567                paramIndex = 0, boundIndex = 0),
568        @TADescription(annotation = "TB", type = METHOD_TYPE_PARAMETER_BOUND,
569                genericLocation = {1, 0},
570                paramIndex = 0, boundIndex = 0),
571        @TADescription(annotation = "TC", type = METHOD_TYPE_PARAMETER_BOUND,
572                genericLocation = {1, 0, 3, 0},
573                paramIndex = 0, boundIndex = 0),
574        @TADescription(annotation = "TD", type = METHOD_TYPE_PARAMETER_BOUND,
575                genericLocation = {1, 0, 3, 0, 3, 0, 0, 0, 0, 0},
576                paramIndex = 0, boundIndex = 0),
577        @TADescription(annotation = "TE", type = METHOD_TYPE_PARAMETER_BOUND,
578                genericLocation = {1, 0, 3, 0, 3, 0},
579                paramIndex = 0, boundIndex = 0),
580        @TADescription(annotation = "TF", type = METHOD_TYPE_PARAMETER_BOUND,
581                genericLocation = {1, 0, 3, 0, 3, 0, 0, 0},
582                paramIndex = 0, boundIndex = 0),
583        @TADescription(annotation = "TG", type = METHOD_TYPE_PARAMETER_BOUND,
584                genericLocation = {1, 0, 1, 0},
585                paramIndex = 0, boundIndex = 0),
586        @TADescription(annotation = "TH", type = METHOD_TYPE_PARAMETER_BOUND,
587                genericLocation = {1, 0, 1, 0, 3, 0},
588                paramIndex = 0, boundIndex = 0),
589        @TADescription(annotation = "TI", type = METHOD_TYPE_PARAMETER_BOUND,
590                genericLocation = {1, 0, 1, 0, 3, 1},
591                paramIndex = 0, boundIndex = 0),
592    })
593    public String testTypeparam3() {
594        return "class Outer {\n" +
595                " class GInner<X> {\n" +
596                "  class GInner2<Y, Z> {}\n" +
597                "}}\n\n" +
598                "class Test {\n" +
599                " <X extends @TA Outer . @TB GInner<@TC List<@TD Object @TE[] @TF[]>>. @TG GInner2<@TH Integer, @TI Object>> X test() { return null; }\n" +
600                "}";
601    }
602
603    @TADescriptions({
604        @TADescription(annotation = "TA", type = METHOD_TYPE_PARAMETER_BOUND,
605                genericLocation = {3, 0, 0, 0, 0, 0},
606                paramIndex = 0, boundIndex = 1),
607        @TADescription(annotation = "TB", type = METHOD_TYPE_PARAMETER_BOUND,
608                genericLocation = {3, 0, 0, 0, 0, 0, 1, 0},
609                paramIndex = 0, boundIndex = 1),
610        @TADescription(annotation = "TC", type = METHOD_TYPE_PARAMETER_BOUND,
611                genericLocation = {3, 0, 0, 0, 0, 0, 1, 0, 3, 0},
612                paramIndex = 0, boundIndex = 1),
613        @TADescription(annotation = "TD", type = METHOD_TYPE_PARAMETER_BOUND,
614                genericLocation = {3, 0, 0, 0, 0, 0, 1, 0, 3, 0, 3, 0, 0, 0, 0, 0},
615                paramIndex = 0, boundIndex = 1),
616        @TADescription(annotation = "TE", type = METHOD_TYPE_PARAMETER_BOUND,
617                genericLocation = {3, 0, 0, 0, 0, 0, 1, 0, 3, 0, 3, 0},
618                paramIndex = 0, boundIndex = 1),
619        @TADescription(annotation = "TF", type = METHOD_TYPE_PARAMETER_BOUND,
620                genericLocation = {3, 0, 0, 0, 0, 0, 1, 0, 3, 0, 3, 0, 0, 0},
621                paramIndex = 0, boundIndex = 1),
622        @TADescription(annotation = "TG", type = METHOD_TYPE_PARAMETER_BOUND,
623                genericLocation = {3, 0, 0, 0, 0, 0, 1, 0, 1, 0},
624                paramIndex = 0, boundIndex = 1),
625        @TADescription(annotation = "TH", type = METHOD_TYPE_PARAMETER_BOUND,
626                genericLocation = {3, 0, 0, 0, 0, 0, 1, 0, 1, 0, 3, 0},
627                paramIndex = 0, boundIndex = 1),
628        @TADescription(annotation = "TI", type = METHOD_TYPE_PARAMETER_BOUND,
629                genericLocation = {3, 0, 0, 0, 0, 0, 1, 0, 1, 0, 3, 1},
630                paramIndex = 0, boundIndex = 1),
631        @TADescription(annotation = "TJ", type = METHOD_TYPE_PARAMETER_BOUND,
632                genericLocation = {3, 0},
633                paramIndex = 0, boundIndex = 1),
634        @TADescription(annotation = "TK", type = METHOD_TYPE_PARAMETER_BOUND,
635                genericLocation = {3, 0, 0, 0},
636                paramIndex = 0, boundIndex = 1)
637    })
638    public String testTypeparam4() {
639        return "class Outer {\n" +
640                " class GInner<X> {\n" +
641                "  class GInner2<Y, Z> {}\n" +
642                "}}\n\n" +
643                "class Test {\n" +
644                " <X extends List<@TA Outer . @TB GInner<@TC List<@TD Object @TE[] @TF[]>>. @TG GInner2<@TH Integer, @TI Object> @TJ[] @TK[]>> X test() { return null; }\n" +
645                "}";
646    }
647
648    @TADescriptions({
649        @TADescription(annotation = "TA", type = METHOD_TYPE_PARAMETER_BOUND,
650                genericLocation = {3, 0}, paramIndex = 0, boundIndex = 1),
651        @TADescription(annotation = "TB", type = METHOD_TYPE_PARAMETER_BOUND,
652                genericLocation = {3, 0, 3, 0}, paramIndex = 0, boundIndex = 1),
653        @TADescription(annotation = "TC", type = METHOD_TYPE_PARAMETER_BOUND,
654                genericLocation = {3, 0, 3, 1}, paramIndex = 0, boundIndex = 1),
655        @TADescription(annotation = "TD", type = METHOD_TYPE_PARAMETER_BOUND,
656                genericLocation = {3, 0, 3, 1, 3, 0}, paramIndex = 0, boundIndex = 1),
657        @TADescription(annotation = "TE", type = METHOD_TYPE_PARAMETER_BOUND,
658                genericLocation = {3, 0, 1, 0}, paramIndex = 0, boundIndex = 1),
659        @TADescription(annotation = "TF", type = METHOD_TYPE_PARAMETER_BOUND,
660                genericLocation = {3, 0, 1, 0, 3, 0}, paramIndex = 0, boundIndex = 1),
661        @TADescription(annotation = "TG", type = METHOD_TYPE_PARAMETER_BOUND,
662                genericLocation = {3, 0, 1, 0, 3, 0, 3, 0, 0, 0, 0, 0}, paramIndex = 0, boundIndex = 1),
663        @TADescription(annotation = "TH", type = METHOD_TYPE_PARAMETER_BOUND,
664                genericLocation = {3, 0, 1, 0, 3, 0, 3, 0}, paramIndex = 0, boundIndex = 1),
665        @TADescription(annotation = "TI", type = METHOD_TYPE_PARAMETER_BOUND,
666                genericLocation = {3, 0, 1, 0, 3, 0, 3, 0, 0, 0}, paramIndex = 0, boundIndex = 1),
667        @TADescription(annotation = "TJ", type = METHOD_TYPE_PARAMETER_BOUND,
668                genericLocation = {3, 0, 1, 0, 1, 0}, paramIndex = 0, boundIndex = 1),
669    })
670    public String testTypeparam5() {
671        return "class GOuter<A, B> {\n" +
672                " class GInner<X> {\n" +
673                "  class GInner2<Y, Z> {}\n" +
674                "}}\n\n" +
675                "class Test {\n" +
676                " <X extends List<@TA GOuter<@TB String, @TC List<@TD Object>> . @TE GInner<@TF List<@TG Object @TH[] @TI[]>>. @TJ GInner2<String, String>>> X test() { return null; }\n" +
677                "}";
678    }
679
680    @TADescription(annotation = "TA", type = FIELD,
681            genericLocation = {3, 0, 1, 0})
682    public String testUses1a() {
683        return "class Test { class Inner {}    List<@TA Inner> f; }";
684    }
685
686    @TADescription(annotation = "TA", type = FIELD,
687            genericLocation = {3, 0})
688    public String testUses1b() {
689        return "class Test { class Inner {}    List<@TA Test.Inner> f; }";
690    }
691
692    @TADescription(annotation = "TA", type = FIELD,
693            genericLocation = {3, 0, 1, 0, 1, 0})
694    @TestClass("Test$Inner")
695    public String testUses2a() {
696        return "class Test { class Inner { class Inner2{}    List<@TA Inner2> f; }}";
697    }
698
699    @TADescription(annotation = "TA", type = FIELD,
700            genericLocation = {3, 0, 1, 0})
701    @TestClass("Test$Inner")
702    public String testUses2b() {
703        return "class Test { class Inner { class Inner2{}    List<@TA Inner.Inner2> f; }}";
704    }
705
706    @TADescription(annotation = "TA", type = FIELD,
707            genericLocation = {3, 0, 1, 0, 1, 0})
708    @TestClass("Test$Inner")
709    public String testUses2c() {
710        return "class Test { class Inner { class Inner2{}    List<Inner.@TA Inner2> f; }}";
711    }
712
713    @TADescription(annotation = "TA", type = FIELD,
714            genericLocation = {3, 0})
715    @TestClass("Test$Inner")
716    public String testUses2d() {
717        return "class Test{ class Inner { class Inner2{}    List<@TA Test.Inner.Inner2> f; }}";
718    }
719
720    @TADescription(annotation = "TA", type = FIELD,
721            genericLocation = {3, 0, 1, 0})
722    @TestClass("Test$Inner")
723    public String testUses2e() {
724        return "class Test { class Inner { class Inner2{}    List<Test.@TA Inner.Inner2> f; }}";
725    }
726
727    @TADescription(annotation = "TA", type = FIELD,
728            genericLocation = {3, 0, 1, 0, 1, 0})
729    @TestClass("Test$Inner")
730    public String testUses2f() {
731        return "class Test { class Inner { class Inner2{}    List<Test.Inner.@TA Inner2> f; }}";
732    }
733
734    @TADescription(annotation = "TA", type = FIELD,
735            genericLocation = {3, 0, 1, 0, 1, 0})
736    @TestClass("Test$Inner")
737    public String testUses3a() {
738        return "class Test { class Inner<A, B> { class Inner2<C, D>{}\n" +
739                "    List<Test.Inner.@TA Inner2> f; }}";
740    }
741
742    @TADescription(annotation = "TA", type = FIELD,
743            genericLocation = {3, 0, 1, 0})
744    @TestClass("Test$Inner")
745    public String testUses3b() {
746        return "class Test { class Inner<A, B> { class Inner2<C, D>{}\n" +
747                "    List<Test.@TA Inner.Inner2> f; }}";
748    }
749
750    @TADescriptions({
751        @TADescription(annotation = "TA", type = FIELD,
752                genericLocation = {}),
753        @TADescription(annotation = "TB", type = FIELD,
754                genericLocation = {3, 0})
755    })
756    public String testUses4() {
757        return "class Test { static class TInner {}\n" +
758                "    @TA TInner f; \n" +
759                "    List<@TB TInner> g; }";
760    }
761
762    @TADescription(annotation = "TA", type = FIELD,
763            genericLocation = {3, 0, 1, 0, 3, 1})
764    @TestClass("Test$Inner")
765    public String testUses3c() {
766        return "class Test { class Inner<A, B> { class Inner2<C, D>{}\n" +
767                "    List<Test.Inner<String, @TA Object>.Inner2<Test, Test>> f; }}";
768    }
769
770    @TADescription(annotation = "TA", type = METHOD_FORMAL_PARAMETER, paramIndex=0)
771    public String testFullyQualified1() {
772        return "void testme(java.security.@TA ProtectionDomain protectionDomain) {}";
773    }
774
775    @TADescription(annotation = "TA", type = METHOD_FORMAL_PARAMETER, paramIndex=0,
776            genericLocation = {3, 0})
777    public String testFullyQualified2() {
778        return "void testme(List<java.security.@TA ProtectionDomain> protectionDomain) {}";
779    }
780
781    @TADescriptions({
782        @TADescription(annotation = "TA", type = LOCAL_VARIABLE,
783                genericLocation = {},
784                lvarOffset = ReferenceInfoUtil.IGNORE_VALUE,
785                lvarLength = ReferenceInfoUtil.IGNORE_VALUE,
786                lvarIndex = ReferenceInfoUtil.IGNORE_VALUE),
787        @TADescription(annotation = "TB", type = LOCAL_VARIABLE,
788                genericLocation = {1, 0},
789                lvarOffset = ReferenceInfoUtil.IGNORE_VALUE,
790                lvarLength = ReferenceInfoUtil.IGNORE_VALUE,
791                lvarIndex = ReferenceInfoUtil.IGNORE_VALUE),
792        @TADescription(annotation = "TC", type = LOCAL_VARIABLE,
793                // Only classes count, not methods.
794                genericLocation = {1, 0, 1, 0},
795                lvarOffset = ReferenceInfoUtil.IGNORE_VALUE,
796                lvarLength = ReferenceInfoUtil.IGNORE_VALUE,
797                lvarIndex = ReferenceInfoUtil.IGNORE_VALUE),
798    })
799    @TestClass("Outer$Inner")
800    public String testMethodNesting1() {
801        return "class Outer {\n" +
802                " class Inner {\n" +
803                "  void foo() {\n" +
804                "    class MInner {}\n" +
805                "    @TA Outer . @TB Inner l1 = null;\n" +
806                "    @TC MInner l2 = null;\n" +
807                "  }\n" +
808                "}}\n";
809    }
810
811    @TADescriptions({
812        @TADescription(annotation = "TA", type = NEW,
813                genericLocation = {},
814                offset = 0),
815        @TADescription(annotation = "TB", type = NEW,
816                genericLocation = {1, 0},
817                offset = 0),
818        @TADescription(annotation = "TC", type = NEW,
819                // Only classes count, not methods.
820                genericLocation = {1, 0, 1, 0},
821                offset = 12),
822    })
823    @TestClass("Outer$Inner")
824    public String testMethodNesting2() {
825        return "class Outer {\n" +
826                " class Inner {\n" +
827                "  void foo() {\n" +
828                "    class MInner {}\n" +
829                "    Object o1 = new @TA Outer . @TB Inner();" +
830                "    Object o2 = new @TC MInner();\n" +
831                "  }\n" +
832                "}}\n";
833    }
834
835    @TADescriptions({
836        @TADescription(annotation = "TA", type = CLASS_EXTENDS,
837                genericLocation = {}, typeIndex = -1),
838        @TADescription(annotation = "TB", type = CLASS_EXTENDS,
839                genericLocation = {3, 0}, typeIndex = -1),
840        @TADescription(annotation = "TC", type = CLASS_EXTENDS,
841                genericLocation = {3, 1}, typeIndex = -1),
842        @TADescription(annotation = "TD", type = CLASS_EXTENDS,
843                genericLocation = {1, 0}, typeIndex = -1),
844        @TADescription(annotation = "TE", type = CLASS_EXTENDS,
845                genericLocation = {1, 0, 3, 0}, typeIndex = -1),
846        @TADescription(annotation = "TF", type = CLASS_EXTENDS,
847                genericLocation = {1, 0, 3, 1}, typeIndex = -1)
848    })
849    @TestClass("GOuter$GInner$Test")
850    public String testExtends1() {
851        return "class GOuter<A, B> {\n" +
852                "  class GInner<X, Y> {\n" +
853                "    class Test extends @TA GOuter<@TB String, @TC String>.@TD GInner<@TE String, @TF String> {}" +
854                "  }" +
855                "}";
856    }
857
858    @TADescriptions({
859        @TADescription(annotation = "TA", type = CLASS_TYPE_PARAMETER,
860                genericLocation = {}, paramIndex = 0),
861        @TADescription(annotation = "TB", type = CLASS_TYPE_PARAMETER_BOUND,
862                genericLocation = {}, paramIndex = 0, boundIndex = 0),
863        @TADescription(annotation = "TC", type = FIELD,
864                genericLocation = {}),
865        @TADescription(annotation = "TD", type = FIELD,
866                genericLocation = {3, 0})
867    })
868    @TestClass("Test$1Nested")
869    public String testNestedInMethod1() {
870        return "class Test {\n" +
871                "  void foobar() {\n" +
872                "    class Nested<@TA X extends @TB Object> {\n" +
873                "      @TC List<@TD Object> f;\n" +
874                "    }\n" +
875                "  }" +
876                "}";
877    }
878}
879