blob: 05ff1d58fa6835c47e4e825a13532db6a23adbc1 [file] [log] [blame]
package org.checkerframework.framework.util.typeinference.solver;
import java.util.LinkedHashMap;
import java.util.Map;
import javax.lang.model.element.AnnotationMirror;
import javax.lang.model.type.TypeVariable;
import org.checkerframework.framework.type.AnnotatedTypeMirror;
import org.checkerframework.framework.util.AnnotationMirrorMap;
import org.checkerframework.framework.util.AnnotationMirrorSet;
/**
* TargetConstraints represents the set of all TUConstraints for which target was the type
* parameter, i.e. the T in the TUConstraint. Unlike AF/TU Constraints, this class holds multiple
* constraints and is mutated during solving (where the TU/AF Constraints are immutable).
*
* @see org.checkerframework.framework.util.typeinference.solver.ConstraintMap
*/
public class TargetConstraints {
/**
* The type parameter for which we are inferring a type argument. All constraints in this object
* are related to this target.
*/
public final TypeVariable target;
public final Equalities equalities;
/**
* The target is the supertype in this case, that these are supertype constraints in which target
* is the supertype. These are NOT supertypes of the target.
*/
public final Supertypes supertypes;
/**
* The target is the supertype in this case, that these are subtype constraints in which target is
* the subtype. These are NOT subtypes of the target.
*/
public final Subtypes subtypes;
public TargetConstraints(final TypeVariable target) {
this.target = target;
this.equalities = new Equalities();
this.supertypes = new Supertypes();
this.subtypes = new Subtypes();
}
protected static class Equalities {
// Map( hierarchy top -> exact annotation in hierarchy)
public AnnotationMirrorMap<AnnotationMirror> primaries = new AnnotationMirrorMap<>();
// Map( type -> hierarchy top for which the primary annotation of type is equal to the
// primary annotation of the target)
// note all components and underlying types are EXACTLY equal to the key to this map
public final Map<AnnotatedTypeMirror, AnnotationMirrorSet> types = new LinkedHashMap<>();
// Map( type -> hierarchy top for which the primary annotation of target is equal to the
// primary annotaiton of the target)
// note all components and underlying types are EXACTLY equal to the key to this map
public final Map<TypeVariable, AnnotationMirrorSet> targets = new LinkedHashMap<>();
public void clear() {
primaries.clear();
types.clear();
targets.clear();
}
}
// remember these are constraint in which target is the supertype
protected static class Supertypes {
// Map( hierarchy top -> annotations that are subtypes to target in hierarchy)
public AnnotationMirrorMap<AnnotationMirrorSet> primaries = new AnnotationMirrorMap<>();
// Map( type -> hierarchy tops for which the primary annotations of type are subtypes of the
// primary annotations of the target)
// note all components and underlying types must uphold the supertype relationship in all
// hierarchies
public final Map<AnnotatedTypeMirror, AnnotationMirrorSet> types = new LinkedHashMap<>();
// Map( otherTarget -> hierarchy tops for which the primary annotations of otherTarget are
// subtypes of the primary annotations of the target)
// note all components and underlying types must uphold the subtype relationship in all
// hierarchies
public final Map<TypeVariable, AnnotationMirrorSet> targets = new LinkedHashMap<>();
public void clear() {
primaries.clear();
types.clear();
targets.clear();
}
}
// remember these are constraint in which target is the subtype
protected static class Subtypes {
// Map( hierarchy top -> annotations that are supertypes to target in hierarchy)
public AnnotationMirrorMap<AnnotationMirrorSet> primaries = new AnnotationMirrorMap<>();
// Map( type -> hierarchy tops for which the primary annotations of type are supertypes of
// the primary annotations of the target)
// note all components and underlying types must uphold the supertype relationship in all
// hierarchies
public final Map<AnnotatedTypeMirror, AnnotationMirrorSet> types = new LinkedHashMap<>();
// Map( otherTarget -> hierarchy tops for which the primary annotations of otherTarget are
// supertypes of the primary annotations of the target)
// note all components and underlying types must uphold the subtype relationship in all
// hierarchies
public final Map<TypeVariable, AnnotationMirrorSet> targets = new LinkedHashMap<>();
public void clear() {
primaries.clear();
types.clear();
targets.clear();
}
}
}