org.aspectj.org.eclipse.jdt.internal.compiler.ast
Class FakedTrackingVariable

java.lang.Object
  extended by org.aspectj.org.eclipse.jdt.internal.compiler.ast.ASTNode
      extended by org.aspectj.org.eclipse.jdt.internal.compiler.ast.Statement
          extended by org.aspectj.org.eclipse.jdt.internal.compiler.ast.AbstractVariableDeclaration
              extended by org.aspectj.org.eclipse.jdt.internal.compiler.ast.LocalDeclaration
                  extended by org.aspectj.org.eclipse.jdt.internal.compiler.ast.FakedTrackingVariable
All Implemented Interfaces:
InvocationSite, TypeConstants, TypeIds

public class FakedTrackingVariable
extends LocalDeclaration

A faked local variable declaration used for keeping track of data flows of a special variable. Certain events will be recorded by changing the null info for this variable. See bug 349326 - [1.7] new warning for missing try-with-resources


Nested Class Summary
 
Nested classes/interfaces inherited from interface org.aspectj.org.eclipse.jdt.internal.compiler.lookup.InvocationSite
InvocationSite.EmptyWithAstNode
 
Nested classes/interfaces inherited from interface org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeConstants
TypeConstants.CloseMethodRecord
 
Field Summary
 FakedTrackingVariable innerTracker
           
 LocalVariableBinding originalBinding
           
 FakedTrackingVariable outerTracker
           
static boolean TEST_372319
           
 
Fields inherited from class org.aspectj.org.eclipse.jdt.internal.compiler.ast.LocalDeclaration
binding
 
Fields inherited from class org.aspectj.org.eclipse.jdt.internal.compiler.ast.AbstractVariableDeclaration
annotations, declarationEnd, declarationSourceEnd, declarationSourceStart, ENUM_CONSTANT, FIELD, hiddenVariableDepth, initialization, INITIALIZER, LOCAL_VARIABLE, modifiers, modifiersSourceStart, name, PARAMETER, type, TYPE_PARAMETER
 
Fields inherited from class org.aspectj.org.eclipse.jdt.internal.compiler.ast.Statement
COMPLAINED_FAKE_REACHABLE, COMPLAINED_UNREACHABLE, NOT_COMPLAINED
 
Fields inherited from class org.aspectj.org.eclipse.jdt.internal.compiler.ast.ASTNode
Bit1, Bit10, Bit11, Bit12, Bit13, Bit14, Bit15, Bit16, Bit17, Bit18, Bit19, Bit2, Bit20, Bit21, Bit22, Bit23, Bit24, Bit25, Bit26, Bit27, Bit28, Bit29, Bit3, Bit30, Bit31, Bit32, Bit32L, Bit33L, Bit34L, Bit35L, Bit36L, Bit37L, Bit38L, Bit39L, Bit4, Bit40L, Bit41L, Bit42L, Bit43L, Bit44L, Bit45L, Bit46L, Bit47L, Bit48L, Bit49L, Bit5, Bit50L, Bit51L, Bit52L, Bit53L, Bit54L, Bit55L, Bit56L, Bit57L, Bit58L, Bit59L, Bit6, Bit60L, Bit61L, Bit62L, Bit63L, Bit64L, Bit7, Bit8, Bit9, bits, BlockExit, CanBeStatic, ContainsAssertion, DepthMASK, DepthSHIFT, DidResolve, DisableUnnecessaryCastCheck, DiscardEnclosingInstance, DocumentedCasesOmitted, DocumentedFallthrough, Empty, ErrorInSignature, FirstAssignmentToLocal, GenerateCheckcast, HasAbstractMethods, HasAllMethodBodies, HasBeenGenerated, HasBeenResolved, HasFunctionalInterfaceTypes, HasLocalType, HasSyntaxErrors, HasTypeAnnotations, IgnoreNoEffectAssignCheck, IgnoreRawTypeCheck, InsideExpressionStatement, InsideJavadoc, INVOCATION_ARGUMENT_OK, INVOCATION_ARGUMENT_UNCHECKED, INVOCATION_ARGUMENT_WILDCARD, IsAnnotationDefaultValue, IsAnonymousType, IsAnySubRoutineEscaping, IsArgument, IsCapturedOuterLocal, IsCompoundAssigned, IsDefaultConstructor, IsDiamond, IsElseIfStatement, IsElseStatementUnreachable, IsForeachElementVariable, IsImplicitThis, IsImplicitUnit, IsLocalDeclarationReachable, IsLocalType, IsMemberType, IsNonNull, IsReachable, IsRecovered, IsReturnedValue, IsSecondaryType, IsStrictlyAssigned, IsSubRoutineEscaping, IsSuperType, IsSynchronized, IsSynthetic, IsThenStatementUnreachable, IsTryBlockExiting, IsTypeElided, IsUnionType, IsUsefulEmptyStatement, IsVarArgs, LabelUsed, NeededScope, NeedFreeReturn, NeedReceiverGenericCast, NO_ARGUMENTS, OnDemand, OperatorMASK, OperatorSHIFT, OverridingMethodWithSupercall, ParenthesizedMASK, ParenthesizedSHIFT, ResolveJavadoc, RestrictiveFlagMASK, ReturnTypeIDMASK, ShadowsOuterLocal, sourceEnd, sourceStart, SuperAccess, ThenExit, Unchecked, UndocumentedEmptyBlock, UnnecessaryCast, UnsafeCast, Used
 
Fields inherited from interface org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeConstants
ANNOTATION, ANNOTATION_PREFIX, ANNOTATION_SUFFIX, ANONYM_PREFIX, ANONYM_SUFFIX, ANONYMOUS_METHOD, APACHE, APACHE_DBUTILS, APACHE_IOUTILS, ASSERT_CLASS, ASSERT_FALSE, ASSERT_NOTNULL, ASSERT_NULL, ASSERT_TRUE, BOOLEAN, BYTE, CAPTURE18, CHAR, CharArray_JAVA_IO_OBJECTINPUTSTREAM, CharArray_JAVA_IO_OBJECTOUTPUTSTREAM, CharArray_JAVA_IO_OBJECTSTREAMFIELD, CharArray_JAVA_LANG_ANNOTATION_ANNOTATION, CharArray_JAVA_LANG_ENUM, CharArray_JAVA_LANG_OBJECT, CHECK_ARGUMENT, CHECK_NOT_NULL, CHECK_STATE, CLINIT, CLONE, CLOSE, CLOSE_QUIETLY, closeMethods, COM, COM_GOOGLE_COMMON_BASE_PRECONDITIONS, COM_GOOGLE_INJECT_INJECT, COMMONS, COMPILER, CONSTRAINT_EQUAL, CONSTRAINT_EXTENDS, CONSTRAINT_SUPER, CORE, DEFAULT_LOCATION__ARRAY_CONTENTS, DEFAULT_LOCATION__FIELD, DEFAULT_LOCATION__PARAMETER, DEFAULT_LOCATION__RETURN_TYPE, DEFAULT_LOCATION__TYPE_ARGUMENT, DEFAULT_LOCATION__TYPE_BOUND, DEFAULT_LOCATION__TYPE_PARAMETER, DESERIALIZE_LAMBDA, DOM, DOUBLE, ECLIPSE, EQUALS, FLOAT, FRAMEWORK, GETCLASS, GOOGLE, GUAVA_CLOSEABLES, HASHCODE, INIT, INJECT_PACKAGE, INJECT_TYPE, INT, INTERNAL, INVOKE, IO, IS_NOTNULL, IS_TRUE, ITYPEBINDING, JAVA, JAVA_IO, JAVA_IO_CLOSEABLE, JAVA_IO_EXTERNALIZABLE, JAVA_IO_IOEXCEPTION, JAVA_IO_OBJECTINPUTSTREAM, JAVA_IO_OBJECTOUTPUTSTREAM, JAVA_IO_OBJECTSTREAMEXCEPTION, JAVA_IO_PRINTSTREAM, JAVA_IO_RESOURCE_FREE_CLOSEABLES, JAVA_IO_SERIALIZABLE, JAVA_IO_WRAPPER_CLOSEABLES, JAVA_LANG, JAVA_LANG_ANNOTATION_ANNOTATION, JAVA_LANG_ANNOTATION_DOCUMENTED, JAVA_LANG_ANNOTATION_ELEMENTTYPE, JAVA_LANG_ANNOTATION_INHERITED, JAVA_LANG_ANNOTATION_REPEATABLE, JAVA_LANG_ANNOTATION_RETENTION, JAVA_LANG_ANNOTATION_RETENTIONPOLICY, JAVA_LANG_ANNOTATION_TARGET, JAVA_LANG_ASSERTIONERROR, JAVA_LANG_AUTOCLOSEABLE, JAVA_LANG_BOOLEAN, JAVA_LANG_BYTE, JAVA_LANG_CHARACTER, JAVA_LANG_CLASS, JAVA_LANG_CLASSNOTFOUNDEXCEPTION, JAVA_LANG_CLONEABLE, JAVA_LANG_DEPRECATED, JAVA_LANG_DOUBLE, JAVA_LANG_ENUM, JAVA_LANG_ERROR, JAVA_LANG_EXCEPTION, JAVA_LANG_FLOAT, JAVA_LANG_FUNCTIONAL_INTERFACE, JAVA_LANG_ILLEGALARGUMENTEXCEPTION, JAVA_LANG_INTEGER, JAVA_LANG_INVOKE_LAMBDAMETAFACTORY, JAVA_LANG_INVOKE_METHODHANDLE_$_POLYMORPHICSIGNATURE, JAVA_LANG_INVOKE_METHODHANDLE_POLYMORPHICSIGNATURE, JAVA_LANG_INVOKE_METHODHANDLES, JAVA_LANG_INVOKE_SERIALIZEDLAMBDA, JAVA_LANG_ITERABLE, JAVA_LANG_LONG, JAVA_LANG_NOCLASSDEFERROR, JAVA_LANG_OBJECT, JAVA_LANG_OVERRIDE, JAVA_LANG_REFLECT_CONSTRUCTOR, JAVA_LANG_REFLECT_FIELD, JAVA_LANG_REFLECT_METHOD, JAVA_LANG_RUNTIMEEXCEPTION, JAVA_LANG_SAFEVARARGS, JAVA_LANG_SHORT, JAVA_LANG_STRING, JAVA_LANG_STRINGBUFFER, JAVA_LANG_STRINGBUILDER, JAVA_LANG_SUPPRESSWARNINGS, JAVA_LANG_SYSTEM, JAVA_LANG_THROWABLE, JAVA_LANG_VOID, JAVA_NIO_FILE_FILES, JAVA_UTIL_COLLECTION, JAVA_UTIL_ITERATOR, JAVA_UTIL_OBJECTS, JAVA_UTIL_ZIP_WRAPPER_CLOSEABLES, JAVAX, JAVAX_ANNOTATION_INJECT_INJECT, JAVAX_RMI_CORBA_STUB, JDT, JUNIT, JUNIT_FRAMEWORK_ASSERT, LAMBDA_TYPE, LANG, LANG3, LENGTH, LONG, LOOKUP, MAIN, MISMATCH, NOT_NULL, NULL, OBJECT, OK, OPTIONAL, ORG, ORG_APACHE_COMMONS_LANG_VALIDATE, ORG_APACHE_COMMONS_LANG3_VALIDATE, ORG_ECLIPSE_CORE_RUNTIME_ASSERT, ORG_ECLIPSE_JDT_CORE_DOM_ITYPEBINDING, ORG_ECLIPSE_JDT_INTERNAL_COMPILER_LOOKUP_TYPEBINDING, ORG_JUNIT_ASSERT, OTHER_WRAPPER_CLOSEABLES, PACKAGE_INFO_NAME, READOBJECT, READRESOLVE, REFLECT, REQUIRE_NON_NULL, RESOURCE_FREE_CLOSEABLE_STREAM, RUNTIME, SERIALPERSISTENTFIELDS, SERIALVERSIONUID, SHORT, SYNTHETIC_ACCESS_METHOD_PREFIX, SYNTHETIC_ASSERT_DISABLED, SYNTHETIC_CLASS, SYNTHETIC_ENCLOSING_INSTANCE_PREFIX, SYNTHETIC_ENUM_CONSTANT_INITIALIZATION_METHOD_PREFIX, SYNTHETIC_ENUM_VALUES, SYNTHETIC_OUTER_LOCAL_PREFIX, SYNTHETIC_STATIC_FACTORY, SYNTHETIC_SWITCH_ENUM_TABLE, TYPE, TYPE_PARAMETER_TARGET, TYPE_USE_TARGET, TYPEBINDING, UNCHECKED, UPPER_ANNOTATION_TYPE, UPPER_CLASS, UPPER_CONSTRUCTOR, UPPER_FIELD, UPPER_LOCAL_VARIABLE, UPPER_METHOD, UPPER_PACKAGE, UPPER_PARAMETER, UPPER_RUNTIME, UPPER_SOURCE, UTIL, VALIDATE_CLASS, VALUE, VALUEOF, VALUES, VOID, WILDCARD_CAPTURE, WILDCARD_CAPTURE_NAME_PREFIX, WILDCARD_CAPTURE_NAME_SUFFIX, WILDCARD_EXTENDS, WILDCARD_MINUS, WILDCARD_NAME, WILDCARD_PLUS, WILDCARD_STAR, WILDCARD_SUPER, WRITEOBJECT, WRITEREPLACE, ZIP
 
Fields inherited from interface org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeIds
BitAutoCloseable, BitCloseable, BitResourceFreeCloseable, BitUninitialized, BitUninternedType, BitWrapperCloseable, Boolean2Boolean, Boolean2Int, Boolean2String, BOXING, Byte2Byte, Byte2Char, Byte2Double, Byte2Float, Byte2Int, Byte2Long, Byte2Short, Byte2String, Char2Byte, Char2Char, Char2Double, Char2Float, Char2Int, Char2Long, Char2Short, Char2String, COMPILE_TYPE_MASK, Double2Byte, Double2Char, Double2Double, Double2Float, Double2Int, Double2Long, Double2Short, Double2String, Float2Byte, Float2Char, Float2Double, Float2Float, Float2Int, Float2Long, Float2Short, Float2String, IMPLICIT_CONVERSION_MASK, InheritableBits, Int2Byte, Int2Char, Int2Double, Int2Float, Int2Int, Int2Long, Int2Short, Int2String, Long2Byte, Long2Char, Long2Double, Long2Float, Long2Int, Long2Long, Long2Short, Long2String, NoId, Null2Null, Null2String, Object2boolean, Object2byte, Object2char, Object2double, Object2float, Object2int, Object2long, Object2Object, Object2short, Object2String, Short2Byte, Short2Char, Short2Double, Short2Float, Short2Int, Short2Long, Short2Short, Short2String, String2String, T_boolean, T_byte, T_char, T_ComGoogleCommonBasePreconditions, T_ComGoogleInjectInject, T_ConfiguredAnnotationNonNull, T_ConfiguredAnnotationNonNullByDefault, T_ConfiguredAnnotationNullable, T_double, T_float, T_int, T_JavaIoException, T_JavaIoExternalizable, T_JavaIoObjectStreamException, T_JavaIoPrintStream, T_JavaIoSerializable, T_JavaLangAnnotationAnnotation, T_JavaLangAnnotationDocumented, T_JavaLangAnnotationElementType, T_JavaLangAnnotationInherited, T_JavaLangAnnotationRepeatable, T_JavaLangAnnotationRetention, T_JavaLangAnnotationRetentionPolicy, T_JavaLangAnnotationTarget, T_JavaLangAssertionError, T_JavaLangAutoCloseable, T_JavaLangBoolean, T_JavaLangByte, T_JavaLangCharacter, T_JavaLangClass, T_JavaLangClassNotFoundException, T_JavaLangCloneable, T_JavaLangDeprecated, T_JavaLangDouble, T_JavaLangEnum, T_JavaLangError, T_JavaLangException, T_JavaLangFloat, T_JavaLangFunctionalInterface, T_JavaLangIllegalArgumentException, T_JavaLangInteger, T_JavaLangInvokeMethodHandlePolymorphicSignature, T_JavaLangIterable, T_JavaLangLong, T_JavaLangNoClassDefError, T_JavaLangObject, T_JavaLangOverride, T_JavaLangReflectConstructor, T_JavaLangReflectField, T_JavaLangReflectMethod, T_JavaLangRuntimeException, T_JavaLangSafeVarargs, T_JavaLangShort, T_JavaLangString, T_JavaLangStringBuffer, T_JavaLangStringBuilder, T_JavaLangSuppressWarnings, T_JavaLangSystem, T_JavaLangThrowable, T_JavaLangVoid, T_JavaUtilCollection, T_JavaUtilIterator, T_JavaUtilObjects, T_JavaxInjectInject, T_JunitFrameworkAssert, T_LastWellKnownTypeId, T_long, T_null, T_OrgApacheCommonsLang3Validate, T_OrgApacheCommonsLangValidate, T_OrgEclipseCoreRuntimeAssert, T_OrgJunitAssert, T_short, T_undefined, T_void, UNBOXING
 
Constructor Summary
FakedTrackingVariable(LocalVariableBinding original, ASTNode location, FlowInfo flowInfo, FlowContext flowContext, int nullStatus)
           
 
Method Summary
static void analyseCloseableAllocation(BlockScope scope, FlowInfo flowInfo, AllocationExpression allocation)
          Compute/assign a tracking variable for a freshly allocated closeable value, using information from our white lists.
static void cleanUpAfterAssignment(BlockScope currentScope, int lhsBits, Expression expression)
           
 int findMostSpecificStatus(FlowInfo flowInfo, BlockScope currentScope, BlockScope locationScope)
           
 void generateCode(BlockScope currentScope, CodeStream codeStream)
          Code generation for a local declaration: i.e. normal assignment to a local variable + unused variable handling
static FakedTrackingVariable getCloseTrackingVariable(Expression expression, FlowInfo flowInfo, FlowContext flowContext)
          If expression resolves to a value of type AutoCloseable answer the variable that tracks closing of that local.
static void handleResourceAssignment(BlockScope scope, FlowInfo upstreamInfo, FlowInfo flowInfo, FlowContext flowContext, ASTNode location, Expression rhs, LocalVariableBinding local)
          Given the rhs of an assignment or local declaration has a (Auto)Closeable type (or null), setup for leak analysis now: Create or re-use a tracking variable, and wire and initialize everything.
 boolean hasDefinitelyNoResource(FlowInfo flowInfo)
          Answer true if we know for sure that no resource is bound to this variable at the point of 'flowInfo'.
static boolean isAnyCloseable(TypeBinding typeBinding)
          Answer wither the given type binding is a subtype of java.lang.AutoCloseable.
 boolean isClosedInFinallyOfEnclosing(BlockScope scope)
           
 boolean isResourceBeingReturned(FakedTrackingVariable returnedResource)
          If current is the same as 'returnedResource' or a wrapper thereof, mark as reported and return true, otherwise false.
 void markClose(FlowInfo flowInfo, FlowContext flowContext)
          Mark that this resource is closed locally.
 void markClosedInNestedMethod()
          Mark that this resource is closed from a nested method (inside a local class).
static FlowInfo markPassedToOutside(BlockScope scope, Expression expression, FlowInfo flowInfo, FlowContext flowContext, boolean owned)
          Mark that this resource is passed to some outside code (as argument to a method/ctor call or as a return value from the current method), and thus should be considered as potentially closed.
 int mergeCloseStatus(BlockScope currentScope, int status, LocalVariableBinding local, BlockScope outerScope)
           
 java.lang.String nameForReporting(ASTNode location, ReferenceContext referenceContext)
           
static FakedTrackingVariable pickVarForReporting(java.util.Set varsOfScope, BlockScope scope, boolean atExit)
          Pick tracking variables from 'varsOfScope' to establish a proper order of processing: As much as possible pick wrapper resources before their inner resources.
static void preConnectTrackerAcrossAssignment(ASTNode location, LocalVariableBinding local, Expression rhs, FlowInfo flowInfo)
          Before analyzing an assignment of this shape: singleName = new Allocation() connect any tracking variable of the LHS with the allocation on the RHS.
 void recordErrorLocation(ASTNode location, int nullStatus)
           
 int reportError(ProblemReporter problemReporter, ASTNode location, int nullStatus)
           
 void reportExplicitClosing(ProblemReporter problemReporter)
           
 boolean reportRecordedErrors(Scope scope, int mergedStatus)
           
 void resetReportingBits()
           
 void resolve(BlockScope scope)
           
 
Methods inherited from class org.aspectj.org.eclipse.jdt.internal.compiler.ast.LocalDeclaration
analyseCode, checkModifiers, getAllAnnotationContexts, getAllAnnotationContexts, getKind, isArgument, isReceiver, traverse
 
Methods inherited from class org.aspectj.org.eclipse.jdt.internal.compiler.ast.AbstractVariableDeclaration
freshInferenceContext, genericTypeArguments, isSuperAccess, isTypeAccess, printAsExpression, printStatement, setActualReceiverType, setDepth, setFieldIndex
 
Methods inherited from class org.aspectj.org.eclipse.jdt.internal.compiler.ast.Statement
analyseArguments, branchChainTo, checkAgainstNullTypeAnnotation, complainIfUnreachable, expectedType, findConstructorBinding, generateArguments, getExpressionContext, invocationTargetType, isBoxingCompatible, isEmptyBlock, isKnowDeadCodePattern, isValidJavaStatement, print, recordExceptionsForEnclosingLambda, resolveCase
 
Methods inherited from class org.aspectj.org.eclipse.jdt.internal.compiler.ast.ASTNode
checkInvocationArguments, concreteStatement, copySE8AnnotationsToType, isFieldUseDeprecated, isImplicitThis, isMethodUseDeprecated, isSuper, isThis, isTypeUseDeprecated, isUnqualifiedSuper, printAnnotations, printIndent, printModifiers, receiverIsImplicitThis, resolveAnnotations, resolveAnnotations, resolveAnnotations, resolveDeprecatedAnnotations, resolvePolyExpressionArguments, resolvePolyExpressionArguments, sourceEnd, sourceStart, toString
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 
Methods inherited from interface org.aspectj.org.eclipse.jdt.internal.compiler.lookup.InvocationSite
getExpressionContext, invocationTargetType, receiverIsImplicitThis, sourceEnd, sourceStart
 

Field Detail

TEST_372319

public static boolean TEST_372319

originalBinding

public LocalVariableBinding originalBinding

innerTracker

public FakedTrackingVariable innerTracker

outerTracker

public FakedTrackingVariable outerTracker
Constructor Detail

FakedTrackingVariable

public FakedTrackingVariable(LocalVariableBinding original,
                             ASTNode location,
                             FlowInfo flowInfo,
                             FlowContext flowContext,
                             int nullStatus)
Method Detail

generateCode

public void generateCode(BlockScope currentScope,
                         CodeStream codeStream)
Description copied from class: LocalDeclaration
Code generation for a local declaration: i.e. normal assignment to a local variable + unused variable handling

Overrides:
generateCode in class LocalDeclaration

resolve

public void resolve(BlockScope scope)
Overrides:
resolve in class LocalDeclaration

getCloseTrackingVariable

public static FakedTrackingVariable getCloseTrackingVariable(Expression expression,
                                                             FlowInfo flowInfo,
                                                             FlowContext flowContext)
If expression resolves to a value of type AutoCloseable answer the variable that tracks closing of that local. Covers two cases:

Parameters:
expression -
Returns:
a new FakedTrackingVariable or null.

preConnectTrackerAcrossAssignment

public static void preConnectTrackerAcrossAssignment(ASTNode location,
                                                     LocalVariableBinding local,
                                                     Expression rhs,
                                                     FlowInfo flowInfo)
Before analyzing an assignment of this shape: singleName = new Allocation() connect any tracking variable of the LHS with the allocation on the RHS. Also the assignment is temporarily stored in the tracking variable in case we need to report errors because the assignment leaves the old LHS value unclosed. In this case the assignment should be used as the error location.

Parameters:
location - the assignment/local declaration being analyzed
local - the local variable being assigned to
rhs - the rhs of the assignment resp. the initialization of the local variable declaration. Precondition: client has already checked that the resolved type of this expression is either a closeable type or NULL.

analyseCloseableAllocation

public static void analyseCloseableAllocation(BlockScope scope,
                                              FlowInfo flowInfo,
                                              AllocationExpression allocation)
Compute/assign a tracking variable for a freshly allocated closeable value, using information from our white lists. See Bug 358903 - Filter practically unimportant resource leak warnings


handleResourceAssignment

public static void handleResourceAssignment(BlockScope scope,
                                            FlowInfo upstreamInfo,
                                            FlowInfo flowInfo,
                                            FlowContext flowContext,
                                            ASTNode location,
                                            Expression rhs,
                                            LocalVariableBinding local)
Given the rhs of an assignment or local declaration has a (Auto)Closeable type (or null), setup for leak analysis now: Create or re-use a tracking variable, and wire and initialize everything.

Parameters:
scope - scope containing the assignment
upstreamInfo - info without analysis of the rhs, use this to determine the status of a resource being disconnected
flowInfo - info with analysis of the rhs, use this for recording resource status because this will be passed downstream
flowContext -
location - where to report warnigs/errors against
rhs - the right hand side of the assignment, this expression is to be analyzed. The caller has already checked that the rhs is either of a closeable type or null.
local - the local variable into which the rhs is being assigned

cleanUpAfterAssignment

public static void cleanUpAfterAssignment(BlockScope currentScope,
                                          int lhsBits,
                                          Expression expression)

isAnyCloseable

public static boolean isAnyCloseable(TypeBinding typeBinding)
Answer wither the given type binding is a subtype of java.lang.AutoCloseable.


findMostSpecificStatus

public int findMostSpecificStatus(FlowInfo flowInfo,
                                  BlockScope currentScope,
                                  BlockScope locationScope)

mergeCloseStatus

public int mergeCloseStatus(BlockScope currentScope,
                            int status,
                            LocalVariableBinding local,
                            BlockScope outerScope)

markClose

public void markClose(FlowInfo flowInfo,
                      FlowContext flowContext)
Mark that this resource is closed locally.


markClosedInNestedMethod

public void markClosedInNestedMethod()
Mark that this resource is closed from a nested method (inside a local class).


markPassedToOutside

public static FlowInfo markPassedToOutside(BlockScope scope,
                                           Expression expression,
                                           FlowInfo flowInfo,
                                           FlowContext flowContext,
                                           boolean owned)
Mark that this resource is passed to some outside code (as argument to a method/ctor call or as a return value from the current method), and thus should be considered as potentially closed.

Parameters:
owned - should the resource be considered owned by some outside?

pickVarForReporting

public static FakedTrackingVariable pickVarForReporting(java.util.Set varsOfScope,
                                                        BlockScope scope,
                                                        boolean atExit)
Pick tracking variables from 'varsOfScope' to establish a proper order of processing: As much as possible pick wrapper resources before their inner resources. Also consider cases of wrappers and their inners being declared at different scopes.


hasDefinitelyNoResource

public boolean hasDefinitelyNoResource(FlowInfo flowInfo)
Answer true if we know for sure that no resource is bound to this variable at the point of 'flowInfo'.


isClosedInFinallyOfEnclosing

public boolean isClosedInFinallyOfEnclosing(BlockScope scope)

isResourceBeingReturned

public boolean isResourceBeingReturned(FakedTrackingVariable returnedResource)
If current is the same as 'returnedResource' or a wrapper thereof, mark as reported and return true, otherwise false.


recordErrorLocation

public void recordErrorLocation(ASTNode location,
                                int nullStatus)

reportRecordedErrors

public boolean reportRecordedErrors(Scope scope,
                                    int mergedStatus)

reportError

public int reportError(ProblemReporter problemReporter,
                       ASTNode location,
                       int nullStatus)

reportExplicitClosing

public void reportExplicitClosing(ProblemReporter problemReporter)

resetReportingBits

public void resetReportingBits()

nameForReporting

public java.lang.String nameForReporting(ASTNode location,
                                         ReferenceContext referenceContext)