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