Class KeyForValue
java.lang.Object
org.checkerframework.framework.flow.CFAbstractValue<KeyForValue>
org.checkerframework.checker.nullness.KeyForValue
- All Implemented Interfaces:
AbstractValue<KeyForValue>
KeyForValue holds additional information about which maps this value is a key for. This extra
information is required when adding the @KeyFor qualifier to the type is not a refinement of the
type. For example,
@NonNull Object o = map.get(param);
Map<T, Object> map = ...;
<T> T method(T param) {
if (map.contains(param)) {
@NonNull Object o = map.get(param);
return param;
}
}
Inside the if statement, param
is a key for "map". This would normally be represented as
@KeyFor("map") T
, but this is not a subtype of T
, so the type cannot be refined.
Instead, the value for param
includes "map" in the list of keyForMaps. This information
is used in KeyForAnnotatedTypeFactory.isKeyForMap(String, ExpressionTree)
.-
Nested Class Summary
Nested classes/interfaces inherited from class org.checkerframework.framework.flow.CFAbstractValue
CFAbstractValue.AnnotationSetCombiner, CFAbstractValue.ValueGlb, CFAbstractValue.ValueLub
-
Field Summary
Fields inherited from class org.checkerframework.framework.flow.CFAbstractValue
analysis, annotations, atypeFactory, qualHierarchy, underlyingType
-
Constructor Summary
ConstructorDescriptionKeyForValue
(CFAbstractAnalysis<KeyForValue, ?, ?> analysis, AnnotationMirrorSet annotations, TypeMirror underlyingType) Create a KeyForValue. -
Method Summary
Modifier and TypeMethodDescriptionIf the underlying type is a type variable or a wildcard, then this is a set of maps for which this value is a key.mostSpecific
(@Nullable KeyForValue other, @Nullable KeyForValue backup) Returns the more specific of two valuesthis
andother
.protected KeyForValue
upperBound
(@Nullable KeyForValue other, TypeMirror upperBoundTypeMirror, boolean shouldWiden) Returns an upper bound ofthis
andother
.Methods inherited from class org.checkerframework.framework.flow.CFAbstractValue
canBeMissingAnnotations, equals, getAnnotations, getUnderlyingType, greatestLowerBound, hashCode, leastUpperBound, leastUpperBound, toString, toStringFullyQualified, toStringSimple, validateSet, widenUpperBound
-
Constructor Details
-
KeyForValue
public KeyForValue(CFAbstractAnalysis<KeyForValue, ?, ?> analysis, AnnotationMirrorSet annotations, TypeMirror underlyingType) Create a KeyForValue.- Parameters:
analysis
- the analysisannotations
- the annotationsunderlyingType
- the underlying type
-
-
Method Details
-
getKeyForMaps
If the underlying type is a type variable or a wildcard, then this is a set of maps for which this value is a key. Otherwise, it's null. -
upperBound
protected KeyForValue upperBound(@Nullable KeyForValue other, TypeMirror upperBoundTypeMirror, boolean shouldWiden) Description copied from class:CFAbstractValue
Returns an upper bound ofthis
andother
. The underlying type of the value returned isupperBoundTypeMirror
. IfshouldWiden
is false, this method returns the least upper bound ofthis
andother
.This is the implementation of
CFAbstractValue.leastUpperBound(CFAbstractValue, TypeMirror)
,CFAbstractValue.leastUpperBound(CFAbstractValue)
,CFAbstractValue.widenUpperBound(CFAbstractValue)
, andCFAbstractValue.upperBound(CFAbstractValue, boolean)
. Subclasses may override it.- Overrides:
upperBound
in classCFAbstractValue<KeyForValue>
- Parameters:
other
- an abstract valueupperBoundTypeMirror
- the underlying type of the returned valueshouldWiden
- true if the method should perform widening- Returns:
- an upper bound of this and
other
-
mostSpecific
public @Nullable KeyForValue mostSpecific(@Nullable KeyForValue other, @Nullable KeyForValue backup) Description copied from class:CFAbstractValue
Returns the more specific of two valuesthis
andother
. If they do not contain information for all hierarchies, then it is possible that information from boththis
andother
are taken.If neither of the two is more specific for one of the hierarchies (i.e., if the two are incomparable as determined by
QualifierHierarchy.isSubtypeShallow(AnnotationMirror, TypeMirror, AnnotationMirror, TypeMirror)
, then the respective value frombackup
is used.- Overrides:
mostSpecific
in classCFAbstractValue<KeyForValue>
- Parameters:
other
- the other value to obtain information frombackup
- the value to use ifthis
andother
are incomparable- Returns:
- the more specific of two values
this
andother
-