1 /*
2  * Copyright (c) 2009, 2015, 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 
24 import static com.sun.tools.classfile.TypeAnnotation.TargetType.*;
25 import static java.lang.System.lineSeparator;
26 
27 /*
28  * @test
29  * @bug 8042451
30  * @summary Test population of reference info for method type parameters
31  * @modules jdk.jdeps/com.sun.tools.classfile
32  * @compile -g Driver.java ReferenceInfoUtil.java MethodTypeParam.java
33  * @run main Driver MethodTypeParam
34  */
35 public class MethodTypeParam {
36 
37     @TADescription(annotation = "TA", type = METHOD_TYPE_PARAMETER, paramIndex = 0)
38     @TADescription(annotation = "TB", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 0, boundIndex = 0)
39     @TADescription(annotation = "TC", type = METHOD_TYPE_PARAMETER, paramIndex = 1)
40     @TADescription(annotation = "TD", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 0)
41     @TADescription(annotation = "TE", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 1)
regularClass()42     public String regularClass() {
43         return "<@TA K extends @TB Date, @TC V extends @TD Object & @TE Cloneable> void test() { }";
44     }
45 
46     @TADescription(annotation = "TA", type = METHOD_TYPE_PARAMETER, paramIndex = 0)
47     @TADescription(annotation = "TB", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 0, boundIndex = 0)
48     @TADescription(annotation = "TC", type = METHOD_TYPE_PARAMETER, paramIndex = 1)
49     @TADescription(annotation = "TE", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 1)
regularClass2()50     public String regularClass2() {
51         return "<@TA K extends @TB Date, @TC V extends @TE Cloneable> void test() { }";
52     }
53 
54     @TADescription(annotation = "TA", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 0, boundIndex = 1)
55     @TADescription(annotation = "TB", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 0, boundIndex = 1, genericLocation = {3, 1})
56     @TADescription(annotation = "TC", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 1)
57     @TADescription(annotation = "TD", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 1, genericLocation = {3, 0})
58     @TADescription(annotation = "TE", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 1, genericLocation = {3, 0, 3, 0})
59     @TADescription(annotation = "TF", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 0)
regularClassParameterized()60     public String regularClassParameterized() {
61         return "<K extends @TA Map<String, @TB String>, V extends @TF Object & @TC List<@TD List<@TE Object>>> void test() { }";
62     }
63 
64     @TADescription(annotation = "TA", type = METHOD_TYPE_PARAMETER, paramIndex = 0)
65     @TADescription(annotation = "TB", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 0, boundIndex = 0)
66     @TADescription(annotation = "TC", type = METHOD_TYPE_PARAMETER, paramIndex = 1)
67     @TADescription(annotation = "TD", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 0)
68     @TADescription(annotation = "TE", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 1)
abstractClass()69     public String abstractClass() {
70         return "abstract class %TEST_CLASS_NAME% { abstract <@TA K extends @TB Date, @TC V extends @TD Object & @TE Cloneable> void test(); }";
71     }
72 
73     @TADescription(annotation = "TA", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 0, boundIndex = 1)
74     @TADescription(annotation = "TB", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 0, boundIndex = 1, genericLocation = {3, 1})
75     @TADescription(annotation = "TC", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 1)
76     @TADescription(annotation = "TD", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 1, genericLocation = {3, 0})
77     @TADescription(annotation = "TE", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 1, genericLocation = {3, 0, 3, 0})
78     @TADescription(annotation = "TF", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 0)
79     @TADescription(annotation = "TG", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 0, boundIndex = 0)
abstractClassParameterized()80     public String abstractClassParameterized() {
81         return "abstract class %TEST_CLASS_NAME% { abstract <K extends @TG Object & @TA Map<String, @TB String>, V extends @TF Object & @TC List<@TD List<@TE Object>>> void test(); }";
82     }
83 
84     @TADescription(annotation = "TA", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 0, boundIndex = 1)
85     @TADescription(annotation = "TB", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 0, boundIndex = 1, genericLocation = {3, 1})
86     @TADescription(annotation = "TC", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 1)
87     @TADescription(annotation = "TD", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 1, genericLocation = {3, 0})
88     @TADescription(annotation = "TE", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 1, genericLocation = {3, 0, 3, 0})
abstractClassParameterized2()89     public String abstractClassParameterized2() {
90         return "abstract class %TEST_CLASS_NAME% { abstract <K extends @TA Map<String, @TB String>, V extends @TC List<@TD List<@TE Object>>> void test(); }";
91     }
92 
93     @TADescription(annotation = "TA", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 0, boundIndex = 1)
94     @TADescription(annotation = "TB", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 1)
abstractClassParameterized3()95     public String abstractClassParameterized3() {
96         return "abstract class %TEST_CLASS_NAME% { abstract <K extends @TA List<String>, V extends @TB List<Object>> void test(); }";
97     }
98 
99     @TADescription(annotation = "TA", type = METHOD_TYPE_PARAMETER, paramIndex = 0)
100     @TADescription(annotation = "TB", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 0, boundIndex = 0)
101     @TADescription(annotation = "TC", type = METHOD_TYPE_PARAMETER, paramIndex = 1)
102     @TADescription(annotation = "TD", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 0)
103     @TADescription(annotation = "TE", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 1)
regularInterface()104     public String regularInterface() {
105         return "interface %TEST_CLASS_NAME% { <@TA K extends @TB Date, @TC V extends @TD Object & @TE Cloneable> void test(); }";
106     }
107 
108     @TADescription(annotation = "TA", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 0, boundIndex = 1)
109     @TADescription(annotation = "TB", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 0, boundIndex = 1, genericLocation = {3, 1})
110     @TADescription(annotation = "TC", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 1)
111     @TADescription(annotation = "TD", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 1, genericLocation = {3, 0})
112     @TADescription(annotation = "TE", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 1, genericLocation = {3, 0, 3, 0})
113     @TADescription(annotation = "TF", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 0)
114     @TADescription(annotation = "TG", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 0, boundIndex = 0)
115     @TADescription(annotation = "TH", type = METHOD_TYPE_PARAMETER, paramIndex = 0)
116     @TADescription(annotation = "TI", type = METHOD_TYPE_PARAMETER, paramIndex = 1)
regularInterfaceParameterized()117     public String regularInterfaceParameterized() {
118         return "interface %TEST_CLASS_NAME% { <@TH K extends @TG Object & @TA Map<String, @TB String>, @TI V extends @TF Object & @TC List<@TD List<@TE Object>>> void test(); }";
119     }
120 
121     @TADescription(annotation = "TA", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 0, boundIndex = 1)
122     @TADescription(annotation = "TB", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 0, boundIndex = 1, genericLocation = {3, 1})
123     @TADescription(annotation = "TC", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 1)
124     @TADescription(annotation = "TD", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 1, genericLocation = {3, 0})
125     @TADescription(annotation = "TE", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 1, genericLocation = {3, 0, 3, 0})
126     @TADescription(annotation = "TF", type = METHOD_TYPE_PARAMETER, paramIndex = 0)
127     @TADescription(annotation = "TG", type = METHOD_TYPE_PARAMETER, paramIndex = 1)
regularInterfaceParameterized2()128     public String regularInterfaceParameterized2() {
129         return "interface %TEST_CLASS_NAME% { <@TF K extends @TA Map<String, @TB String>, @TG V extends @TC List<@TD List<@TE Object>>> void test(); }";
130     }
131 
132     @TADescription(annotation = "TA", type = METHOD_RETURN)
useInReturn1()133     public String useInReturn1() {
134         return "class %TEST_CLASS_NAME% { <T> @TA T m() { throw new RuntimeException(); } }";
135     }
136 
137     @TADescription(annotation = "TA", type = METHOD_RETURN, genericLocation = {3, 0})
useInReturn2()138     public String useInReturn2() {
139         return "class %TEST_CLASS_NAME% { <T> Class<@TA T> m() { throw new RuntimeException(); } }";
140     }
141 
142     @TADescription(annotation = "TA", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 0, boundIndex = 0)
143     @TADescription(annotation = "TB", type = METHOD_RETURN)
useInReturn3()144         public String useInReturn3() {
145         return "class %TEST_CLASS_NAME% { <T extends @TA Object> @TB T m() { throw new RuntimeException(); } }";
146     }
147 
148     @TADescription(annotation = "TA", type = METHOD_FORMAL_PARAMETER,
149             paramIndex = 0, genericLocation = {3, 0})
useInParam1()150     public String useInParam1() {
151         return "class %TEST_CLASS_NAME% { <T> void m(Class<@TA T> p) { throw new RuntimeException(); } }";
152     }
153 
154     @TADescription(annotation = "TA", type = METHOD_FORMAL_PARAMETER,
155             paramIndex = 0, genericLocation = {3, 0})
useInParam2()156     public String useInParam2() {
157         return "class %TEST_CLASS_NAME% { void m(Class<@TA Object> p) { throw new RuntimeException(); } }";
158     }
159 
160     @TADescription(annotation = "TA", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 0, boundIndex = 1)
161     @TADescription(annotation = "TB", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 0, boundIndex = 2)
162     @TADescription(annotation = "TC", type = METHOD_FORMAL_PARAMETER, paramIndex = 0)
useInParam3()163     public String useInParam3() {
164         return "interface IA {} " +
165                "interface IB<XB> {} " +
166                "interface IC<XC> {} " +
167                "class %TEST_CLASS_NAME% { <T extends @TA IB<IA> & @TB IC<IA>> void m(@TC T p) { throw new RuntimeException(); } }";
168     }
169 
170     @TADescription(annotation = "TA", type = METHOD_TYPE_PARAMETER_BOUND,
171                 paramIndex = 0, boundIndex = 1,
172                 genericLocation = {})
173     @TADescription(annotation = "TB", type = METHOD_TYPE_PARAMETER_BOUND,
174                 paramIndex = 0, boundIndex = 2,
175                 genericLocation = {})
176     @TADescription(annotation = "TC", type = METHOD_FORMAL_PARAMETER,
177                 paramIndex = 0)
useInParam4()178     public String useInParam4() {
179         return "class %TEST_CLASS_NAME% {" +
180                "  interface IA {} " +
181                "  interface IB<XB> {} " +
182                "  interface IC<XC> {} " +
183                "  <T extends @TA IB<IA> & @TB IC<IA>> void m(@TC T p) { throw new RuntimeException(); } }";
184     }
185 
186     @TADescription(annotation = "TA", type = METHOD_TYPE_PARAMETER_BOUND,
187                 paramIndex = 0, boundIndex = 0,
188                 genericLocation = {})
189     @TADescription(annotation = "TB", type = METHOD_TYPE_PARAMETER_BOUND,
190                 paramIndex = 0, boundIndex = 0,
191                 genericLocation = {1, 0})
192     @TADescription(annotation = "TC", type = METHOD_TYPE_PARAMETER_BOUND,
193                 paramIndex = 0, boundIndex = 0,
194                 genericLocation = {1, 0, 3, 0})
useInParam5()195         public String useInParam5() {
196     return "class %TEST_CLASS_NAME% {" +
197                "  interface IA {} " +
198                "  class CB<XC> {} " +
199                "  <T extends @TA %TEST_CLASS_NAME%. @TB CB<@TC IA>> void m(T p) { throw new RuntimeException(); } }";
200     }
201 
202     @TADescription(annotation = "TA", type = METHOD_TYPE_PARAMETER,
203                 paramIndex = 0)
204     @TADescription(annotation = "TB", type = METHOD_TYPE_PARAMETER_BOUND,
205                 paramIndex = 0, boundIndex = 0,
206                 genericLocation = {})
207     @TADescription(annotation = "TC", type = METHOD_TYPE_PARAMETER_BOUND,
208                 paramIndex = 0, boundIndex = 0,
209                 genericLocation = {1, 0, 3, 0})
210     @TADescription(annotation = "TD", type = METHOD_TYPE_PARAMETER_BOUND,
211                 paramIndex = 0, boundIndex = 1,
212                 genericLocation = {})
213     @TADescription(annotation = "TE", type = METHOD_TYPE_PARAMETER_BOUND,
214                 paramIndex = 0, boundIndex = 1,
215                 genericLocation = {3, 0})
useInParam6()216     public String useInParam6() {
217         return "class %TEST_CLASS_NAME% {" +
218                "  interface IA {} " +
219                "  interface IB<XB> {} " +
220                "  class CC<XC> {} " +
221                "  interface ID<XD> {} " +
222                "  <@TA T extends @TB %TEST_CLASS_NAME%.CC<@TC IA> & %TEST_CLASS_NAME%. @TD ID<@TE IA>> void m(T p) { throw new RuntimeException(); } }";
223     }
224 
225     @TADescription(annotation = "RTAs", type = METHOD_TYPE_PARAMETER, paramIndex = 0)
226     @TADescription(annotation = "RTBs", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 0, boundIndex = 0)
227     @TADescription(annotation = "RTCs", type = METHOD_TYPE_PARAMETER, paramIndex = 1)
228     @TADescription(annotation = "RTDs", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 0)
229     @TADescription(annotation = "RTEs", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 1)
regularClassRepeatableAnnotation()230     public String regularClassRepeatableAnnotation() {
231         return "<@RTA @RTA K extends @RTB @RTB Date, @RTC @RTC V extends @RTD @RTD Object & @RTE @RTE Cloneable> void test() { }";
232     }
233 
234     @TADescription(annotation = "RTAs", type = METHOD_TYPE_PARAMETER, paramIndex = 0)
235     @TADescription(annotation = "RTBs", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 0, boundIndex = 0)
236     @TADescription(annotation = "RTCs", type = METHOD_TYPE_PARAMETER, paramIndex = 1)
237     @TADescription(annotation = "RTEs", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 1)
regularClassRepeatableAnnotation2()238     public String regularClassRepeatableAnnotation2() {
239         return "<@RTA @RTA K extends @RTB @RTB Date, @RTC @RTC V extends @RTE @RTE Cloneable> void test() { }";
240     }
241 
242     @TADescription(annotation = "RTAs", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 0, boundIndex = 1)
243     @TADescription(annotation = "RTBs", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 0, boundIndex = 1, genericLocation = {3, 1})
244     @TADescription(annotation = "RTCs", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 1)
245     @TADescription(annotation = "RTDs", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 1, genericLocation = {3, 0})
246     @TADescription(annotation = "RTEs", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 1, genericLocation = {3, 0, 3, 0})
247     @TADescription(annotation = "RTFs", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 0)
regularClassParameterizedRepeatableAnnotation()248     public String regularClassParameterizedRepeatableAnnotation() {
249         return "<K extends @RTA @RTA Map<String, @RTB @RTB String>, V extends @RTF @RTF Object" +
250                 " & @RTC @RTC List<@RTD @RTD List<@RTE @RTE Object>>> void test() { }";
251     }
252 
253     @TADescription(annotation = "RTAs", type = METHOD_TYPE_PARAMETER, paramIndex = 0)
254     @TADescription(annotation = "RTBs", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 0, boundIndex = 0)
255     @TADescription(annotation = "RTCs", type = METHOD_TYPE_PARAMETER, paramIndex = 1)
256     @TADescription(annotation = "RTDs", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 0)
257     @TADescription(annotation = "RTEs", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 1)
abstractClassRepeatableAnnotation()258     public String abstractClassRepeatableAnnotation() {
259         return "abstract class %TEST_CLASS_NAME% { abstract <@RTA @RTA K extends @RTB @RTB Date," +
260                 " @RTC @RTC V extends @RTD @RTD Object & @RTE @RTE Cloneable> void test(); }";
261     }
262 
263     @TADescription(annotation = "RTAs", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 0, boundIndex = 1)
264     @TADescription(annotation = "RTBs", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 0, boundIndex = 1, genericLocation = {3, 1})
265     @TADescription(annotation = "RTCs", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 1)
266     @TADescription(annotation = "RTDs", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 1, genericLocation = {3, 0})
267     @TADescription(annotation = "RTEs", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 0, boundIndex = 0)
268     @TADescription(annotation = "RTFs", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 0)
abstractClassParameterizedRepeatableAnnotation()269     public String abstractClassParameterizedRepeatableAnnotation() {
270         return "abstract class %TEST_CLASS_NAME% { abstract <K extends @RTE @RTE Object &" +
271                 " @RTA @RTA Map<String, @RTB @RTB String>, V extends @RTF @RTF Object &" +
272                 " @RTC @RTC List<@RTD @RTD Object>> void test(); }";
273     }
274 
275     @TADescription(annotation = "RTAs", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 0, boundIndex = 1)
276     @TADescription(annotation = "RTBs", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 0, boundIndex = 1, genericLocation = {3, 1})
277     @TADescription(annotation = "RTCs", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 1)
278     @TADescription(annotation = "RTDs", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 1, genericLocation = {3, 0})
279     @TADescription(annotation = "RTEs", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 1, genericLocation = {3, 0, 3, 0})
abstractClassParameterizedRepeatableAnnotation2()280     public String abstractClassParameterizedRepeatableAnnotation2() {
281         return "abstract class %TEST_CLASS_NAME% { abstract <K extends @RTA @RTA Map<String, @RTB @RTB String>," +
282                 " V extends @RTC @RTC List<@RTD @RTD List<@RTE @RTE Object>>> void test(); }";
283     }
284 
285     @TADescription(annotation = "RTAs", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 0, boundIndex = 1)
286     @TADescription(annotation = "RTBs", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 1)
abstractClassParameterizedRepeatableAnnotation3()287     public String abstractClassParameterizedRepeatableAnnotation3() {
288         return "abstract class %TEST_CLASS_NAME% { abstract <K extends @RTA @RTA List<String>," +
289                 " V extends @RTB @RTB List<Object>> void test(); }";
290     }
291 
292     @TADescription(annotation = "RTAs", type = METHOD_TYPE_PARAMETER, paramIndex = 0)
293     @TADescription(annotation = "RTBs", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 0, boundIndex = 0)
294     @TADescription(annotation = "RTCs", type = METHOD_TYPE_PARAMETER, paramIndex = 1)
295     @TADescription(annotation = "RTDs", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 0)
296     @TADescription(annotation = "RTEs", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 1)
regularInterfaceRepeatableAnnotation()297     public String regularInterfaceRepeatableAnnotation() {
298         return "interface %TEST_CLASS_NAME% { <@RTA @RTA K extends @RTB @RTB Date," +
299                 " @RTC @RTC V extends @RTD @RTD Object & @RTE @RTE Cloneable> void test(); }";
300     }
301 
302     @TADescription(annotation = "RTAs", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 0, boundIndex = 1)
303     @TADescription(annotation = "RTBs", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 0, boundIndex = 1, genericLocation = {3, 1})
304     @TADescription(annotation = "RTCs", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 1)
305     @TADescription(annotation = "RTDs", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 1, genericLocation = {3, 0})
306     @TADescription(annotation = "RTEs", type = METHOD_TYPE_PARAMETER, paramIndex = 1)
307     @TADescription(annotation = "RTFs", type = METHOD_TYPE_PARAMETER, paramIndex = 0)
regularInterfaceParameterizedRepeatableAnnotation()308     public String regularInterfaceParameterizedRepeatableAnnotation() {
309         return "interface %TEST_CLASS_NAME% { <@RTF @RTF K extends @RTA @RTA Map<String, @RTB @RTB String>," +
310                 " @RTE @RTE V extends @RTC @RTC List<@RTD @RTD Object>> void test(); }";
311     }
312 
313     @TADescription(annotation = "RTAs", type = METHOD_RETURN)
useInReturnRepeatableAnnotation1()314     public String useInReturnRepeatableAnnotation1() {
315         return "class %TEST_CLASS_NAME% { <T> @RTA @RTA T m() { throw new RuntimeException(); } }";
316     }
317 
318     @TADescription(annotation = "RTAs", type = METHOD_RETURN, genericLocation = {3, 0})
useInReturnRepeatableAnnotation2()319     public String useInReturnRepeatableAnnotation2() {
320         return "class %TEST_CLASS_NAME% { <T> Class<@RTA @RTA T> m() { throw new RuntimeException(); } }";
321     }
322 
323     @TADescription(annotation = "RTAs", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 0, boundIndex = 0)
324     @TADescription(annotation = "RTBs", type = METHOD_RETURN)
useInReturnRepeatableAnnotation3()325     public String useInReturnRepeatableAnnotation3() {
326         return "class %TEST_CLASS_NAME% { <T extends @RTA @RTA Object> @RTB @RTB T m() { throw new RuntimeException(); } }";
327     }
328 
329     @TADescription(annotation = "RTAs", type = METHOD_FORMAL_PARAMETER,
330             paramIndex = 0, genericLocation = {3, 0})
useInParamRepeatableAnnotation1()331     public String useInParamRepeatableAnnotation1() {
332         return "class %TEST_CLASS_NAME% { <T> void m(Class<@RTA @RTA T> p) { throw new RuntimeException(); } }";
333     }
334 
335     @TADescription(annotation = "RTAs", type = METHOD_FORMAL_PARAMETER,
336             paramIndex = 0, genericLocation = {3, 0})
useInParamRepeatableAnnotation2()337     public String useInParamRepeatableAnnotation2() {
338         return "class %TEST_CLASS_NAME% { void m(Class<@RTA @RTA Object> p) { throw new RuntimeException(); } }";
339     }
340 
341     @TADescription(annotation = "RTAs", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 0, boundIndex = 1)
342     @TADescription(annotation = "RTBs", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 0, boundIndex = 2)
343     @TADescription(annotation = "RTCs", type = METHOD_FORMAL_PARAMETER, paramIndex = 0)
useInParamRepeatableAnnotation3()344     public String useInParamRepeatableAnnotation3() {
345         return "interface IA {} " +
346                 "interface IB<XB> {} " +
347                 "interface IC<XC> {} " +
348                 "class %TEST_CLASS_NAME% { <T extends @RTA @RTA IB<IA> & @RTB @RTB IC<IA>>" +
349                 " void m(@RTC @RTC T p) { throw new RuntimeException(); } }";
350     }
351 
352     @TADescription(annotation = "RTAs", type = METHOD_TYPE_PARAMETER_BOUND,
353             paramIndex = 0, boundIndex = 1,
354             genericLocation = {})
355     @TADescription(annotation = "RTBs", type = METHOD_TYPE_PARAMETER_BOUND,
356             paramIndex = 0, boundIndex = 2,
357             genericLocation = {})
358     @TADescription(annotation = "RTCs", type = METHOD_FORMAL_PARAMETER,
359             paramIndex = 0)
useInParamRepeatableAnnotation4()360     public String useInParamRepeatableAnnotation4() {
361         return "class %TEST_CLASS_NAME% {" +
362                 "  interface IA {} " +
363                 "  interface IB<XB> {} " +
364                 "  interface IC<XC> {} " +
365                 "  <T extends @RTA @RTA IB<IA> & @RTB @RTB IC<IA>>" +
366                 " void m(@RTC @RTC T p) { throw new RuntimeException(); } }";
367     }
368 
369     @TADescription(annotation = "RTAs", type = METHOD_TYPE_PARAMETER_BOUND,
370             paramIndex = 0, boundIndex = 0,
371             genericLocation = {})
372     @TADescription(annotation = "RTBs", type = METHOD_TYPE_PARAMETER_BOUND,
373             paramIndex = 0, boundIndex = 0,
374             genericLocation = {1, 0})
375     @TADescription(annotation = "RTCs", type = METHOD_TYPE_PARAMETER_BOUND,
376             paramIndex = 0, boundIndex = 0,
377             genericLocation = {1, 0, 3, 0})
useInParamRepeatableAnnotation5()378     public String useInParamRepeatableAnnotation5() {
379         return "class %TEST_CLASS_NAME% {" +
380                 "  interface IA {} " +
381                 "  class CB<XC> {} " +
382                 "  <T extends @RTA @RTA %TEST_CLASS_NAME%. @RTB @RTB" +
383                 " CB<@RTC @RTC IA>> void m(T p) { throw new RuntimeException(); } }";
384     }
385 
386     @TADescription(annotation = "RTAs", type = METHOD_TYPE_PARAMETER,
387             paramIndex = 0)
388     @TADescription(annotation = "RTBs", type = METHOD_TYPE_PARAMETER_BOUND,
389             paramIndex = 0, boundIndex = 0,
390             genericLocation = {})
391     @TADescription(annotation = "RTCs", type = METHOD_TYPE_PARAMETER_BOUND,
392             paramIndex = 0, boundIndex = 0,
393             genericLocation = {1, 0, 3, 0})
394     @TADescription(annotation = "RTDs", type = METHOD_TYPE_PARAMETER_BOUND,
395             paramIndex = 0, boundIndex = 1,
396             genericLocation = {})
397     @TADescription(annotation = "RTEs", type = METHOD_TYPE_PARAMETER_BOUND,
398             paramIndex = 0, boundIndex = 1,
399             genericLocation = {3, 0})
useInParamRepeatableAnnotation6()400     public String useInParamRepeatableAnnotation6() {
401         return "class %TEST_CLASS_NAME% {" +
402                 "  interface IA {} " +
403                 "  interface IB<XB> {} " +
404                 "  class CC<XC> {} " +
405                 "  interface ID<XD> {} " +
406                 "  <@RTA @RTA T extends @RTB @RTB %TEST_CLASS_NAME%.CC<@RTC @RTC IA> &" +
407                 " %TEST_CLASS_NAME%. @RTD @RTD ID<@RTE @RTE IA>> void m(T p) { throw new RuntimeException(); } }";
408     }
409 }
410