1 /*
   2  * Copyright (c) 2012 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 nested types
  29  * @compile -g Driver.java ReferenceInfoUtil.java NestedTypes.java
  30  * @run main Driver NestedTypes
  31  */
  32 public class NestedTypes {
  33 
  34     // method parameters
  35 
  36     @TADescriptions({
  37         @TADescription(annotation = "TA", type = METHOD_FORMAL_PARAMETER,
  38                 genericLocation = {}, paramIndex = 0),
  39         @TADescription(annotation = "TB", type = METHOD_FORMAL_PARAMETER,
  40                 genericLocation = {1, 0}, paramIndex = 0)
  41     })
  42     public String testParam1() {
  43         return "void test(@TA Outer.@TB Inner a) { }";
  44     }
  45 
  46     @TADescriptions({
  47         @TADescription(annotation = "TA", type = METHOD_FORMAL_PARAMETER,
  48                 genericLocation = {3, 0}, paramIndex = 0),
  49         @TADescription(annotation = "TB", type = METHOD_FORMAL_PARAMETER,
  50                 genericLocation = {3, 0, 1, 0}, paramIndex = 0)
  51     })
  52     public String testParam1b() {
  53         return "void test(List<@TA Outer.@TB Inner> a) { }";
  54     }
  55 
  56     // TODO: the tests that use @TA Map.Entry should fail, as
  57     // Map cannot be annotated.
  58     // We need some tests for the fully qualified name syntax.
  59     /*
  60     @TADescription(annotation = "TA", type = METHOD_FORMAL_PARAMETER,
  61             genericLocation = {}, paramIndex = 0)
  62     public String testParam1c() {
  63         return "void test(java.util.@TA Map.Entry a) { }";
  64     }
  65 
  66     @TADescriptions({
  67         @TADescription(annotation = "TA", type = METHOD_FORMAL_PARAMETER,
  68                 genericLocation = {}, paramIndex = 0),
  69         @TADescription(annotation = "TB", type = METHOD_FORMAL_PARAMETER,
  70                 genericLocation = {1, 0}, paramIndex = 0)
  71     })
  72     public String testParam1d() {
  73         return "void test(java.util.@TA Map.@TB Entry a) { }";
  74     }
  75 
  76     @TADescription(annotation = "TA", type = METHOD_FORMAL_PARAMETER,
  77             genericLocation = {3, 0}, paramIndex = 0)
  78     public String testParam1e() {
  79         return "void test(List<java.util.@TA Map.Entry> a) { }";
  80     }
  81 
  82     @TADescriptions({
  83         @TADescription(annotation = "TA", type = METHOD_FORMAL_PARAMETER,
  84                 genericLocation = {3, 0}, paramIndex = 0),
  85         @TADescription(annotation = "TB", type = METHOD_FORMAL_PARAMETER,
  86                 genericLocation = {3, 0, 1, 0}, paramIndex = 0)
  87     })
  88     public String testParam1f() {
  89         return "void test(List<java.util.@TA Map. @TB Entry> a) { }";
  90     }
  91     */
  92 
  93     @TADescription(annotation = "TB", type = METHOD_FORMAL_PARAMETER,
  94            genericLocation = {3, 0}, paramIndex = 0)
  95     public String testParam1g() {
  96         return "void test(List<java.util.Map. @TB Entry> a) { }";
  97     }
  98 
  99     @TADescriptions({
 100         @TADescription(annotation = "TA", type = METHOD_FORMAL_PARAMETER,
 101                 genericLocation = {}, paramIndex = 0),
 102         @TADescription(annotation = "TB", type = METHOD_FORMAL_PARAMETER,
 103                 genericLocation = {1, 0}, paramIndex = 0)
 104     })
 105     public String testParam2() {
 106         return "void test(@TA GOuter<String,String>.@TB GInner<String,String> a) { }";
 107     }
 108 
 109     @TADescriptions({
 110         @TADescription(annotation = "TA", type = METHOD_FORMAL_PARAMETER,
 111                 genericLocation = {3, 0}, paramIndex = 0),
 112         @TADescription(annotation = "TB", type = METHOD_FORMAL_PARAMETER,
 113                 genericLocation = {3, 0, 1, 0}, paramIndex = 0)
 114     })
 115     public String testParam2b() {
 116         return "void test(List<@TA GOuter<String,String>.@TB GInner<String,String>> a) { }";
 117     }
 118 
 119     @TADescriptions({
 120         @TADescription(annotation = "TA", type = METHOD_FORMAL_PARAMETER,
 121                 genericLocation = {0, 0, 0, 0}, paramIndex = 0),
 122         @TADescription(annotation = "TB", type = METHOD_FORMAL_PARAMETER,
 123                 genericLocation = {0, 0, 0, 0, 1, 0}, paramIndex = 0),
 124         @TADescription(annotation = "TC", type = METHOD_FORMAL_PARAMETER,
 125                 genericLocation = {0, 0, 0, 0, 1, 0, 3, 0}, paramIndex = 0),
 126         @TADescription(annotation = "TD", type = METHOD_FORMAL_PARAMETER,
 127                 genericLocation = {0, 0, 0, 0, 1, 0, 3, 0, 3, 0, 0, 0, 0, 0}, paramIndex = 0),
 128         @TADescription(annotation = "TE", type = METHOD_FORMAL_PARAMETER,
 129                 genericLocation = {0, 0, 0, 0, 1, 0, 3, 0, 3, 0}, paramIndex = 0),
 130         @TADescription(annotation = "TF", type = METHOD_FORMAL_PARAMETER,
 131                 genericLocation = {0, 0, 0, 0, 1, 0, 3, 0, 3, 0, 0, 0}, paramIndex = 0),
 132         @TADescription(annotation = "TG", type = METHOD_FORMAL_PARAMETER,
 133                 genericLocation = {0, 0, 0, 0, 1, 0, 1, 0}, paramIndex = 0),
 134         @TADescription(annotation = "TH", type = METHOD_FORMAL_PARAMETER,
 135                 genericLocation = {0, 0, 0, 0, 1, 0, 1, 0, 3, 0}, paramIndex = 0),
 136         @TADescription(annotation = "TI", type = METHOD_FORMAL_PARAMETER,
 137                 genericLocation = {0, 0, 0, 0, 1, 0, 1, 0, 3, 1}, paramIndex = 0),
 138         @TADescription(annotation = "TJ", type = METHOD_FORMAL_PARAMETER, paramIndex = 0),
 139         @TADescription(annotation = "TK", type = METHOD_FORMAL_PARAMETER,
 140                 genericLocation = {0, 0}, paramIndex = 0)
 141     })
 142     public String testParam3() {
 143         return "class Outer {\n" +
 144                 " class GInner<X> {\n" +
 145                 "  class GInner2<Y, Z> {}\n" +
 146                 "}}\n\n" +
 147                 "class Test {\n" +
 148                 " void test(@TA Outer . @TB GInner<@TC List<@TD Object @TE[] @TF[]>>. @TG GInner2<@TH Integer, @TI Object> @TJ[] @TK[] a) { }\n" +
 149                 "}";
 150     }
 151 
 152     @TADescriptions({
 153         @TADescription(annotation = "TA", type = METHOD_FORMAL_PARAMETER,
 154                 genericLocation = {3, 0, 0, 0, 0, 0}, paramIndex = 0),
 155         @TADescription(annotation = "TB", type = METHOD_FORMAL_PARAMETER,
 156                 genericLocation = {3, 0, 0, 0, 0, 0, 1, 0}, paramIndex = 0),
 157         @TADescription(annotation = "TC", type = METHOD_FORMAL_PARAMETER,
 158                 genericLocation = {3, 0, 0, 0, 0, 0, 1, 0, 3, 0}, paramIndex = 0),
 159         @TADescription(annotation = "TD", type = METHOD_FORMAL_PARAMETER,
 160                 genericLocation = {3, 0, 0, 0, 0, 0, 1, 0, 3, 0, 3, 0, 0, 0, 0, 0}, paramIndex = 0),
 161         @TADescription(annotation = "TE", type = METHOD_FORMAL_PARAMETER,
 162                 genericLocation = {3, 0, 0, 0, 0, 0, 1, 0, 3, 0, 3, 0}, paramIndex = 0),
 163         @TADescription(annotation = "TF", type = METHOD_FORMAL_PARAMETER,
 164                 genericLocation = {3, 0, 0, 0, 0, 0, 1, 0, 3, 0, 3, 0, 0, 0}, paramIndex = 0),
 165         @TADescription(annotation = "TG", type = METHOD_FORMAL_PARAMETER,
 166                 genericLocation = {3, 0, 0, 0, 0, 0, 1, 0, 1, 0}, paramIndex = 0),
 167         @TADescription(annotation = "TH", type = METHOD_FORMAL_PARAMETER,
 168                 genericLocation = {3, 0, 0, 0, 0, 0, 1, 0, 1, 0, 3, 0}, paramIndex = 0),
 169         @TADescription(annotation = "TI", type = METHOD_FORMAL_PARAMETER,
 170                 genericLocation = {3, 0, 0, 0, 0, 0, 1, 0, 1, 0, 3, 1}, paramIndex = 0),
 171         @TADescription(annotation = "TJ", type = METHOD_FORMAL_PARAMETER,
 172                 genericLocation = {3, 0}, paramIndex = 0),
 173         @TADescription(annotation = "TK", type = METHOD_FORMAL_PARAMETER,
 174                 genericLocation = {3, 0, 0, 0}, paramIndex = 0)
 175     })
 176     public String testParam4() {
 177         return "class Outer {\n" +
 178                 " class GInner<X> {\n" +
 179                 "  class GInner2<Y, Z> {}\n" +
 180                 "}}\n\n" +
 181                 "class Test {\n" +
 182                 " void test(List<@TA Outer . @TB GInner<@TC List<@TD Object @TE[] @TF[]>>. @TG GInner2<@TH Integer, @TI Object> @TJ[] @TK[]> a) { }\n" +
 183                 "}";
 184     }
 185 
 186 
 187     // Local variables
 188 
 189     @TADescriptions({
 190         @TADescription(annotation = "TA", type = LOCAL_VARIABLE,
 191                 genericLocation = {},
 192                 lvarOffset = {2}, lvarLength = {1}, lvarIndex = {1}),
 193         @TADescription(annotation = "TB", type = LOCAL_VARIABLE,
 194                 genericLocation = {1, 0},
 195                 lvarOffset = {2}, lvarLength = {1}, lvarIndex = {1})
 196     })
 197     public String testLocal1a() {
 198         return "void test() { @TA Outer.@TB Inner a = null; }";
 199     }
 200 
 201     @TADescription(annotation = "TA", type = LOCAL_VARIABLE,
 202             genericLocation = {},
 203             lvarOffset = {2}, lvarLength = {1}, lvarIndex = {1})
 204     public String testLocal1b() {
 205         return "void test() { @TA Outer.Inner a = null; }";
 206     }
 207 
 208     @TADescription(annotation = "TB", type = LOCAL_VARIABLE,
 209             genericLocation = {1, 0},
 210             lvarOffset = {2}, lvarLength = {1}, lvarIndex = {1})
 211     public String testLocal1c() {
 212         return "void test() { Outer.@TB Inner a = null; }";
 213     }
 214 
 215     @TADescriptions({
 216         @TADescription(annotation = "TA", type = LOCAL_VARIABLE,
 217                 genericLocation = {},
 218                 lvarOffset = {2}, lvarLength = {1}, lvarIndex = {1}),
 219         @TADescription(annotation = "TB", type = LOCAL_VARIABLE,
 220                 genericLocation = {1, 0},
 221                 lvarOffset = {2}, lvarLength = {1}, lvarIndex = {1})
 222     })
 223     public String testLocal2() {
 224         return "void test() { @TA GOuter<String,String>.@TB GInner<String,String> a = null; }";
 225     }
 226 
 227     @TADescriptions({
 228         @TADescription(annotation = "TA", type = LOCAL_VARIABLE,
 229                 genericLocation = {0, 0, 0, 0},
 230                 lvarOffset = {5}, lvarLength = {1}, lvarIndex = {1}),
 231         @TADescription(annotation = "TB", type = LOCAL_VARIABLE,
 232                 genericLocation = {0, 0, 0, 0, 1, 0},
 233                 lvarOffset = {5}, lvarLength = {1}, lvarIndex = {1}),
 234         @TADescription(annotation = "TC", type = LOCAL_VARIABLE,
 235                 genericLocation = {0, 0, 0, 0, 1, 0, 3, 0},
 236                 lvarOffset = {5}, lvarLength = {1}, lvarIndex = {1}),
 237         @TADescription(annotation = "TD", type = LOCAL_VARIABLE,
 238                 genericLocation = {0, 0, 0, 0, 1, 0, 3, 0, 3, 0, 0, 0, 0, 0},
 239                 lvarOffset = {5}, lvarLength = {1}, lvarIndex = {1}),
 240         @TADescription(annotation = "TE", type = LOCAL_VARIABLE,
 241                 genericLocation = {0, 0, 0, 0, 1, 0, 3, 0, 3, 0},
 242                 lvarOffset = {5}, lvarLength = {1}, lvarIndex = {1}),
 243         @TADescription(annotation = "TF", type = LOCAL_VARIABLE,
 244                 genericLocation = {0, 0, 0, 0, 1, 0, 3, 0, 3, 0, 0, 0},
 245                 lvarOffset = {5}, lvarLength = {1}, lvarIndex = {1}),
 246         @TADescription(annotation = "TG", type = LOCAL_VARIABLE,
 247                 genericLocation = {0, 0, 0, 0, 1, 0, 1, 0},
 248                 lvarOffset = {5}, lvarLength = {1}, lvarIndex = {1}),
 249         @TADescription(annotation = "TH", type = LOCAL_VARIABLE,
 250                 genericLocation = {0, 0, 0, 0, 1, 0, 1, 0, 3, 0},
 251                 lvarOffset = {5}, lvarLength = {1}, lvarIndex = {1}),
 252         @TADescription(annotation = "TI", type = LOCAL_VARIABLE,
 253                 genericLocation = {0, 0, 0, 0, 1, 0, 1, 0, 3, 1},
 254                 lvarOffset = {5}, lvarLength = {1}, lvarIndex = {1}),
 255         @TADescription(annotation = "TJ", type = LOCAL_VARIABLE,
 256                 genericLocation = {},
 257                 lvarOffset = {5}, lvarLength = {1}, lvarIndex = {1}),
 258         @TADescription(annotation = "TK", type = LOCAL_VARIABLE,
 259                 genericLocation = {0, 0},
 260                 lvarOffset = {5}, lvarLength = {1}, lvarIndex = {1})
 261     })
 262     public String testLocal3() {
 263         return "class Outer {\n" +
 264                 " class GInner<X> {\n" +
 265                 "  class GInner2<Y, Z> {}\n" +
 266                 "}}\n\n" +
 267                 "class Test {\n" +
 268                 " void test() { @TA Outer . @TB GInner<@TC List<@TD Object @TE[] @TF[]>>. @TG GInner2<@TH Integer, @TI Object> @TJ[] @TK[] a = null; }\n" +
 269                 "}";
 270     }
 271 
 272     @TADescriptions({
 273         @TADescription(annotation = "TA", type = LOCAL_VARIABLE,
 274                 genericLocation = {3, 0, 0, 0, 0, 0},
 275                 lvarOffset = {2}, lvarLength = {1}, lvarIndex = {1}),
 276         @TADescription(annotation = "TB", type = LOCAL_VARIABLE,
 277                 genericLocation = {3, 0, 0, 0, 0, 0, 1, 0},
 278                 lvarOffset = {2}, lvarLength = {1}, lvarIndex = {1}),
 279         @TADescription(annotation = "TC", type = LOCAL_VARIABLE,
 280                 genericLocation = {3, 0, 0, 0, 0, 0, 1, 0, 3, 0},
 281                 lvarOffset = {2}, lvarLength = {1}, lvarIndex = {1}),
 282         @TADescription(annotation = "TD", type = LOCAL_VARIABLE,
 283                 genericLocation = {3, 0, 0, 0, 0, 0, 1, 0, 3, 0, 3, 0, 0, 0, 0, 0},
 284                 lvarOffset = {2}, lvarLength = {1}, lvarIndex = {1}),
 285         @TADescription(annotation = "TE", type = LOCAL_VARIABLE,
 286                 genericLocation = {3, 0, 0, 0, 0, 0, 1, 0, 3, 0, 3, 0},
 287                 lvarOffset = {2}, lvarLength = {1}, lvarIndex = {1}),
 288         @TADescription(annotation = "TF", type = LOCAL_VARIABLE,
 289                 genericLocation = {3, 0, 0, 0, 0, 0, 1, 0, 3, 0, 3, 0, 0, 0},
 290                 lvarOffset = {2}, lvarLength = {1}, lvarIndex = {1}),
 291         @TADescription(annotation = "TG", type = LOCAL_VARIABLE,
 292                 genericLocation = {3, 0, 0, 0, 0, 0, 1, 0, 1, 0},
 293                 lvarOffset = {2}, lvarLength = {1}, lvarIndex = {1}),
 294         @TADescription(annotation = "TH", type = LOCAL_VARIABLE,
 295                 genericLocation = {3, 0, 0, 0, 0, 0, 1, 0, 1, 0, 3, 0},
 296                 lvarOffset = {2}, lvarLength = {1}, lvarIndex = {1}),
 297         @TADescription(annotation = "TI", type = LOCAL_VARIABLE,
 298                 genericLocation = {3, 0, 0, 0, 0, 0, 1, 0, 1, 0, 3, 1},
 299                 lvarOffset = {2}, lvarLength = {1}, lvarIndex = {1}),
 300         @TADescription(annotation = "TJ", type = LOCAL_VARIABLE,
 301                 genericLocation = {3, 0},
 302                 lvarOffset = {2}, lvarLength = {1}, lvarIndex = {1}),
 303         @TADescription(annotation = "TK", type = LOCAL_VARIABLE,
 304                 genericLocation = {3, 0, 0, 0},
 305                 lvarOffset = {2}, lvarLength = {1}, lvarIndex = {1})
 306     })
 307     public String testLocal4() {
 308         return "class Outer {\n" +
 309                 " class GInner<X> {\n" +
 310                 "  class GInner2<Y, Z> {}\n" +
 311                 "}}\n\n" +
 312                 "class Test {\n" +
 313                 " void test() { List<@TA Outer . @TB GInner<@TC List<@TD Object @TE[] @TF[]>>. @TG GInner2<@TH Integer, @TI Object> @TJ[] @TK[]> a = null; }\n" +
 314                 "}";
 315     }
 316 
 317 
 318     // fields
 319 
 320     @TADescriptions({
 321         @TADescription(annotation = "TA", type = FIELD,
 322                 genericLocation = {}),
 323         @TADescription(annotation = "TB", type = FIELD,
 324                 genericLocation = {1, 0})
 325     })
 326     public String testField1a() {
 327         return "@TA Outer.@TB Inner a;";
 328     }
 329 
 330     @TADescription(annotation = "TA", type = FIELD,
 331             genericLocation = {})
 332     public String testField1b() {
 333         return "@TA Outer.Inner a;";
 334     }
 335 
 336     @TADescription(annotation = "TB", type = FIELD,
 337             genericLocation = {1, 0})
 338     public String testField1c() {
 339         return "Outer.@TB Inner a;";
 340     }
 341 
 342     @TADescriptions({
 343         @TADescription(annotation = "TA", type = FIELD,
 344                 genericLocation = {}),
 345         @TADescription(annotation = "TB", type = FIELD,
 346                 genericLocation = {1, 0})
 347     })
 348     public String testField2() {
 349         return "@TA GOuter<String,String>.@TB GInner<String,String> a;";
 350     }
 351 
 352     @TADescriptions({
 353         @TADescription(annotation = "TA", type = FIELD,
 354                 genericLocation = {0, 0, 0, 0}),
 355         @TADescription(annotation = "TB", type = FIELD,
 356                 genericLocation = {0, 0, 0, 0, 1, 0}),
 357         @TADescription(annotation = "TC", type = FIELD,
 358                 genericLocation = {0, 0, 0, 0, 1, 0, 3, 0}),
 359         @TADescription(annotation = "TD", type = FIELD,
 360                 genericLocation = {0, 0, 0, 0, 1, 0, 3, 0, 3, 0, 0, 0, 0, 0}),
 361         @TADescription(annotation = "TE", type = FIELD,
 362                 genericLocation = {0, 0, 0, 0, 1, 0, 3, 0, 3, 0}),
 363         @TADescription(annotation = "TF", type = FIELD,
 364                 genericLocation = {0, 0, 0, 0, 1, 0, 3, 0, 3, 0, 0, 0}),
 365         @TADescription(annotation = "TG", type = FIELD,
 366                 genericLocation = {0, 0, 0, 0, 1, 0, 1, 0}),
 367         @TADescription(annotation = "TH", type = FIELD,
 368                 genericLocation = {0, 0, 0, 0, 1, 0, 1, 0, 3, 0}),
 369         @TADescription(annotation = "TI", type = FIELD,
 370                 genericLocation = {0, 0, 0, 0, 1, 0, 1, 0, 3, 1}),
 371         @TADescription(annotation = "TJ", type = FIELD),
 372         @TADescription(annotation = "TK", type = FIELD,
 373                 genericLocation = {0, 0})
 374     })
 375     public String testField3() {
 376         return "class Outer {\n" +
 377                 " class GInner<X> {\n" +
 378                 "  class GInner2<Y, Z> {}\n" +
 379                 "}}\n\n" +
 380                 "class Test {\n" +
 381                 " @TA Outer . @TB GInner<@TC List<@TD Object @TE[] @TF[]>>. @TG GInner2<@TH Integer, @TI Object> @TJ[] @TK[] a;\n" +
 382                 "}";
 383     }
 384 
 385     @TADescriptions({
 386         @TADescription(annotation = "TA", type = FIELD,
 387                 genericLocation = {3, 0, 0, 0, 0, 0}),
 388         @TADescription(annotation = "TB", type = FIELD,
 389                 genericLocation = {3, 0, 0, 0, 0, 0, 1, 0}),
 390         @TADescription(annotation = "TC", type = FIELD,
 391                 genericLocation = {3, 0, 0, 0, 0, 0, 1, 0, 3, 0}),
 392         @TADescription(annotation = "TD", type = FIELD,
 393                 genericLocation = {3, 0, 0, 0, 0, 0, 1, 0, 3, 0, 3, 0, 0, 0, 0, 0}),
 394         @TADescription(annotation = "TE", type = FIELD,
 395                 genericLocation = {3, 0, 0, 0, 0, 0, 1, 0, 3, 0, 3, 0}),
 396         @TADescription(annotation = "TF", type = FIELD,
 397                 genericLocation = {3, 0, 0, 0, 0, 0, 1, 0, 3, 0, 3, 0, 0, 0}),
 398         @TADescription(annotation = "TG", type = FIELD,
 399                 genericLocation = {3, 0, 0, 0, 0, 0, 1, 0, 1, 0}),
 400         @TADescription(annotation = "TH", type = FIELD,
 401                 genericLocation = {3, 0, 0, 0, 0, 0, 1, 0, 1, 0, 3, 0}),
 402         @TADescription(annotation = "TI", type = FIELD,
 403                 genericLocation = {3, 0, 0, 0, 0, 0, 1, 0, 1, 0, 3, 1}),
 404         @TADescription(annotation = "TJ", type = FIELD,
 405                 genericLocation = {3, 0}),
 406         @TADescription(annotation = "TK", type = FIELD,
 407                 genericLocation = {3, 0, 0, 0})
 408     })
 409     public String testField4() {
 410         return "class Outer {\n" +
 411                 " class GInner<X> {\n" +
 412                 "  class GInner2<Y, Z> {}\n" +
 413                 "}}\n\n" +
 414                 "class Test {\n" +
 415                 " List<@TA Outer . @TB GInner<@TC List<@TD Object @TE[] @TF[]>>. @TG GInner2<@TH Integer, @TI Object> @TJ[] @TK[]> a;\n" +
 416                 "}";
 417     }
 418 
 419 
 420     // return types
 421 
 422     @TADescriptions({
 423         @TADescription(annotation = "TA", type = METHOD_RETURN,
 424                 genericLocation = {}),
 425         @TADescription(annotation = "TB", type = METHOD_RETURN,
 426                 genericLocation = {1, 0})
 427     })
 428     public String testReturn1() {
 429         return "@TA Outer.@TB Inner test() { return null; }";
 430     }
 431 
 432     @TADescriptions({
 433         @TADescription(annotation = "TA", type = METHOD_RETURN,
 434                 genericLocation = {}),
 435         @TADescription(annotation = "TB", type = METHOD_RETURN,
 436                 genericLocation = {1, 0})
 437     })
 438     public String testReturn2() {
 439         return "@TA GOuter<String,String>.@TB GInner<String,String> test() { return null; }";
 440     }
 441 
 442     @TADescriptions({
 443         @TADescription(annotation = "TA", type = METHOD_RETURN,
 444                 genericLocation = {0, 0, 0, 0}),
 445         @TADescription(annotation = "TB", type = METHOD_RETURN,
 446                 genericLocation = {0, 0, 0, 0, 1, 0}),
 447         @TADescription(annotation = "TC", type = METHOD_RETURN,
 448                 genericLocation = {0, 0, 0, 0, 1, 0, 3, 0}),
 449         @TADescription(annotation = "TD", type = METHOD_RETURN,
 450                 genericLocation = {0, 0, 0, 0, 1, 0, 3, 0, 3, 0, 0, 0, 0, 0}),
 451         @TADescription(annotation = "TE", type = METHOD_RETURN,
 452                 genericLocation = {0, 0, 0, 0, 1, 0, 3, 0, 3, 0}),
 453         @TADescription(annotation = "TF", type = METHOD_RETURN,
 454                 genericLocation = {0, 0, 0, 0, 1, 0, 3, 0, 3, 0, 0, 0}),
 455         @TADescription(annotation = "TG", type = METHOD_RETURN,
 456                 genericLocation = {0, 0, 0, 0, 1, 0, 1, 0}),
 457         @TADescription(annotation = "TH", type = METHOD_RETURN,
 458                 genericLocation = {0, 0, 0, 0, 1, 0, 1, 0, 3, 0}),
 459         @TADescription(annotation = "TI", type = METHOD_RETURN,
 460                 genericLocation = {0, 0, 0, 0, 1, 0, 1, 0, 3, 1}),
 461         @TADescription(annotation = "TJ", type = METHOD_RETURN),
 462         @TADescription(annotation = "TK", type = METHOD_RETURN,
 463                 genericLocation = {0, 0})
 464     })
 465     public String testReturn3() {
 466         return "class Outer {\n" +
 467                 " class GInner<X> {\n" +
 468                 "  class GInner2<Y, Z> {}\n" +
 469                 "}}\n\n" +
 470                 "class Test {\n" +
 471                 " @TA Outer . @TB GInner<@TC List<@TD Object @TE[] @TF[]>>. @TG GInner2<@TH Integer, @TI Object> @TJ[] @TK[] test() { return null; }\n" +
 472                 "}";
 473     }
 474 
 475     @TADescriptions({
 476         @TADescription(annotation = "TA", type = METHOD_RETURN,
 477                 genericLocation = {3, 0, 0, 0, 0, 0}),
 478         @TADescription(annotation = "TB", type = METHOD_RETURN,
 479                 genericLocation = {3, 0, 0, 0, 0, 0, 1, 0}),
 480         @TADescription(annotation = "TC", type = METHOD_RETURN,
 481                 genericLocation = {3, 0, 0, 0, 0, 0, 1, 0, 3, 0}),
 482         @TADescription(annotation = "TD", type = METHOD_RETURN,
 483                 genericLocation = {3, 0, 0, 0, 0, 0, 1, 0, 3, 0, 3, 0, 0, 0, 0, 0}),
 484         @TADescription(annotation = "TE", type = METHOD_RETURN,
 485                 genericLocation = {3, 0, 0, 0, 0, 0, 1, 0, 3, 0, 3, 0}),
 486         @TADescription(annotation = "TF", type = METHOD_RETURN,
 487                 genericLocation = {3, 0, 0, 0, 0, 0, 1, 0, 3, 0, 3, 0, 0, 0}),
 488         @TADescription(annotation = "TG", type = METHOD_RETURN,
 489                 genericLocation = {3, 0, 0, 0, 0, 0, 1, 0, 1, 0}),
 490         @TADescription(annotation = "TH", type = METHOD_RETURN,
 491                 genericLocation = {3, 0, 0, 0, 0, 0, 1, 0, 1, 0, 3, 0}),
 492         @TADescription(annotation = "TI", type = METHOD_RETURN,
 493                 genericLocation = {3, 0, 0, 0, 0, 0, 1, 0, 1, 0, 3, 1}),
 494         @TADescription(annotation = "TJ", type = METHOD_RETURN,
 495                 genericLocation = {3, 0}),
 496         @TADescription(annotation = "TK", type = METHOD_RETURN,
 497                 genericLocation = {3, 0, 0, 0})
 498     })
 499     public String testReturn4() {
 500         return "class Outer {\n" +
 501                 " class GInner<X> {\n" +
 502                 "  class GInner2<Y, Z> {}\n" +
 503                 "}}\n\n" +
 504                 "class Test {\n" +
 505                 " List<@TA Outer . @TB GInner<@TC List<@TD Object @TE[] @TF[]>>. @TG GInner2<@TH Integer, @TI Object> @TJ[] @TK[]> test() { return null; }\n" +
 506                 "}";
 507     }
 508 
 509     @TADescriptions({
 510         @TADescription(annotation = "TA", type = METHOD_RETURN,
 511                 genericLocation = {3, 0}),
 512         @TADescription(annotation = "TB", type = METHOD_RETURN,
 513                 genericLocation = {3, 0, 3, 0}),
 514         @TADescription(annotation = "TC", type = METHOD_RETURN,
 515                 genericLocation = {3, 0, 3, 1}),
 516         @TADescription(annotation = "TD", type = METHOD_RETURN,
 517                 genericLocation = {3, 0, 3, 1, 3, 0}),
 518         @TADescription(annotation = "TE", type = METHOD_RETURN,
 519                 genericLocation = {3, 0, 1, 0}),
 520         @TADescription(annotation = "TF", type = METHOD_RETURN,
 521                 genericLocation = {3, 0, 1, 0, 3, 0}),
 522         @TADescription(annotation = "TG", type = METHOD_RETURN,
 523                 genericLocation = {3, 0, 1, 0, 3, 0, 3, 0, 0, 0, 0, 0}),
 524         @TADescription(annotation = "TH", type = METHOD_RETURN,
 525                 genericLocation = {3, 0, 1, 0, 3, 0, 3, 0}),
 526         @TADescription(annotation = "TI", type = METHOD_RETURN,
 527                 genericLocation = {3, 0, 1, 0, 3, 0, 3, 0, 0, 0}),
 528         @TADescription(annotation = "TJ", type = METHOD_RETURN,
 529                 genericLocation = {3, 0, 1, 0, 1, 0}),
 530     })
 531     public String testReturn5() {
 532         return "class GOuter<A, B> {\n" +
 533                 " class GInner<X> {\n" +
 534                 "  class GInner2<Y, Z> {}\n" +
 535                 "}}\n\n" +
 536                 "class Test {\n" +
 537                 " List<@TA GOuter<@TB String, @TC List<@TD Object>> . @TE GInner<@TF List<@TG Object @TH[] @TI[]>>. @TJ GInner2<String, String>> test() { return null; }\n" +
 538                 "}";
 539     }
 540 
 541 
 542     // type parameters
 543 
 544     @TADescriptions({
 545         @TADescription(annotation = "TA", type = METHOD_TYPE_PARAMETER_BOUND,
 546                 genericLocation = {}, paramIndex = 0, boundIndex = 0),
 547         @TADescription(annotation = "TB", type = METHOD_TYPE_PARAMETER_BOUND,
 548                 genericLocation = {1, 0}, paramIndex = 0, boundIndex = 0)
 549     })
 550     public String testTypeparam1() {
 551         return "<X extends @TA Outer.@TB Inner> X test() { return null; }";
 552     }
 553 
 554     @TADescriptions({
 555         @TADescription(annotation = "TA", type = METHOD_TYPE_PARAMETER_BOUND,
 556                 genericLocation = {}, paramIndex = 0, boundIndex = 0),
 557         @TADescription(annotation = "TB", type = METHOD_TYPE_PARAMETER_BOUND,
 558                 genericLocation = {1, 0}, paramIndex = 0, boundIndex = 0)
 559     })
 560     public String testTypeparam2() {
 561         return "<X extends @TA GOuter<String,String>.@TB GInner<String,String>> X test() { return null; }";
 562     }
 563 
 564     @TADescriptions({
 565         @TADescription(annotation = "TA", type = METHOD_TYPE_PARAMETER_BOUND,
 566                 genericLocation = {},
 567                 paramIndex = 0, boundIndex = 0),
 568         @TADescription(annotation = "TB", type = METHOD_TYPE_PARAMETER_BOUND,
 569                 genericLocation = {1, 0},
 570                 paramIndex = 0, boundIndex = 0),
 571         @TADescription(annotation = "TC", type = METHOD_TYPE_PARAMETER_BOUND,
 572                 genericLocation = {1, 0, 3, 0},
 573                 paramIndex = 0, boundIndex = 0),
 574         @TADescription(annotation = "TD", type = METHOD_TYPE_PARAMETER_BOUND,
 575                 genericLocation = {1, 0, 3, 0, 3, 0, 0, 0, 0, 0},
 576                 paramIndex = 0, boundIndex = 0),
 577         @TADescription(annotation = "TE", type = METHOD_TYPE_PARAMETER_BOUND,
 578                 genericLocation = {1, 0, 3, 0, 3, 0},
 579                 paramIndex = 0, boundIndex = 0),
 580         @TADescription(annotation = "TF", type = METHOD_TYPE_PARAMETER_BOUND,
 581                 genericLocation = {1, 0, 3, 0, 3, 0, 0, 0},
 582                 paramIndex = 0, boundIndex = 0),
 583         @TADescription(annotation = "TG", type = METHOD_TYPE_PARAMETER_BOUND,
 584                 genericLocation = {1, 0, 1, 0},
 585                 paramIndex = 0, boundIndex = 0),
 586         @TADescription(annotation = "TH", type = METHOD_TYPE_PARAMETER_BOUND,
 587                 genericLocation = {1, 0, 1, 0, 3, 0},
 588                 paramIndex = 0, boundIndex = 0),
 589         @TADescription(annotation = "TI", type = METHOD_TYPE_PARAMETER_BOUND,
 590                 genericLocation = {1, 0, 1, 0, 3, 1},
 591                 paramIndex = 0, boundIndex = 0),
 592     })
 593     public String testTypeparam3() {
 594         return "class Outer {\n" +
 595                 " class GInner<X> {\n" +
 596                 "  class GInner2<Y, Z> {}\n" +
 597                 "}}\n\n" +
 598                 "class Test {\n" +
 599                 " <X extends @TA Outer . @TB GInner<@TC List<@TD Object @TE[] @TF[]>>. @TG GInner2<@TH Integer, @TI Object>> X test() { return null; }\n" +
 600                 "}";
 601     }
 602 
 603     @TADescriptions({
 604         @TADescription(annotation = "TA", type = METHOD_TYPE_PARAMETER_BOUND,
 605                 genericLocation = {3, 0, 0, 0, 0, 0},
 606                 paramIndex = 0, boundIndex = 1),
 607         @TADescription(annotation = "TB", type = METHOD_TYPE_PARAMETER_BOUND,
 608                 genericLocation = {3, 0, 0, 0, 0, 0, 1, 0},
 609                 paramIndex = 0, boundIndex = 1),
 610         @TADescription(annotation = "TC", type = METHOD_TYPE_PARAMETER_BOUND,
 611                 genericLocation = {3, 0, 0, 0, 0, 0, 1, 0, 3, 0},
 612                 paramIndex = 0, boundIndex = 1),
 613         @TADescription(annotation = "TD", type = METHOD_TYPE_PARAMETER_BOUND,
 614                 genericLocation = {3, 0, 0, 0, 0, 0, 1, 0, 3, 0, 3, 0, 0, 0, 0, 0},
 615                 paramIndex = 0, boundIndex = 1),
 616         @TADescription(annotation = "TE", type = METHOD_TYPE_PARAMETER_BOUND,
 617                 genericLocation = {3, 0, 0, 0, 0, 0, 1, 0, 3, 0, 3, 0},
 618                 paramIndex = 0, boundIndex = 1),
 619         @TADescription(annotation = "TF", type = METHOD_TYPE_PARAMETER_BOUND,
 620                 genericLocation = {3, 0, 0, 0, 0, 0, 1, 0, 3, 0, 3, 0, 0, 0},
 621                 paramIndex = 0, boundIndex = 1),
 622         @TADescription(annotation = "TG", type = METHOD_TYPE_PARAMETER_BOUND,
 623                 genericLocation = {3, 0, 0, 0, 0, 0, 1, 0, 1, 0},
 624                 paramIndex = 0, boundIndex = 1),
 625         @TADescription(annotation = "TH", type = METHOD_TYPE_PARAMETER_BOUND,
 626                 genericLocation = {3, 0, 0, 0, 0, 0, 1, 0, 1, 0, 3, 0},
 627                 paramIndex = 0, boundIndex = 1),
 628         @TADescription(annotation = "TI", type = METHOD_TYPE_PARAMETER_BOUND,
 629                 genericLocation = {3, 0, 0, 0, 0, 0, 1, 0, 1, 0, 3, 1},
 630                 paramIndex = 0, boundIndex = 1),
 631         @TADescription(annotation = "TJ", type = METHOD_TYPE_PARAMETER_BOUND,
 632                 genericLocation = {3, 0},
 633                 paramIndex = 0, boundIndex = 1),
 634         @TADescription(annotation = "TK", type = METHOD_TYPE_PARAMETER_BOUND,
 635                 genericLocation = {3, 0, 0, 0},
 636                 paramIndex = 0, boundIndex = 1)
 637     })
 638     public String testTypeparam4() {
 639         return "class Outer {\n" +
 640                 " class GInner<X> {\n" +
 641                 "  class GInner2<Y, Z> {}\n" +
 642                 "}}\n\n" +
 643                 "class Test {\n" +
 644                 " <X extends List<@TA Outer . @TB GInner<@TC List<@TD Object @TE[] @TF[]>>. @TG GInner2<@TH Integer, @TI Object> @TJ[] @TK[]>> X test() { return null; }\n" +
 645                 "}";
 646     }
 647 
 648     @TADescriptions({
 649         @TADescription(annotation = "TA", type = METHOD_TYPE_PARAMETER_BOUND,
 650                 genericLocation = {3, 0}, paramIndex = 0, boundIndex = 1),
 651         @TADescription(annotation = "TB", type = METHOD_TYPE_PARAMETER_BOUND,
 652                 genericLocation = {3, 0, 3, 0}, paramIndex = 0, boundIndex = 1),
 653         @TADescription(annotation = "TC", type = METHOD_TYPE_PARAMETER_BOUND,
 654                 genericLocation = {3, 0, 3, 1}, paramIndex = 0, boundIndex = 1),
 655         @TADescription(annotation = "TD", type = METHOD_TYPE_PARAMETER_BOUND,
 656                 genericLocation = {3, 0, 3, 1, 3, 0}, paramIndex = 0, boundIndex = 1),
 657         @TADescription(annotation = "TE", type = METHOD_TYPE_PARAMETER_BOUND,
 658                 genericLocation = {3, 0, 1, 0}, paramIndex = 0, boundIndex = 1),
 659         @TADescription(annotation = "TF", type = METHOD_TYPE_PARAMETER_BOUND,
 660                 genericLocation = {3, 0, 1, 0, 3, 0}, paramIndex = 0, boundIndex = 1),
 661         @TADescription(annotation = "TG", type = METHOD_TYPE_PARAMETER_BOUND,
 662                 genericLocation = {3, 0, 1, 0, 3, 0, 3, 0, 0, 0, 0, 0}, paramIndex = 0, boundIndex = 1),
 663         @TADescription(annotation = "TH", type = METHOD_TYPE_PARAMETER_BOUND,
 664                 genericLocation = {3, 0, 1, 0, 3, 0, 3, 0}, paramIndex = 0, boundIndex = 1),
 665         @TADescription(annotation = "TI", type = METHOD_TYPE_PARAMETER_BOUND,
 666                 genericLocation = {3, 0, 1, 0, 3, 0, 3, 0, 0, 0}, paramIndex = 0, boundIndex = 1),
 667         @TADescription(annotation = "TJ", type = METHOD_TYPE_PARAMETER_BOUND,
 668                 genericLocation = {3, 0, 1, 0, 1, 0}, paramIndex = 0, boundIndex = 1),
 669     })
 670     public String testTypeparam5() {
 671         return "class GOuter<A, B> {\n" +
 672                 " class GInner<X> {\n" +
 673                 "  class GInner2<Y, Z> {}\n" +
 674                 "}}\n\n" +
 675                 "class Test {\n" +
 676                 " <X extends List<@TA GOuter<@TB String, @TC List<@TD Object>> . @TE GInner<@TF List<@TG Object @TH[] @TI[]>>. @TJ GInner2<String, String>>> X test() { return null; }\n" +
 677                 "}";
 678     }
 679 
 680     @TADescription(annotation = "TA", type = FIELD,
 681             genericLocation = {3, 0, 1, 0})
 682     public String testUses1a() {
 683         return "class Test { class Inner {}    List<@TA Inner> f; }";
 684     }
 685 
 686     @TADescription(annotation = "TA", type = FIELD,
 687             genericLocation = {3, 0})
 688     public String testUses1b() {
 689         return "class Test { class Inner {}    List<@TA Test.Inner> f; }";
 690     }
 691 
 692     @TADescription(annotation = "TA", type = FIELD,
 693             genericLocation = {3, 0, 1, 0, 1, 0})
 694     @TestClass("Test$Inner")
 695     public String testUses2a() {
 696         return "class Test { class Inner { class Inner2{}    List<@TA Inner2> f; }}";
 697     }
 698 
 699     @TADescription(annotation = "TA", type = FIELD,
 700             genericLocation = {3, 0, 1, 0})
 701     @TestClass("Test$Inner")
 702     public String testUses2b() {
 703         return "class Test { class Inner { class Inner2{}    List<@TA Inner.Inner2> f; }}";
 704     }
 705 
 706     @TADescription(annotation = "TA", type = FIELD,
 707             genericLocation = {3, 0, 1, 0, 1, 0})
 708     @TestClass("Test$Inner")
 709     public String testUses2c() {
 710         return "class Test { class Inner { class Inner2{}    List<Inner.@TA Inner2> f; }}";
 711     }
 712 
 713     @TADescription(annotation = "TA", type = FIELD,
 714             genericLocation = {3, 0})
 715     @TestClass("Test$Inner")
 716     public String testUses2d() {
 717         return "class Test{ class Inner { class Inner2{}    List<@TA Test.Inner.Inner2> f; }}";
 718     }
 719 
 720     @TADescription(annotation = "TA", type = FIELD,
 721             genericLocation = {3, 0, 1, 0})
 722     @TestClass("Test$Inner")
 723     public String testUses2e() {
 724         return "class Test { class Inner { class Inner2{}    List<Test.@TA Inner.Inner2> f; }}";
 725     }
 726 
 727     @TADescription(annotation = "TA", type = FIELD,
 728             genericLocation = {3, 0, 1, 0, 1, 0})
 729     @TestClass("Test$Inner")
 730     public String testUses2f() {
 731         return "class Test { class Inner { class Inner2{}    List<Test.Inner.@TA Inner2> f; }}";
 732     }
 733 
 734     @TADescription(annotation = "TA", type = FIELD,
 735             genericLocation = {3, 0, 1, 0, 1, 0})
 736     @TestClass("Test$Inner")
 737     public String testUses3a() {
 738         return "class Test { class Inner<A, B> { class Inner2<C, D>{}\n" +
 739                 "    List<Test.Inner.@TA Inner2> f; }}";
 740     }
 741 
 742     @TADescription(annotation = "TA", type = FIELD,
 743             genericLocation = {3, 0, 1, 0})
 744     @TestClass("Test$Inner")
 745     public String testUses3b() {
 746         return "class Test { class Inner<A, B> { class Inner2<C, D>{}\n" +
 747                 "    List<Test.@TA Inner.Inner2> f; }}";
 748     }
 749 
 750     @TADescriptions({
 751         @TADescription(annotation = "TA", type = FIELD,
 752                 genericLocation = {}),
 753         @TADescription(annotation = "TB", type = FIELD,
 754                 genericLocation = {3, 0})
 755     })
 756     public String testUses4() {
 757         return "class Test { static class TInner {}\n" +
 758                 "    @TA TInner f; \n" +
 759                 "    List<@TB TInner> g; }";
 760     }
 761 
 762     @TADescription(annotation = "TA", type = FIELD,
 763             genericLocation = {3, 0, 1, 0, 3, 1})
 764     @TestClass("Test$Inner")
 765     public String testUses3c() {
 766         return "class Test { class Inner<A, B> { class Inner2<C, D>{}\n" +
 767                 "    List<Test.Inner<String, @TA Object>.Inner2<Test, Test>> f; }}";
 768     }
 769 
 770     @TADescription(annotation = "TA", type = METHOD_FORMAL_PARAMETER, paramIndex=0)
 771     public String testFullyQualified1() {
 772         return "void testme(java.security.@TA ProtectionDomain protectionDomain) {}";
 773     }
 774 
 775     @TADescription(annotation = "TA", type = METHOD_FORMAL_PARAMETER, paramIndex=0,
 776             genericLocation = {3, 0})
 777     public String testFullyQualified2() {
 778         return "void testme(List<java.security.@TA ProtectionDomain> protectionDomain) {}";
 779     }
 780 
 781     @TADescriptions({
 782         @TADescription(annotation = "TA", type = LOCAL_VARIABLE,
 783                 genericLocation = {},
 784                 lvarOffset = ReferenceInfoUtil.IGNORE_VALUE,
 785                 lvarLength = ReferenceInfoUtil.IGNORE_VALUE,
 786                 lvarIndex = ReferenceInfoUtil.IGNORE_VALUE),
 787         @TADescription(annotation = "TB", type = LOCAL_VARIABLE,
 788                 genericLocation = {1, 0},
 789                 lvarOffset = ReferenceInfoUtil.IGNORE_VALUE,
 790                 lvarLength = ReferenceInfoUtil.IGNORE_VALUE,
 791                 lvarIndex = ReferenceInfoUtil.IGNORE_VALUE),
 792         @TADescription(annotation = "TC", type = LOCAL_VARIABLE,
 793                 // Only classes count, not methods.
 794                 genericLocation = {1, 0, 1, 0},
 795                 lvarOffset = ReferenceInfoUtil.IGNORE_VALUE,
 796                 lvarLength = ReferenceInfoUtil.IGNORE_VALUE,
 797                 lvarIndex = ReferenceInfoUtil.IGNORE_VALUE),
 798     })
 799     @TestClass("Outer$Inner")
 800     public String testMethodNesting1() {
 801         return "class Outer {\n" +
 802                 " class Inner {\n" +
 803                 "  void foo() {\n" +
 804                 "    class MInner {}\n" +
 805                 "    @TA Outer . @TB Inner l1 = null;\n" +
 806                 "    @TC MInner l2 = null;\n" +
 807                 "  }\n" +
 808                 "}}\n";
 809     }
 810 
 811     @TADescriptions({
 812         @TADescription(annotation = "TA", type = NEW,
 813                 genericLocation = {},
 814                 offset = 0),
 815         @TADescription(annotation = "TB", type = NEW,
 816                 genericLocation = {1, 0},
 817                 offset = 0),
 818         @TADescription(annotation = "TC", type = NEW,
 819                 // Only classes count, not methods.
 820                 genericLocation = {1, 0, 1, 0},
 821                 offset = 12),
 822     })
 823     @TestClass("Outer$Inner")
 824     public String testMethodNesting2() {
 825         return "class Outer {\n" +
 826                 " class Inner {\n" +
 827                 "  void foo() {\n" +
 828                 "    class MInner {}\n" +
 829                 "    Object o1 = new @TA Outer . @TB Inner();" +
 830                 "    Object o2 = new @TC MInner();\n" +
 831                 "  }\n" +
 832                 "}}\n";
 833     }
 834 }