langtools/test/tools/javac/annotations/typeAnnotations/referenceinfos/MethodTypeParam.java
changeset 15385 ee1eebe7e210
child 15557 3e211bbf4094
equal deleted inserted replaced
15384:5a8d00abf076 15385:ee1eebe7e210
       
     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 }