1 /*
2  * Copyright (c) 2009, 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 
24 import static com.sun.tools.classfile.TypeAnnotation.TargetType.*;
25 
26 /*
27  * @test
28  * @summary Test population of reference info for method type parameters
29  * @compile -g Driver.java ReferenceInfoUtil.java MethodTypeParam.java
30  * @run main Driver MethodTypeParam
31  */
32 public class MethodTypeParam {
33 
34     @TADescriptions({
35         @TADescription(annotation = "TA", type = METHOD_TYPE_PARAMETER, paramIndex = 0),
36         @TADescription(annotation = "TB", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 0, boundIndex = 0),
37         @TADescription(annotation = "TC", type = METHOD_TYPE_PARAMETER, paramIndex = 1),
38         @TADescription(annotation = "TD", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 0),
39         @TADescription(annotation = "TE", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 1)
40     })
regularClass()41     public String regularClass() {
42         return "<@TA K extends @TB Date, @TC V extends @TD Object & @TE Cloneable> void test() { }";
43     }
44 
45     @TADescriptions({
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)
50     })
regularClass2()51     public String regularClass2() {
52         return "<@TA K extends @TB Date, @TC V extends @TE Cloneable> void test() { }";
53     }
54 
55     @TADescriptions({
56         @TADescription(annotation = "TA", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 0, boundIndex = 1),
57         @TADescription(annotation = "TB", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 0, boundIndex = 1, genericLocation = {3, 1}),
58         @TADescription(annotation = "TC", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 1),
59         @TADescription(annotation = "TD", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 1, genericLocation = {3, 0}),
60         @TADescription(annotation = "TE", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 1, genericLocation = {3, 0, 3, 0}),
61         @TADescription(annotation = "TF", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 0)
62     })
regularClassParameterized()63     public String regularClassParameterized() {
64         return "<K extends @TA Map<String, @TB String>, V extends @TF Object & @TC List<@TD List<@TE Object>>> void test() { }";
65     }
66 
67     @TADescriptions({
68         @TADescription(annotation = "TA", type = METHOD_TYPE_PARAMETER, paramIndex = 0),
69         @TADescription(annotation = "TB", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 0, boundIndex = 0),
70         @TADescription(annotation = "TC", type = METHOD_TYPE_PARAMETER, paramIndex = 1),
71         @TADescription(annotation = "TD", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 0),
72         @TADescription(annotation = "TE", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 1)
73     })
abstractClass()74     public String abstractClass() {
75         return "abstract class Test { abstract <@TA K extends @TB Date, @TC V extends @TD Object & @TE Cloneable> void test(); }";
76     }
77 
78     @TADescriptions({
79         @TADescription(annotation = "TA", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 0, boundIndex = 1),
80         @TADescription(annotation = "TB", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 0, boundIndex = 1, genericLocation = {3, 1}),
81         @TADescription(annotation = "TC", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 1),
82         @TADescription(annotation = "TD", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 1, genericLocation = {3, 0}),
83         @TADescription(annotation = "TE", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 1, genericLocation = {3, 0, 3, 0}),
84         @TADescription(annotation = "TF", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 0),
85         @TADescription(annotation = "TG", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 0, boundIndex = 0)
86     })
abstractClassParameterized()87     public String abstractClassParameterized() {
88         return "abstract class Test { abstract <K extends @TG Object & @TA Map<String, @TB String>, V extends @TF Object & @TC List<@TD List<@TE Object>>> void test(); }";
89     }
90 
91     @TADescriptions({
92         @TADescription(annotation = "TA", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 0, boundIndex = 1),
93         @TADescription(annotation = "TB", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 0, boundIndex = 1, genericLocation = {3, 1}),
94         @TADescription(annotation = "TC", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 1),
95         @TADescription(annotation = "TD", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 1, genericLocation = {3, 0}),
96         @TADescription(annotation = "TE", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 1, genericLocation = {3, 0, 3, 0})
97     })
abstractClassParameterized2()98     public String abstractClassParameterized2() {
99         return "abstract class Test { abstract <K extends @TA Map<String, @TB String>, V extends @TC List<@TD List<@TE Object>>> void test(); }";
100     }
101 
102     @TADescriptions({
103         @TADescription(annotation = "TA", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 0, boundIndex = 1),
104         @TADescription(annotation = "TB", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 1)
105     })
abstractClassParameterized3()106     public String abstractClassParameterized3() {
107         return "abstract class Test { abstract <K extends @TA List<String>, V extends @TB List<Object>> void test(); }";
108     }
109 
110     @TADescriptions({
111         @TADescription(annotation = "TA", type = METHOD_TYPE_PARAMETER, paramIndex = 0),
112         @TADescription(annotation = "TB", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 0, boundIndex = 0),
113         @TADescription(annotation = "TC", type = METHOD_TYPE_PARAMETER, paramIndex = 1),
114         @TADescription(annotation = "TD", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 0),
115         @TADescription(annotation = "TE", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 1)
116     })
regularInterface()117     public String regularInterface() {
118         return "interface Test { <@TA K extends @TB Date, @TC V extends @TD Object & @TE Cloneable> void test(); }";
119     }
120 
121     @TADescriptions({
122         @TADescription(annotation = "TA", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 0, boundIndex = 1),
123         @TADescription(annotation = "TB", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 0, boundIndex = 1, genericLocation = {3, 1}),
124         @TADescription(annotation = "TC", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 1),
125         @TADescription(annotation = "TD", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 1, genericLocation = {3, 0}),
126         @TADescription(annotation = "TE", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 1, genericLocation = {3, 0, 3, 0}),
127         @TADescription(annotation = "TF", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 0),
128         @TADescription(annotation = "TG", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 0, boundIndex = 0),
129         @TADescription(annotation = "TH", type = METHOD_TYPE_PARAMETER, paramIndex = 0),
130         @TADescription(annotation = "TI", type = METHOD_TYPE_PARAMETER, paramIndex = 1)
131     })
regularInterfaceParameterized()132     public String regularInterfaceParameterized() {
133         return "interface Test { <@TH K extends @TG Object & @TA Map<String, @TB String>, @TI V extends @TF Object & @TC List<@TD List<@TE Object>>> void test(); }";
134     }
135 
136     @TADescriptions({
137         @TADescription(annotation = "TA", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 0, boundIndex = 1),
138         @TADescription(annotation = "TB", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 0, boundIndex = 1, genericLocation = {3, 1}),
139         @TADescription(annotation = "TC", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 1),
140         @TADescription(annotation = "TD", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 1, genericLocation = {3, 0}),
141         @TADescription(annotation = "TE", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 1, boundIndex = 1, genericLocation = {3, 0, 3, 0}),
142         @TADescription(annotation = "TF", type = METHOD_TYPE_PARAMETER, paramIndex = 0),
143         @TADescription(annotation = "TG", type = METHOD_TYPE_PARAMETER, paramIndex = 1)
144     })
regularInterfaceParameterized2()145     public String regularInterfaceParameterized2() {
146         return "interface Test { <@TF K extends @TA Map<String, @TB String>, @TG V extends @TC List<@TD List<@TE Object>>> void test(); }";
147     }
148 
149     @TADescription(annotation = "TA", type = METHOD_RETURN)
useInReturn1()150     public String useInReturn1() {
151         return "class Test { <T> @TA T m() { throw new RuntimeException(); } }";
152     }
153 
154     @TADescription(annotation = "TA", type = METHOD_RETURN, genericLocation = {3, 0})
useInReturn2()155     public String useInReturn2() {
156         return "class Test { <T> Class<@TA T> m() { throw new RuntimeException(); } }";
157     }
158 
159     @TADescriptions({
160         @TADescription(annotation = "TA", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 0, boundIndex = 0),
161         @TADescription(annotation = "TB", type = METHOD_RETURN)
162     })
useInReturn3()163     public String useInReturn3() {
164         return "class Test { <T extends @TA Object> @TB T m() { throw new RuntimeException(); } }";
165     }
166 
167     @TADescription(annotation = "TA", type = METHOD_FORMAL_PARAMETER,
168             paramIndex = 0, genericLocation = {3, 0})
useInParam1()169     public String useInParam1() {
170         return "class Test { <T> void m(Class<@TA T> p) { throw new RuntimeException(); } }";
171     }
172 
173     @TADescription(annotation = "TA", type = METHOD_FORMAL_PARAMETER,
174             paramIndex = 0, genericLocation = {3, 0})
useInParam2()175     public String useInParam2() {
176         return "class Test { void m(Class<@TA Object> p) { throw new RuntimeException(); } }";
177     }
178 
179     @TADescriptions({
180         @TADescription(annotation = "TA", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 0, boundIndex = 1),
181         @TADescription(annotation = "TB", type = METHOD_TYPE_PARAMETER_BOUND, paramIndex = 0, boundIndex = 2),
182         @TADescription(annotation = "TC", type = METHOD_FORMAL_PARAMETER, paramIndex = 0)
183     })
useInParam3()184     public String useInParam3() {
185         return "interface IA {} " +
186                "interface IB<XB> {} " +
187                "interface IC<XC> {} " +
188                "class Test { <T extends @TA IB<IA> & @TB IC<IA>> void m(@TC T p) { throw new RuntimeException(); } }";
189     }
190 
191     @TADescriptions({
192         @TADescription(annotation = "TA", type = METHOD_TYPE_PARAMETER_BOUND,
193                 paramIndex = 0, boundIndex = 1,
194                 genericLocation = {}),
195         @TADescription(annotation = "TB", type = METHOD_TYPE_PARAMETER_BOUND,
196                 paramIndex = 0, boundIndex = 2,
197                 genericLocation = {}),
198         @TADescription(annotation = "TC", type = METHOD_FORMAL_PARAMETER,
199                 paramIndex = 0)
200     })
useInParam4()201     public String useInParam4() {
202         return "class Test {" +
203                "  interface IA {} " +
204                "  interface IB<XB> {} " +
205                "  interface IC<XC> {} " +
206                "  <T extends @TA IB<IA> & @TB IC<IA>> void m(@TC T p) { throw new RuntimeException(); } }";
207     }
208 
209     @TADescriptions({
210         @TADescription(annotation = "TA", type = METHOD_TYPE_PARAMETER_BOUND,
211                 paramIndex = 0, boundIndex = 0,
212                 genericLocation = {}),
213         @TADescription(annotation = "TB", type = METHOD_TYPE_PARAMETER_BOUND,
214                 paramIndex = 0, boundIndex = 0,
215                 genericLocation = {1, 0}),
216         @TADescription(annotation = "TC", type = METHOD_TYPE_PARAMETER_BOUND,
217                 paramIndex = 0, boundIndex = 0,
218                 genericLocation = {1, 0, 3, 0}),
219     })
useInParam5()220     public String useInParam5() {
221         return "class Test {" +
222                "  interface IA {} " +
223                "  class CB<XC> {} " +
224                "  <T extends @TA Test. @TB CB<@TC IA>> void m(T p) { throw new RuntimeException(); } }";
225     }
226 
227     @TADescriptions({
228         @TADescription(annotation = "TA", type = METHOD_TYPE_PARAMETER,
229                 paramIndex = 0),
230         @TADescription(annotation = "TB", type = METHOD_TYPE_PARAMETER_BOUND,
231                 paramIndex = 0, boundIndex = 0,
232                 genericLocation = {}),
233         @TADescription(annotation = "TC", type = METHOD_TYPE_PARAMETER_BOUND,
234                 paramIndex = 0, boundIndex = 0,
235                 genericLocation = {1, 0, 3, 0}),
236         @TADescription(annotation = "TD", type = METHOD_TYPE_PARAMETER_BOUND,
237                 paramIndex = 0, boundIndex = 1,
238                 genericLocation = {}),
239         @TADescription(annotation = "TE", type = METHOD_TYPE_PARAMETER_BOUND,
240                 paramIndex = 0, boundIndex = 1,
241                 genericLocation = {3, 0})
242     })
useInParam6()243     public String useInParam6() {
244         return "class Test {" +
245                "  interface IA {} " +
246                "  interface IB<XB> {} " +
247                "  class CC<XC> {} " +
248                "  interface ID<XD> {} " +
249                "  <@TA T extends @TB Test.CC<@TC IA> & Test. @TD ID<@TE IA>> void m(T p) { throw new RuntimeException(); } }";
250     }
251 }
252