Interface WholeProgramInference
- All Known Implementing Classes:
WholeProgramInferenceImplementation
WholeProgramInference
is misleading.
This interface has update* methods that should be called at certain (pseudo-)assignments, and they may update the type of the LHS of the (pseudo-)assignment based on the type of the RHS. In case the element on the LHS already had an inferred type, its new type will be the LUB between the previous and new types.
- See the Checker Framework Manual:
- Whole-program inference
-
Nested Class Summary
Modifier and TypeInterfaceDescriptionstatic enum
The kinds of output that whole-program inference can produce. -
Method Summary
Modifier and TypeMethodDescriptionvoid
addClassDeclarationAnnotation
(TypeElement classElt, AnnotationMirror anno) Adds an annotation to a class declaration.void
addDeclarationAnnotationToFormalParameter
(ExecutableElement methodElt, int index, AnnotationMirror anno) Adds a declaration annotation to a formal parameter.void
addFieldDeclarationAnnotation
(VariableElement fieldElt, AnnotationMirror anno) Updates a field to add a declaration annotation.void
addMethodDeclarationAnnotation
(ExecutableElement methodElt, AnnotationMirror anno) Updates a method to add a declaration annotation.void
addMethodDeclarationAnnotation
(ExecutableElement elt, AnnotationMirror anno, boolean lubPurity) Updates a method to add a declaration annotation.void
preprocessClassTree
(ClassTree classTree) Performs any preparation required for inference on Elements of a class.void
updateAtmWithLub
(AnnotatedTypeMirror sourceCodeATM, AnnotatedTypeMirror ajavaATM) Updates sourceCodeATM to contain the LUB between sourceCodeATM and ajavaATM, ignoring missing AnnotationMirrors from ajavaATM -- it considers the LUB between an AnnotationMirror am and a missing AnnotationMirror to be am.void
updateContracts
(Analysis.BeforeOrAfter preOrPost, ExecutableElement methodElement, CFAbstractStore<?, ?> store) Updates the preconditions or postconditions of the current method, from a store.void
updateFieldFromType
(Tree lhsTree, Element element, String fieldName, AnnotatedTypeMirror rhsATM) Updates the type offield
based on an assignment whose right-hand side has typerhsATM
.void
updateFromFieldAssignment
(Node field, Node rhs) Updates the type offield
based on an assignment ofrhs
tofield
.void
updateFromFormalParameterAssignment
(LocalVariableNode lhs, Node rhs, VariableElement paramElt) Updates the type oflhs
based on an assignment ofrhs
tolhs
.void
updateFromMethodInvocation
(MethodInvocationNode methodInvNode, ExecutableElement methodElt, CFAbstractStore<?, ?> store) Updates the parameter types of the methodmethodElt
based on the arguments in the method invocationmethodInvNode
.void
updateFromObjectCreation
(ObjectCreationNode objectCreationNode, ExecutableElement constructorElt, CFAbstractStore<?, ?> store) Updates the parameter types of the constructorconstructorElt
based on the arguments inobjectCreationNode
.void
updateFromOverride
(MethodTree methodTree, ExecutableElement methodElt, AnnotatedTypeMirror.AnnotatedExecutableType overriddenMethod) Updates the parameter types (including the receiver) of the methodmethodTree
based on the parameter types of the overridden methodoverriddenMethod
.void
updateFromReturn
(ReturnNode retNode, com.sun.tools.javac.code.Symbol.ClassSymbol classSymbol, MethodTree methodTree, Map<AnnotatedTypeMirror.AnnotatedDeclaredType, ExecutableElement> overriddenMethods) Updates the return type of the methodmethodTree
based onreturnedExpression
.void
writeResultsToFile
(WholeProgramInference.OutputFormat format, BaseTypeChecker checker) Writes the inferred results to a file.
-
Method Details
-
updateFromObjectCreation
void updateFromObjectCreation(ObjectCreationNode objectCreationNode, ExecutableElement constructorElt, CFAbstractStore<?, ?> store) Updates the parameter types of the constructorconstructorElt
based on the arguments inobjectCreationNode
.For each parameter in constructorElt:
- If there is no stored annotated type for that parameter, then use the type of the corresponding argument in the object creation call objectCreationNode.
- If there was a stored annotated type for that parameter, then its new type will be the LUB between the previous type and the type of the corresponding argument in the object creation call.
- Parameters:
objectCreationNode
- the Node that invokes the constructorconstructorElt
- the Element of the constructorstore
- the store just before the call
-
updateFromMethodInvocation
void updateFromMethodInvocation(MethodInvocationNode methodInvNode, ExecutableElement methodElt, CFAbstractStore<?, ?> store) Updates the parameter types of the methodmethodElt
based on the arguments in the method invocationmethodInvNode
.For each formal parameter in methodElt (including the receiver):
- If there is no stored annotated type for that parameter, then use the type of the corresponding argument in the method call methodInvNode.
- If there was a stored annotated type for that parameter, then its new type will be the LUB between the previous type and the type of the corresponding argument in the method call.
- Parameters:
methodInvNode
- the node representing a method invocationmethodElt
- the element of the method being invokedstore
- the store before the method call, used for inferring method preconditions
-
updateFromOverride
void updateFromOverride(MethodTree methodTree, ExecutableElement methodElt, AnnotatedTypeMirror.AnnotatedExecutableType overriddenMethod) Updates the parameter types (including the receiver) of the methodmethodTree
based on the parameter types of the overridden methodoverriddenMethod
.For each formal parameter in methodElt:
- If there is no stored annotated type for that parameter, then use the type of the corresponding parameter on the overridden method.
- If there is a stored annotated type for that parameter, then its new type will be the LUB between the previous type and the type of the corresponding parameter on the overridden method.
- Parameters:
methodTree
- the tree of the method that contains the parameter(s)methodElt
- the element of the methodoverriddenMethod
- the AnnotatedExecutableType of the overridden method
-
updateFromFormalParameterAssignment
Updates the type oflhs
based on an assignment ofrhs
tolhs
.- If there is no stored annotated type for lhs, then use the type of the corresponding argument in the method call methodInvNode.
- If there is a stored annotated type for lhs, then its new type will be the LUB between the previous type and the type of the corresponding argument in the method call.
- Parameters:
lhs
- the node representing the formal parameterrhs
- the node being assigned to the parameter in the method bodyparamElt
- the formal parameter
-
updateFromFieldAssignment
Updates the type offield
based on an assignment ofrhs
tofield
. If the field has a declaration annotation with theIgnoreInWholeProgramInference
meta-annotation, no type annotation will be inferred for that field.If there is no stored entry for the field lhs, the entry will be created and its type will be the type of rhs. If there is a stored entry/type for lhs, its new type will be the LUB between the previous type and the type of rhs.
- Parameters:
field
- the field whose type will be refined. Must be either a FieldAccessNode or a LocalVariableNode whose element kind is FIELD.rhs
- the expression being assigned to the field
-
updateFieldFromType
void updateFieldFromType(Tree lhsTree, Element element, String fieldName, AnnotatedTypeMirror rhsATM) Updates the type offield
based on an assignment whose right-hand side has typerhsATM
. See more details atupdateFromFieldAssignment(org.checkerframework.dataflow.cfg.node.Node, org.checkerframework.dataflow.cfg.node.Node)
.- Parameters:
lhsTree
- the tree for the field whose type will be refinedelement
- the element for the field whose type will be refinedfieldName
- the name of the field whose type will be refinedrhsATM
- the type of the expression being assigned to the field
-
updateFromReturn
void updateFromReturn(ReturnNode retNode, com.sun.tools.javac.code.Symbol.ClassSymbol classSymbol, MethodTree methodTree, Map<AnnotatedTypeMirror.AnnotatedDeclaredType, ExecutableElement> overriddenMethods) Updates the return type of the methodmethodTree
based onreturnedExpression
. Also updates the return types of any methods that this method overrides that are available as source code.If there is no stored annotated return type for the method methodTree, then the type of the return expression will be added to the return type of that method. If there is a stored annotated return type for the method methodTree, its new type will be the LUB between the previous type and the type of the return expression.
- Parameters:
retNode
- the node that contains the expression returnedclassSymbol
- the symbol of the class that contains the methodmethodTree
- the tree of the method whose return type may be updatedoverriddenMethods
- the methods that the given method return overrides, indexed by the annotated type of the superclass in which each method is defined
-
updateContracts
void updateContracts(Analysis.BeforeOrAfter preOrPost, ExecutableElement methodElement, CFAbstractStore<?, ?> store) Updates the preconditions or postconditions of the current method, from a store.- Parameters:
methodElement
- the method or constructor whose preconditions or postconditions to updatepreOrPost
- whether to update preconditions or postconditionsstore
- the store at the method's entry or normal exit, for reading types of expressions
-
updateAtmWithLub
Updates sourceCodeATM to contain the LUB between sourceCodeATM and ajavaATM, ignoring missing AnnotationMirrors from ajavaATM -- it considers the LUB between an AnnotationMirror am and a missing AnnotationMirror to be am. The results are stored in sourceCodeATM.- Parameters:
sourceCodeATM
- the annotated type on the source code; side effected by this methodajavaATM
- the annotated type on the annotation file
-
addMethodDeclarationAnnotation
Updates a method to add a declaration annotation.- Parameters:
methodElt
- the method to annotateanno
- the declaration annotation to add to the method
-
addMethodDeclarationAnnotation
void addMethodDeclarationAnnotation(ExecutableElement elt, AnnotationMirror anno, boolean lubPurity) Updates a method to add a declaration annotation. Optionally, may replace the current purity annotation onelt
with the logical least upper bound between that purity annotation andanno
, ifanno
is also a purity annotation.- Parameters:
elt
- the method to annotateanno
- the declaration annotation to add to the methodlubPurity
- if true andanno
is a purity annotation, replaces the current purity annotation with a least upper bound rather than just addinganno
-
addFieldDeclarationAnnotation
Updates a field to add a declaration annotation.- Parameters:
fieldElt
- the field to annotateanno
- the declaration annotation to add to the field
-
addDeclarationAnnotationToFormalParameter
void addDeclarationAnnotationToFormalParameter(ExecutableElement methodElt, int index, AnnotationMirror anno) Adds a declaration annotation to a formal parameter.- Parameters:
methodElt
- the method whose formal parameter will be annotatedindex
- the index of the parameter (0-indexed)anno
- the annotation to add
-
addClassDeclarationAnnotation
Adds an annotation to a class declaration.- Parameters:
classElt
- the class declaration to annotateanno
- the annotation to add
-
writeResultsToFile
Writes the inferred results to a file. Ideally, it should be called at the end of the type-checking process. In practice, it is called after each class, because we don't know which class will be the last one in the type-checking process.- Parameters:
format
- the file format in which to write the resultschecker
- the checker from which this method is called, for naming annotation files
-
preprocessClassTree
Performs any preparation required for inference on Elements of a class. Should be called on each toplevel class declaration in a compilation unit before processing it.- Parameters:
classTree
- the class to preprocess
-