1 /* 2 * Copyright (c) 2009, 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 }) 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 }) 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 }) 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 }) 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 }) 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 }) 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 }) 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 }) 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 }) 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 }) 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) 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}) 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 }) 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}) 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}) 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 }) 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 }) 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 }) 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 }) 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 }