use super::{builder::ClauseBuilder, generalize};
use crate::RustIrDatabase;
use chalk_ir::{cast::Cast, interner::Interner, Ty, TyKind, WhereClause};
pub(super) fn build_dyn_self_ty_clauses<I: Interner>(
db: &dyn RustIrDatabase<I>,
builder: &mut ClauseBuilder<'_, I>,
self_ty: Ty<I>,
) {
let interner = db.interner();
let dyn_ty = match self_ty.kind(interner) {
TyKind::Dyn(dyn_ty) => dyn_ty.clone(),
_ => return,
};
let generalized_dyn_ty = generalize::Generalize::apply(db.interner(), dyn_ty);
builder.push_binders(generalized_dyn_ty, |builder, dyn_ty| {
for exists_qwc in dyn_ty.bounds.map_ref(|r| r.iter(interner)) {
let qwc = exists_qwc
.cloned()
.substitute(interner, &[self_ty.clone().cast(interner)]);
builder.push_binders(qwc, |builder, bound| match &bound {
WhereClause::Implemented(trait_ref) => {
super::super_traits::push_trait_super_clauses(
builder.db,
builder,
trait_ref.clone(),
)
}
WhereClause::AliasEq(_) => builder.push_fact(bound),
WhereClause::LifetimeOutlives(..) => {}
WhereClause::TypeOutlives(..) => {}
});
}
});
}