checkers.igj
Class IGJAnnotatedTypeFactory

java.lang.Object
  extended by checkers.types.AnnotatedTypeFactory
      extended by checkers.types.BasicAnnotatedTypeFactory<IGJChecker>
          extended by checkers.igj.IGJAnnotatedTypeFactory

public class IGJAnnotatedTypeFactory
extends BasicAnnotatedTypeFactory<IGJChecker>

Adds implicit and default IGJ annotations, only if the user does not annotate the type explicitly. This factory will add the Immutable annotation to a type if the input is 1. a primitive type, 2. a known immutable type, if the class type is annotated as Immutable, or 3. an enumerator type. It will add the ReadOnly annotation to a type if the input is 4. a method receiver for an immutable class 5. a result of unification of different immutabilities (e.g. within Conditional Expressions) It will add the Mutable annotation to a type if (6.) the input is a use of a mutable type. As an implementation detail, it adds a special annotation, IGJBottom, that is a bottom for all other types in the hierarchy. It is inserted to (7.) values could assigned to anything like, null literals. Furthermore, it resolves I annotation to the proper annotation, according to its specification (described in I javadoc).


Field Summary
protected static String IMMUTABILITY_KEY
          the I annotation value key
 
Fields inherited from class checkers.types.BasicAnnotatedTypeFactory
defaults, flow, FLOW_BY_DEFAULT, poly, treeAnnotator, typeAnnotator, useFlow
 
Fields inherited from class checkers.types.AnnotatedTypeFactory
annotations, atypes, elements, eltsToArrays, env, JSR308_ELTS_ARRAY_CONVENTION, qualHierarchy, root, trees, types, visitorState
 
Constructor Summary
IGJAnnotatedTypeFactory(IGJChecker checker, CompilationUnitTree root)
          Constructor for IGJAnnotatedTypeFactory object.
 
Method Summary
protected  void annotateImplicit(Element elt, AnnotatedTypeMirror type)
          Adds implicit annotations to a type obtained from a Element.
protected  void annotateInheritedFromClass(AnnotatedTypeMirror type)
          Override the default behavior of implicitly adding annotations on the class type to the declared types within the passed type.
protected  TreeAnnotator createTreeAnnotator(IGJChecker checker)
          Returns a TreeAnnotator that adds annotations to a type based on the contents of a tree.
protected  TypeAnnotator createTypeAnnotator(IGJChecker checker)
          Returns a TypeAnnotator that adds annotations to a type based on the content of the type itself.
 AnnotatedTypeMirror.AnnotatedDeclaredType getSelfType(Tree tree)
          Returns the type of field this, for the scope of this tree.
 AnnotatedTypeMirror.AnnotatedExecutableType methodFromUse(MethodInvocationTree tree)
          Resolves @I in the type of the method type base on the method invocation tree parameters.
 void postAsMemberOf(AnnotatedTypeMirror elementType, AnnotatedTypeMirror owner, Element element)
          Resolve the instances of @I in the elementType based on owner, according to is specification.
protected  void postDirectSuperTypes(AnnotatedTypeMirror type, List<? extends AnnotatedTypeMirror> supertypes)
          Replace all instances of @I in the super types with the immutability of the current type
 
Methods inherited from class checkers.types.BasicAnnotatedTypeFactory
annotateImplicit
 
Methods inherited from class checkers.types.AnnotatedTypeFactory
constructorFromUse, createLRUCache, declarationFromElement, fromClass, fromElement, fromElement, fromElement, fromExpression, fromMember, fromTypeTree, fromTypeTreeInternal, getAnnotatedType, getAnnotatedType, getAnnotatedType, getAnnotatedType, getAnnotatedType, getAnnotatedType, getAnnotatedType, getAnnotatedType, getAnnotatedTypeFromTypeTree, getBoxedType, getCurrentClassType, getCurrentMethodReceiver, getPath, getReceiver, getUnboxedType, getVisitorState, unify
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

IMMUTABILITY_KEY

protected static final String IMMUTABILITY_KEY
the I annotation value key

See Also:
Constant Field Values
Constructor Detail

IGJAnnotatedTypeFactory

public IGJAnnotatedTypeFactory(IGJChecker checker,
                               CompilationUnitTree root)
Constructor for IGJAnnotatedTypeFactory object.

Parameters:
checker - the checker to which this factory belongs
root - the compilation unit the annotation processor is processing currently
Method Detail

createTreeAnnotator

protected TreeAnnotator createTreeAnnotator(IGJChecker checker)
Description copied from class: BasicAnnotatedTypeFactory
Returns a TreeAnnotator that adds annotations to a type based on the contents of a tree. Subclasses may override this method to specify more appriopriate TreeAnnotator

Overrides:
createTreeAnnotator in class BasicAnnotatedTypeFactory<IGJChecker>
Returns:
a tree annotator

createTypeAnnotator

protected TypeAnnotator createTypeAnnotator(IGJChecker checker)
Description copied from class: BasicAnnotatedTypeFactory
Returns a TypeAnnotator that adds annotations to a type based on the content of the type itself.

Overrides:
createTypeAnnotator in class BasicAnnotatedTypeFactory<IGJChecker>
Returns:
a type annotator

annotateImplicit

protected void annotateImplicit(Element elt,
                                AnnotatedTypeMirror type)
Description copied from class: AnnotatedTypeFactory
Adds implicit annotations to a type obtained from a Element. By default, this method does nothing. Subclasses should use this method to implement implicit annotations specific to their type systems.

Overrides:
annotateImplicit in class BasicAnnotatedTypeFactory<IGJChecker>
Parameters:
elt - an element
type - the type obtained from elt

postDirectSuperTypes

protected void postDirectSuperTypes(AnnotatedTypeMirror type,
                                    List<? extends AnnotatedTypeMirror> supertypes)
Replace all instances of @I in the super types with the immutability of the current type

Overrides:
postDirectSuperTypes in class AnnotatedTypeFactory
Parameters:
type - the type whose supertypes are requested
supertypes - the supertypes of type

postAsMemberOf

public void postAsMemberOf(AnnotatedTypeMirror elementType,
                           AnnotatedTypeMirror owner,
                           Element element)
Resolve the instances of @I in the elementType based on owner, according to is specification.

Overrides:
postAsMemberOf in class AnnotatedTypeFactory
Parameters:
elementType - the annotated type of the element
owner - the annotated type of the receiver of the accessing tree
element - the element of the field or method

annotateInheritedFromClass

protected void annotateInheritedFromClass(AnnotatedTypeMirror type)
Override the default behavior of implicitly adding annotations on the class type to the declared types within the passed type.

Overrides:
annotateInheritedFromClass in class AnnotatedTypeFactory
Parameters:
type - the type for which class annotations will be inherited if there are no annotations already present

methodFromUse

public AnnotatedTypeMirror.AnnotatedExecutableType methodFromUse(MethodInvocationTree tree)
Resolves @I in the type of the method type base on the method invocation tree parameters. Any unresolved @Is is resolved to a place holder type. It resolves @I annotation in the following way:

Overrides:
methodFromUse in class BasicAnnotatedTypeFactory<IGJChecker>
Parameters:
tree - the method invocation tree
Returns:
the method type being invoked with tree

getSelfType

public AnnotatedTypeMirror.AnnotatedDeclaredType getSelfType(Tree tree)
Returns the type of field this, for the scope of this tree. In IGJ, the self type is the method receiver in this scope.

Overrides:
getSelfType in class AnnotatedTypeFactory