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);
 

 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).
  • Constructor Details

  • Method Details

    • getKeyForMaps

      public Set<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(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 interface AbstractValue<KeyForValue>
      Overrides:
      leastUpperBound in class CFAbstractValue<KeyForValue>
    • mostSpecific

      public KeyForValue mostSpecific(KeyForValue other, KeyForValue backup)
      Description copied from class: CFAbstractValue
      Returns the more specific version of two values this and other. If they do not contain information for all hierarchies, then it is possible that information from both this and other 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.isSubtype(AnnotationMirror, AnnotationMirror), then the respective value from backup is used.

      Overrides:
      mostSpecific in class CFAbstractValue<KeyForValue>