1 /*
   2  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   3  *
   4  * This code is free software; you can redistribute it and/or modify it
   5  * under the terms of the GNU General Public License version 2 only, as
   6  * published by the Free Software Foundation.  Oracle designates this
   7  * particular file as subject to the "Classpath" exception as provided
   8  * by Oracle in the LICENSE file that accompanied this code.
   9  *
  10  * This code is distributed in the hope that it will be useful, but WITHOUT
  11  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  12  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  13  * version 2 for more details (a copy is included in the LICENSE file that
  14  * accompanied this code).
  15  *
  16  * You should have received a copy of the GNU General Public License version
  17  * 2 along with this work; if not, write to the Free Software Foundation,
  18  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  19  *
  20  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  21  * or visit www.oracle.com if you need additional information or have any
  22  * questions.
  23  */
  24 
  25 /*
  26  * This file is available under and governed by the GNU General Public
  27  * License version 2 only, as published by the Free Software Foundation.
  28  * However, the following notice accompanied the original version of this
  29  * file:
  30  *
  31  * ASM: a very small and fast Java bytecode manipulation framework
  32  * Copyright (c) 2000-2013 INRIA, France Telecom
  33  * All rights reserved.
  34  *
  35  * Redistribution and use in source and binary forms, with or without
  36  * modification, are permitted provided that the following conditions
  37  * are met:
  38  * 1. Redistributions of source code must retain the above copyright
  39  *    notice, this list of conditions and the following disclaimer.
  40  * 2. Redistributions in binary form must reproduce the above copyright
  41  *    notice, this list of conditions and the following disclaimer in the
  42  *    documentation and/or other materials provided with the distribution.
  43  * 3. Neither the name of the copyright holders nor the names of its
  44  *    contributors may be used to endorse or promote products derived from
  45  *    this software without specific prior written permission.
  46  *
  47  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  48  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  49  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  50  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
  51  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  52  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  53  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  54  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  55  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  56  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
  57  * THE POSSIBILITY OF SUCH DAMAGE.
  58  */
  59 
  60 package jdk.internal.org.objectweb.asm;
  61 
  62 /**
  63  * A reference to a type appearing in a class, field or method declaration, or
  64  * on an instruction. Such a reference designates the part of the class where
  65  * the referenced type is appearing (e.g. an 'extends', 'implements' or 'throws'
  66  * clause, a 'new' instruction, a 'catch' clause, a type cast, a local variable
  67  * declaration, etc).
  68  *
  69  * @author Eric Bruneton
  70  */
  71 public class TypeReference {
  72 
  73     /**
  74      * The sort of type references that target a type parameter of a generic
  75      * class. See {@link #getSort getSort}.
  76      */
  77     public final static int CLASS_TYPE_PARAMETER = 0x00;
  78 
  79     /**
  80      * The sort of type references that target a type parameter of a generic
  81      * method. See {@link #getSort getSort}.
  82      */
  83     public final static int METHOD_TYPE_PARAMETER = 0x01;
  84 
  85     /**
  86      * The sort of type references that target the super class of a class or one
  87      * of the interfaces it implements. See {@link #getSort getSort}.
  88      */
  89     public final static int CLASS_EXTENDS = 0x10;
  90 
  91     /**
  92      * The sort of type references that target a bound of a type parameter of a
  93      * generic class. See {@link #getSort getSort}.
  94      */
  95     public final static int CLASS_TYPE_PARAMETER_BOUND = 0x11;
  96 
  97     /**
  98      * The sort of type references that target a bound of a type parameter of a
  99      * generic method. See {@link #getSort getSort}.
 100      */
 101     public final static int METHOD_TYPE_PARAMETER_BOUND = 0x12;
 102 
 103     /**
 104      * The sort of type references that target the type of a field. See
 105      * {@link #getSort getSort}.
 106      */
 107     public final static int FIELD = 0x13;
 108 
 109     /**
 110      * The sort of type references that target the return type of a method. See
 111      * {@link #getSort getSort}.
 112      */
 113     public final static int METHOD_RETURN = 0x14;
 114 
 115     /**
 116      * The sort of type references that target the receiver type of a method.
 117      * See {@link #getSort getSort}.
 118      */
 119     public final static int METHOD_RECEIVER = 0x15;
 120 
 121     /**
 122      * The sort of type references that target the type of a formal parameter of
 123      * a method. See {@link #getSort getSort}.
 124      */
 125     public final static int METHOD_FORMAL_PARAMETER = 0x16;
 126 
 127     /**
 128      * The sort of type references that target the type of an exception declared
 129      * in the throws clause of a method. See {@link #getSort getSort}.
 130      */
 131     public final static int THROWS = 0x17;
 132 
 133     /**
 134      * The sort of type references that target the type of a local variable in a
 135      * method. See {@link #getSort getSort}.
 136      */
 137     public final static int LOCAL_VARIABLE = 0x40;
 138 
 139     /**
 140      * The sort of type references that target the type of a resource variable
 141      * in a method. See {@link #getSort getSort}.
 142      */
 143     public final static int RESOURCE_VARIABLE = 0x41;
 144 
 145     /**
 146      * The sort of type references that target the type of the exception of a
 147      * 'catch' clause in a method. See {@link #getSort getSort}.
 148      */
 149     public final static int EXCEPTION_PARAMETER = 0x42;
 150 
 151     /**
 152      * The sort of type references that target the type declared in an
 153      * 'instanceof' instruction. See {@link #getSort getSort}.
 154      */
 155     public final static int INSTANCEOF = 0x43;
 156 
 157     /**
 158      * The sort of type references that target the type of the object created by
 159      * a 'new' instruction. See {@link #getSort getSort}.
 160      */
 161     public final static int NEW = 0x44;
 162 
 163     /**
 164      * The sort of type references that target the receiver type of a
 165      * constructor reference. See {@link #getSort getSort}.
 166      */
 167     public final static int CONSTRUCTOR_REFERENCE = 0x45;
 168 
 169     /**
 170      * The sort of type references that target the receiver type of a method
 171      * reference. See {@link #getSort getSort}.
 172      */
 173     public final static int METHOD_REFERENCE = 0x46;
 174 
 175     /**
 176      * The sort of type references that target the type declared in an explicit
 177      * or implicit cast instruction. See {@link #getSort getSort}.
 178      */
 179     public final static int CAST = 0x47;
 180 
 181     /**
 182      * The sort of type references that target a type parameter of a generic
 183      * constructor in a constructor call. See {@link #getSort getSort}.
 184      */
 185     public final static int CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT = 0x48;
 186 
 187     /**
 188      * The sort of type references that target a type parameter of a generic
 189      * method in a method call. See {@link #getSort getSort}.
 190      */
 191     public final static int METHOD_INVOCATION_TYPE_ARGUMENT = 0x49;
 192 
 193     /**
 194      * The sort of type references that target a type parameter of a generic
 195      * constructor in a constructor reference. See {@link #getSort getSort}.
 196      */
 197     public final static int CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT = 0x4A;
 198 
 199     /**
 200      * The sort of type references that target a type parameter of a generic
 201      * method in a method reference. See {@link #getSort getSort}.
 202      */
 203     public final static int METHOD_REFERENCE_TYPE_ARGUMENT = 0x4B;
 204 
 205     /**
 206      * The type reference value in Java class file format.
 207      */
 208     private int value;
 209 
 210     /**
 211      * Creates a new TypeReference.
 212      *
 213      * @param typeRef
 214      *            the int encoded value of the type reference, as received in a
 215      *            visit method related to type annotations, like
 216      *            visitTypeAnnotation.
 217      */
 218     public TypeReference(int typeRef) {
 219         this.value = typeRef;
 220     }
 221 
 222     /**
 223      * Returns a type reference of the given sort.
 224      *
 225      * @param sort
 226      *            {@link #FIELD FIELD}, {@link #METHOD_RETURN METHOD_RETURN},
 227      *            {@link #METHOD_RECEIVER METHOD_RECEIVER},
 228      *            {@link #LOCAL_VARIABLE LOCAL_VARIABLE},
 229      *            {@link #RESOURCE_VARIABLE RESOURCE_VARIABLE},
 230      *            {@link #INSTANCEOF INSTANCEOF}, {@link #NEW NEW},
 231      *            {@link #CONSTRUCTOR_REFERENCE CONSTRUCTOR_REFERENCE}, or
 232      *            {@link #METHOD_REFERENCE METHOD_REFERENCE}.
 233      * @return a type reference of the given sort.
 234      */
 235     public static TypeReference newTypeReference(int sort) {
 236         return new TypeReference(sort << 24);
 237     }
 238 
 239     /**
 240      * Returns a reference to a type parameter of a generic class or method.
 241      *
 242      * @param sort
 243      *            {@link #CLASS_TYPE_PARAMETER CLASS_TYPE_PARAMETER} or
 244      *            {@link #METHOD_TYPE_PARAMETER METHOD_TYPE_PARAMETER}.
 245      * @param paramIndex
 246      *            the type parameter index.
 247      * @return a reference to the given generic class or method type parameter.
 248      */
 249     public static TypeReference newTypeParameterReference(int sort,
 250             int paramIndex) {
 251         return new TypeReference((sort << 24) | (paramIndex << 16));
 252     }
 253 
 254     /**
 255      * Returns a reference to a type parameter bound of a generic class or
 256      * method.
 257      *
 258      * @param sort
 259      *            {@link #CLASS_TYPE_PARAMETER CLASS_TYPE_PARAMETER} or
 260      *            {@link #METHOD_TYPE_PARAMETER METHOD_TYPE_PARAMETER}.
 261      * @param paramIndex
 262      *            the type parameter index.
 263      * @param boundIndex
 264      *            the type bound index within the above type parameters.
 265      * @return a reference to the given generic class or method type parameter
 266      *         bound.
 267      */
 268     public static TypeReference newTypeParameterBoundReference(int sort,
 269             int paramIndex, int boundIndex) {
 270         return new TypeReference((sort << 24) | (paramIndex << 16)
 271                 | (boundIndex << 8));
 272     }
 273 
 274     /**
 275      * Returns a reference to the super class or to an interface of the
 276      * 'implements' clause of a class.
 277      *
 278      * @param itfIndex
 279      *            the index of an interface in the 'implements' clause of a
 280      *            class, or -1 to reference the super class of the class.
 281      * @return a reference to the given super type of a class.
 282      */
 283     public static TypeReference newSuperTypeReference(int itfIndex) {
 284         itfIndex &= 0xFFFF;
 285         return new TypeReference((CLASS_EXTENDS << 24) | (itfIndex << 8));
 286     }
 287 
 288     /**
 289      * Returns a reference to the type of a formal parameter of a method.
 290      *
 291      * @param paramIndex
 292      *            the formal parameter index.
 293      *
 294      * @return a reference to the type of the given method formal parameter.
 295      */
 296     public static TypeReference newFormalParameterReference(int paramIndex) {
 297         return new TypeReference((METHOD_FORMAL_PARAMETER << 24)
 298                 | (paramIndex << 16));
 299     }
 300 
 301     /**
 302      * Returns a reference to the type of an exception, in a 'throws' clause of
 303      * a method.
 304      *
 305      * @param exceptionIndex
 306      *            the index of an exception in a 'throws' clause of a method.
 307      *
 308      * @return a reference to the type of the given exception.
 309      */
 310     public static TypeReference newExceptionReference(int exceptionIndex) {
 311         return new TypeReference((THROWS << 24) | (exceptionIndex << 8));
 312     }
 313 
 314     /**
 315      * Returns a reference to the type of the exception declared in a 'catch'
 316      * clause of a method.
 317      *
 318      * @param tryCatchBlockIndex
 319      *            the index of a try catch block (using the order in which they
 320      *            are visited with visitTryCatchBlock).
 321      *
 322      * @return a reference to the type of the given exception.
 323      */
 324     public static TypeReference newTryCatchReference(int tryCatchBlockIndex) {
 325         return new TypeReference((EXCEPTION_PARAMETER << 24)
 326                 | (tryCatchBlockIndex << 8));
 327     }
 328 
 329     /**
 330      * Returns a reference to the type of a type argument in a constructor or
 331      * method call or reference.
 332      *
 333      * @param sort
 334      *            {@link #CAST CAST},
 335      *            {@link #CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT
 336      *            CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT},
 337      *            {@link #METHOD_INVOCATION_TYPE_ARGUMENT
 338      *            METHOD_INVOCATION_TYPE_ARGUMENT},
 339      *            {@link #CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT
 340      *            CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT}, or
 341      *            {@link #METHOD_REFERENCE_TYPE_ARGUMENT
 342      *            METHOD_REFERENCE_TYPE_ARGUMENT}.
 343      * @param argIndex
 344      *            the type argument index.
 345      *
 346      * @return a reference to the type of the given type argument.
 347      */
 348     public static TypeReference newTypeArgumentReference(int sort, int argIndex) {
 349         return new TypeReference((sort << 24) | argIndex);
 350     }
 351 
 352     /**
 353      * Returns the sort of this type reference.
 354      *
 355      * @return {@link #CLASS_TYPE_PARAMETER CLASS_TYPE_PARAMETER},
 356      *         {@link #METHOD_TYPE_PARAMETER METHOD_TYPE_PARAMETER},
 357      *         {@link #CLASS_EXTENDS CLASS_EXTENDS},
 358      *         {@link #CLASS_TYPE_PARAMETER_BOUND CLASS_TYPE_PARAMETER_BOUND},
 359      *         {@link #METHOD_TYPE_PARAMETER_BOUND METHOD_TYPE_PARAMETER_BOUND},
 360      *         {@link #FIELD FIELD}, {@link #METHOD_RETURN METHOD_RETURN},
 361      *         {@link #METHOD_RECEIVER METHOD_RECEIVER},
 362      *         {@link #METHOD_FORMAL_PARAMETER METHOD_FORMAL_PARAMETER},
 363      *         {@link #THROWS THROWS}, {@link #LOCAL_VARIABLE LOCAL_VARIABLE},
 364      *         {@link #RESOURCE_VARIABLE RESOURCE_VARIABLE},
 365      *         {@link #EXCEPTION_PARAMETER EXCEPTION_PARAMETER},
 366      *         {@link #INSTANCEOF INSTANCEOF}, {@link #NEW NEW},
 367      *         {@link #CONSTRUCTOR_REFERENCE CONSTRUCTOR_REFERENCE},
 368      *         {@link #METHOD_REFERENCE METHOD_REFERENCE}, {@link #CAST CAST},
 369      *         {@link #CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT
 370      *         CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT},
 371      *         {@link #METHOD_INVOCATION_TYPE_ARGUMENT
 372      *         METHOD_INVOCATION_TYPE_ARGUMENT},
 373      *         {@link #CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT
 374      *         CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT}, or
 375      *         {@link #METHOD_REFERENCE_TYPE_ARGUMENT
 376      *         METHOD_REFERENCE_TYPE_ARGUMENT}.
 377      */
 378     public int getSort() {
 379         return value >>> 24;
 380     }
 381 
 382     /**
 383      * Returns the index of the type parameter referenced by this type
 384      * reference. This method must only be used for type references whose sort
 385      * is {@link #CLASS_TYPE_PARAMETER CLASS_TYPE_PARAMETER},
 386      * {@link #METHOD_TYPE_PARAMETER METHOD_TYPE_PARAMETER},
 387      * {@link #CLASS_TYPE_PARAMETER_BOUND CLASS_TYPE_PARAMETER_BOUND} or
 388      * {@link #METHOD_TYPE_PARAMETER_BOUND METHOD_TYPE_PARAMETER_BOUND}.
 389      *
 390      * @return a type parameter index.
 391      */
 392     public int getTypeParameterIndex() {
 393         return (value & 0x00FF0000) >> 16;
 394     }
 395 
 396     /**
 397      * Returns the index of the type parameter bound, within the type parameter
 398      * {@link #getTypeParameterIndex}, referenced by this type reference. This
 399      * method must only be used for type references whose sort is
 400      * {@link #CLASS_TYPE_PARAMETER_BOUND CLASS_TYPE_PARAMETER_BOUND} or
 401      * {@link #METHOD_TYPE_PARAMETER_BOUND METHOD_TYPE_PARAMETER_BOUND}.
 402      *
 403      * @return a type parameter bound index.
 404      */
 405     public int getTypeParameterBoundIndex() {
 406         return (value & 0x0000FF00) >> 8;
 407     }
 408 
 409     /**
 410      * Returns the index of the "super type" of a class that is referenced by
 411      * this type reference. This method must only be used for type references
 412      * whose sort is {@link #CLASS_EXTENDS CLASS_EXTENDS}.
 413      *
 414      * @return the index of an interface in the 'implements' clause of a class,
 415      *         or -1 if this type reference references the type of the super
 416      *         class.
 417      */
 418     public int getSuperTypeIndex() {
 419         return (short) ((value & 0x00FFFF00) >> 8);
 420     }
 421 
 422     /**
 423      * Returns the index of the formal parameter whose type is referenced by
 424      * this type reference. This method must only be used for type references
 425      * whose sort is {@link #METHOD_FORMAL_PARAMETER METHOD_FORMAL_PARAMETER}.
 426      *
 427      * @return a formal parameter index.
 428      */
 429     public int getFormalParameterIndex() {
 430         return (value & 0x00FF0000) >> 16;
 431     }
 432 
 433     /**
 434      * Returns the index of the exception, in a 'throws' clause of a method,
 435      * whose type is referenced by this type reference. This method must only be
 436      * used for type references whose sort is {@link #THROWS THROWS}.
 437      *
 438      * @return the index of an exception in the 'throws' clause of a method.
 439      */
 440     public int getExceptionIndex() {
 441         return (value & 0x00FFFF00) >> 8;
 442     }
 443 
 444     /**
 445      * Returns the index of the try catch block (using the order in which they
 446      * are visited with visitTryCatchBlock), whose 'catch' type is referenced by
 447      * this type reference. This method must only be used for type references
 448      * whose sort is {@link #EXCEPTION_PARAMETER EXCEPTION_PARAMETER} .
 449      *
 450      * @return the index of an exception in the 'throws' clause of a method.
 451      */
 452     public int getTryCatchBlockIndex() {
 453         return (value & 0x00FFFF00) >> 8;
 454     }
 455 
 456     /**
 457      * Returns the index of the type argument referenced by this type reference.
 458      * This method must only be used for type references whose sort is
 459      * {@link #CAST CAST}, {@link #CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT
 460      * CONSTRUCTOR_INVOCATION_TYPE_ARGUMENT},
 461      * {@link #METHOD_INVOCATION_TYPE_ARGUMENT METHOD_INVOCATION_TYPE_ARGUMENT},
 462      * {@link #CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT
 463      * CONSTRUCTOR_REFERENCE_TYPE_ARGUMENT}, or
 464      * {@link #METHOD_REFERENCE_TYPE_ARGUMENT METHOD_REFERENCE_TYPE_ARGUMENT}.
 465      *
 466      * @return a type parameter index.
 467      */
 468     public int getTypeArgumentIndex() {
 469         return value & 0xFF;
 470     }
 471 
 472     /**
 473      * Returns the int encoded value of this type reference, suitable for use in
 474      * visit methods related to type annotations, like visitTypeAnnotation.
 475      *
 476      * @return the int encoded value of this type reference.
 477      */
 478     public int getValue() {
 479         return value;
 480     }
 481 }