Class KeyForValue
- java.lang.Object
-
- org.checkerframework.framework.flow.CFAbstractValue<KeyForValue>
-
- org.checkerframework.checker.nullness.KeyForValue
-
- All Implemented Interfaces:
AbstractValue<KeyForValue>
public class KeyForValue extends CFAbstractValue<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);
Inside the if statement,Map<T, Object> map = ...; <T> T method(T param) { if (map.contains(param)) { @NonNull Object o = map.get(param); return param; } }
param
is a key for "map". This would normally be represented as@KeyFor("map") T
, but this is not a subtype ofT
, so the type cannot be refined. Instead, the value forparam
includes "map" in the list of keyForMaps. This information is used inKeyForAnnotatedTypeFactory.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, underlyingType
-
-
Constructor Summary
Constructors Constructor Description KeyForValue(CFAbstractAnalysis<KeyForValue,?,?> analysis, AnnotationMirrorSet annotations, javax.lang.model.type.TypeMirror underlyingType)
Create a KeyForValue.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description @Nullable java.util.Set<java.lang.String>
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.KeyForValue
leastUpperBound(@Nullable KeyForValue other)
Compute the least upper bound of two values.@Nullable KeyForValue
mostSpecific(@Nullable KeyForValue other, @Nullable KeyForValue backup)
Returns the more specific of two valuesthis
andother
.-
Methods inherited from class org.checkerframework.framework.flow.CFAbstractValue
canBeMissingAnnotations, equals, getAnnotations, getUnderlyingType, greatestLowerBound, hashCode, toString, toStringFullyQualified, toStringSimple, validateSet, widenUpperBound
-
-
-
-
Constructor Detail
-
KeyForValue
public KeyForValue(CFAbstractAnalysis<KeyForValue,?,?> analysis, AnnotationMirrorSet annotations, javax.lang.model.type.TypeMirror underlyingType)
Create a KeyForValue.- Parameters:
analysis
- the analysisannotations
- the annotationsunderlyingType
- the underlying type
-
-
Method Detail
-
getKeyForMaps
public @Nullable java.util.Set<java.lang.String> 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.
-
leastUpperBound
public KeyForValue leastUpperBound(@Nullable KeyForValue other)
Description copied from interface:AbstractValue
Compute the least upper bound of two values.Important: This method must fulfill the following contract:
- Does not change
this
. - Does not change
other
. - Returns a fresh object which is not aliased yet.
- Returns an object of the same (dynamic) type as
this
, even if the signature is more permissive. - Is commutative.
- Specified by:
leastUpperBound
in interfaceAbstractValue<KeyForValue>
- Overrides:
leastUpperBound
in classCFAbstractValue<KeyForValue>
- Does not change
-
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
-
-