Class CalledMethodsTransfer
- All Implemented Interfaces:
- ForwardTransferFunction<AccumulationValue,,- AccumulationStore> - TransferFunction<AccumulationValue,,- AccumulationStore> - NodeVisitor<TransferResult<AccumulationValue,- AccumulationStore>, - TransferInput<AccumulationValue, - AccumulationStore>> 
- Direct Known Subclasses:
- ResourceLeakTransfer
- 
Field SummaryFields inherited from class org.checkerframework.common.accumulation.AccumulationTransferatypeFactoryFields inherited from class org.checkerframework.framework.flow.CFAbstractTransferanalysis, sequentialSemantics
- 
Constructor SummaryConstructorsConstructorDescriptionCalledMethodsTransfer(CalledMethodsAnalysis analysis) Create a new CalledMethodsTransfer.
- 
Method SummaryModifier and TypeMethodDescriptionvoidaccumulate(Node node, TransferResult<AccumulationValue, AccumulationStore> result, String... values) Updates the estimate of how many thingsnodehas accumulated.visitMethodInvocation(MethodInvocationNode node, TransferInput<AccumulationValue, AccumulationStore> input) Methods inherited from class org.checkerframework.framework.flow.CFAbstractTransferaddInformationFromPreconditions, createTransferResult, finishValue, finishValue, getNarrowedValue, getValueFromFactory, getWidenedValue, initialStore, insertIntoStores, isNotFullyInitializedReceiver, moreSpecificValue, processCommonAssignment, processConditionalPostconditions, processPostconditions, recreateTransferResult, setFixedInitialStore, splitAssignments, strengthenAnnotationOfEqualTo, usesSequentialSemantics, visitArrayAccess, visitAssignment, visitCase, visitClassName, visitConditionalNot, visitEqualTo, visitExpressionStatement, visitFieldAccess, visitInstanceOf, visitLambdaResultExpression, visitLocalVariable, visitNarrowingConversion, visitNode, visitNotEqual, visitObjectCreation, visitReturn, visitStringConversion, visitSwitchExpressionNode, visitTernaryExpression, visitThis, visitVariableDeclaration, visitWideningConversionMethods inherited from class org.checkerframework.dataflow.cfg.node.AbstractNodeVisitorvisitArrayCreation, visitArrayType, visitAssertionError, visitBitwiseAnd, visitBitwiseComplement, visitBitwiseOr, visitBitwiseXor, visitBooleanLiteral, visitCharacterLiteral, visitClassDeclaration, visitConditionalAnd, visitConditionalOr, visitDeconstructorPattern, visitDoubleLiteral, visitExplicitThis, visitFloatingDivision, visitFloatingRemainder, visitFloatLiteral, visitGreaterThan, visitGreaterThanOrEqual, visitImplicitThis, visitIntegerDivision, visitIntegerLiteral, visitIntegerRemainder, visitLeftShift, visitLessThan, visitLessThanOrEqual, visitLongLiteral, visitMarker, visitMemberReference, visitMethodAccess, visitNullChk, visitNullLiteral, visitNumericalAddition, visitNumericalMinus, visitNumericalMultiplication, visitNumericalPlus, visitNumericalSubtraction, visitPackageName, visitParameterizedType, visitPrimitiveType, visitShortLiteral, visitSignedRightShift, visitStringConcatenate, visitStringLiteral, visitSuper, visitSynchronized, visitThrow, visitTypeCast, visitUnsignedRightShift, visitValueLiteralMethods inherited from class java.lang.Objectclone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, waitMethods inherited from interface org.checkerframework.dataflow.cfg.node.NodeVisitorvisitArrayCreation, visitArrayType, visitAssertionError, visitBitwiseAnd, visitBitwiseComplement, visitBitwiseOr, visitBitwiseXor, visitBooleanLiteral, visitCharacterLiteral, visitClassDeclaration, visitConditionalAnd, visitConditionalOr, visitDeconstructorPattern, visitDoubleLiteral, visitExplicitThis, visitFloatingDivision, visitFloatingRemainder, visitFloatLiteral, visitGreaterThan, visitGreaterThanOrEqual, visitImplicitThis, visitIntegerDivision, visitIntegerLiteral, visitIntegerRemainder, visitLeftShift, visitLessThan, visitLessThanOrEqual, visitLongLiteral, visitMarker, visitMemberReference, visitMethodAccess, visitNullChk, visitNullLiteral, visitNumericalAddition, visitNumericalMinus, visitNumericalMultiplication, visitNumericalPlus, visitNumericalSubtraction, visitPackageName, visitParameterizedType, visitPrimitiveType, visitShortLiteral, visitSignedRightShift, visitStringConcatenate, visitStringLiteral, visitSuper, visitSynchronized, visitThrow, visitTypeCast, visitUnsignedRightShift
- 
Constructor Details- 
CalledMethodsTransferCreate a new CalledMethodsTransfer.- Parameters:
- analysis- the analysis
 
 
- 
- 
Method Details- 
visitMethodInvocationpublic TransferResult<AccumulationValue,AccumulationStore> visitMethodInvocation(MethodInvocationNode node, TransferInput<AccumulationValue, AccumulationStore> input) - Specified by:
- visitMethodInvocationin interface- NodeVisitor<TransferResult<AccumulationValue,- AccumulationStore>, - TransferInput<AccumulationValue, - AccumulationStore>> 
- Overrides:
- visitMethodInvocationin class- CFAbstractTransfer<AccumulationValue,- AccumulationStore, - AccumulationTransfer> 
 
- 
accumulatepublic void accumulate(Node node, TransferResult<AccumulationValue, AccumulationStore> result, String... values) Description copied from class:AccumulationTransferUpdates the estimate of how many thingsnodehas accumulated.If the node is an invocation of a method that returns its receiver, then its receiver's type will also be updated. In a chain of method calls, this process will continue backward as long as each receiver is itself a receiver-returning method invocation. For example, suppose nodeis the expressiona.b().c(), the new value (added by the accumulation analysis because of the.c()call) is "foo", and b and c return their receiver. This method will directly update the estimate ofa.b().c()to include "foo". In addition, the estimates for the expressionsa.b()andawould have their estimates updated to include "foo", because c and b (respectively) return their receivers. Note that due to what kind of values can be held in the store, this information is lost outside the method chain. That is, the returns-receiver propagated information is lost outside the expression in which the returns-receiver method invocations are nested.As a concrete example, consider the Called Methods accumulation checker: if buildrequires a, b, and c to be called, thenfoo.a().b().c().build();will typecheck (they are in one fluent method chain), butfoo.a().b().c(); foo.build();will not -- the store does not keep the information that a, b, and c have been called outside the chain.foo's type will beCalledMethods("a"), because onlya()was called directly onfoo. For such code to typecheck, the Called Methods accumulation checker uses an additional rule: the return type of a receiver-returning methodrr()isCalledMethods("rr"). This rule is implemented directly in theTreeAnnotatorsubclass defined in the Called Methods type factory.- Overrides:
- accumulatein class- AccumulationTransfer
- Parameters:
- node- the node whose estimate should be expanded
- result- the transfer result containing the store to be modified
- values- the new accumulation values
 
 
-