Function chalk_solve::clauses::dyn_ty::build_dyn_self_ty_clauses
source ยท pub(super) fn build_dyn_self_ty_clauses<I: Interner>(
db: &dyn RustIrDatabase<I>,
builder: &mut ClauseBuilder<'_, I>,
self_ty: Ty<I>,
)Expand description
If the self type S of an Implemented goal is a dyn trait type, we wish
to generate program-clauses that indicates that it implements its own
traits. For example, a dyn Write type implements Write and so on.
To see how this works, consider as an example the type dyn Fn(&u8). This
is really shorthand for dyn for<'a> Fn<(&'a u8), Output = ()>, and we
represent that type as something like this:
โ
dyn(exists<T> {
forall<'a> { Implemented(T: Fn<'a>) },
forall<'a> { AliasEq(<T as Fn<'a>>::Output, ()) },
})so what we will do is to generate one program clause for each of the conditions. Thus we get two program clauses:
โ
forall<'a> { Implemented(dyn Fn(&u8): Fn<(&'a u8)>) }and
โ
forall<'a> { AliasEq(<dyn Fn(&u8) as Fn<'a>>::Output, ()) },