build up constraint sets

This commit is contained in:
Douglas Creager 2025-11-19 17:56:23 -05:00
parent 83466ed774
commit dc802d31f2
1 changed files with 28 additions and 0 deletions

View File

@ -1330,6 +1330,7 @@ pub(crate) struct SpecializationBuilder<'db> {
db: &'db dyn Db,
inferable: InferableTypeVars<'db, 'db>,
types: FxHashMap<BoundTypeVarIdentity<'db>, Type<'db>>,
constraints: ConstraintSet<'db>,
}
/// An assignment from a bound type variable to a given type, along with the variance of the outermost
@ -1342,6 +1343,7 @@ impl<'db> SpecializationBuilder<'db> {
db,
inferable,
types: FxHashMap::default(),
constraints: ConstraintSet::from(true),
}
}
@ -1385,6 +1387,32 @@ impl<'db> SpecializationBuilder<'db> {
return;
};
let constraint = match variance {
TypeVarVariance::Covariant => ConstraintSet::constrain_typevar(
self.db,
bound_typevar,
Type::Never,
ty,
TypeRelation::Assignability,
),
TypeVarVariance::Contravariant => ConstraintSet::constrain_typevar(
self.db,
bound_typevar,
ty,
Type::object(),
TypeRelation::Assignability,
),
TypeVarVariance::Invariant => ConstraintSet::constrain_typevar(
self.db,
bound_typevar,
ty,
ty,
TypeRelation::Assignability,
),
TypeVarVariance::Bivariant => ConstraintSet::from(true),
};
self.constraints.intersect(self.db, constraint);
match self.types.entry(identity) {
Entry::Occupied(mut entry) => {
*entry.get_mut() = UnionType::from_elements(self.db, [*entry.get(), ty]);