Class ParamApplier

java.lang.Object
org.checkerframework.framework.util.element.ParamApplier

public class ParamApplier extends Object
Adds annotations to one formal parameter of a method or lambda within a method.
  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    protected final Element
    An Element that type represents.
    static final int
     
    protected final AnnotatedTypeMirror
    The type to which we wish to apply annotations.
  • Method Summary

    Modifier and Type
    Method
    Description
    static boolean
     
    protected com.sun.tools.javac.code.TargetType[]
    Returns {TargetType.METHOD_FORMAL_PARAMETER, TargetType.METHOD_RECEIVER}.
    static void
    Apply annotations from element to type.
    void
    Reads the list of annotations that apply to this element (see getRawTypeAttributes).
    int
    Returns the index of element its parent method's parameter list.
    static com.sun.tools.javac.code.Symbol.MethodSymbol
    getParentMethod(Element methodChildElem)
    Return the enclosing MethodSymbol of the given element, throwing an exception if the symbol's enclosing element is not a MethodSymbol.
    protected Iterable<com.sun.tools.javac.code.Attribute.TypeCompound>
    Returns the TypeCompounds (annotations) of the enclosing method for this parameter.
    int
    getTypeCompoundIndex(com.sun.tools.javac.code.Attribute.TypeCompound anno)
    Returns the parameter index of anno's TypeAnnotationPosition.
    protected void
    handleInvalid(List<com.sun.tools.javac.code.Attribute.TypeCompound> invalid)
    This implementation reports all invalid annotations as errors.
    protected void
    handleTargeted(List<com.sun.tools.javac.code.Attribute.TypeCompound> targeted)
    This method should apply all annotations that are handled by this object.
    protected void
    handleValid(List<com.sun.tools.javac.code.Attribute.TypeCompound> valid)
    The default implementation of this method does nothing.
    protected boolean
    Tests element/type fields to ensure that this TargetedElementAnnotationApplier is valid for this element/type pair.
    protected Map<org.checkerframework.framework.util.element.TargetedElementAnnotationApplier.TargetClass,List<com.sun.tools.javac.code.Attribute.TypeCompound>>
    sift(Iterable<com.sun.tools.javac.code.Attribute.TypeCompound> typeCompounds)
    Separate the input annotations into a Map of TargetClass (TARGETED, VALID, INVALID) to the annotations that fall into each of those categories.
    protected com.sun.tools.javac.code.TargetType[]
    Returns any annotation TargetType that can be found on a method.

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Field Details

    • RECEIVER_PARAM_INDEX

      public static final int RECEIVER_PARAM_INDEX
      See Also:
    • type

      protected final AnnotatedTypeMirror type
      The type to which we wish to apply annotations.
    • element

      protected final Element element
      An Element that type represents.
  • Method Details

    • apply

      Apply annotations from element to type.
      Parameters:
      type - the type whose annotations to change
      element - where to get annotations from
      typeFactory - the type factory
      Throws:
      ElementAnnotationUtil.UnexpectedAnnotationLocationException - if there is trouble
    • accepts

      public static boolean accepts(AnnotatedTypeMirror type, Element element)
    • getElementIndex

      public int getElementIndex()
      Returns the index of element its parent method's parameter list. Integer.MIN_VALUE if the element is the receiver parameter.
      Returns:
      the index of element its parent method's parameter list. Integer.MIN_VALUE if the element is the receiver parameter
    • getTypeCompoundIndex

      public int getTypeCompoundIndex(com.sun.tools.javac.code.Attribute.TypeCompound anno)
      Returns the parameter index of anno's TypeAnnotationPosition.
      Parameters:
      anno - an annotation we might wish to apply
      Returns:
      the parameter index of anno's TypeAnnotationPosition
    • annotatedTargets

      protected com.sun.tools.javac.code.TargetType[] annotatedTargets()
      Returns {TargetType.METHOD_FORMAL_PARAMETER, TargetType.METHOD_RECEIVER}.
      Returns:
      {TargetType.METHOD_FORMAL_PARAMETER, TargetType.METHOD_RECEIVER}
    • validTargets

      protected com.sun.tools.javac.code.TargetType[] validTargets()
      Returns any annotation TargetType that can be found on a method.
      Returns:
      any annotation TargetType that can be found on a method
    • getRawTypeAttributes

      protected Iterable<com.sun.tools.javac.code.Attribute.TypeCompound> getRawTypeAttributes()
      Returns the TypeCompounds (annotations) of the enclosing method for this parameter.
      Returns:
      the TypeCompounds (annotations) of the enclosing method for this parameter
    • sift

      protected Map<org.checkerframework.framework.util.element.TargetedElementAnnotationApplier.TargetClass,List<com.sun.tools.javac.code.Attribute.TypeCompound>> sift(Iterable<com.sun.tools.javac.code.Attribute.TypeCompound> typeCompounds)
      Separate the input annotations into a Map of TargetClass (TARGETED, VALID, INVALID) to the annotations that fall into each of those categories.
      Parameters:
      typeCompounds - annotations to sift through, should be those returned by getRawTypeAttributes
      Returns:
      a Map<TargetClass => Annotations>.
    • handleTargeted

      protected void handleTargeted(List<com.sun.tools.javac.code.Attribute.TypeCompound> targeted) throws ElementAnnotationUtil.UnexpectedAnnotationLocationException
      This method should apply all annotations that are handled by this object.
      Parameters:
      targeted - type compounds with formal method parameter target types with parameter_index == getIndex
      Throws:
      ElementAnnotationUtil.UnexpectedAnnotationLocationException
    • isAccepted

      protected boolean isAccepted()
      Tests element/type fields to ensure that this TargetedElementAnnotationApplier is valid for this element/type pair.
      Returns:
      true if the type/element members are handled by this class false otherwise
    • getParentMethod

      public static com.sun.tools.javac.code.Symbol.MethodSymbol getParentMethod(Element methodChildElem)
      Return the enclosing MethodSymbol of the given element, throwing an exception if the symbol's enclosing element is not a MethodSymbol.
      Parameters:
      methodChildElem - some element that is a child of a method typeDeclaration (e.g. a parameter or return type)
      Returns:
      the MethodSymbol of the method containing methodChildElem
    • extractAndApply

      Reads the list of annotations that apply to this element (see getRawTypeAttributes). Sifts them into three groups (TARGETED, INVALID, VALID) and then calls the appropriate handle method on them. The handleTargeted method should apply all annotations that are handled by this object.

      This method will throw a runtime exception if isAccepted returns false.

      Throws:
      ElementAnnotationUtil.UnexpectedAnnotationLocationException
    • handleValid

      protected void handleValid(List<com.sun.tools.javac.code.Attribute.TypeCompound> valid)
      The default implementation of this method does nothing.
      Parameters:
      valid - the list of annotations that were returned by getRawTypeAttributes and had a TargetType contained by valid and NOT annotatedTargets
    • handleInvalid

      protected void handleInvalid(List<com.sun.tools.javac.code.Attribute.TypeCompound> invalid)
      This implementation reports all invalid annotations as errors.
      Parameters:
      invalid - the list of annotations that were returned by getRawTypeAttributes and were not handled by handleTargeted or handleValid