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 }