The following code:
impl<R, K, T: LikeOne> Of<T> for (K, R, i32)
where K: LikeTwo {
}
contains ImplHeader:
ImplHeader {
impl_def_id: DefId(0:8 ~ marker_with_items[5448]::{impl#1}),
impl_args: [
?0t,
?1t,
?2t,
],
self_ty: (?0t, ?1t, i32),
trait_ref: Some(
<(_, _, i32) as Of<_>>,
),
predicates: [
Binder { value: TraitPredicate(<_ as std::marker::Sized>, polarity:Positive), bound_vars: [] },
Binder { value: TraitPredicate(<_ as std::marker::Sized>, polarity:Positive), bound_vars: [] },
Binder { value: TraitPredicate(<_ as std::marker::Sized>, polarity:Positive), bound_vars: [] },
Binder { value: TraitPredicate(<_ as LikeOne>, polarity:Positive), bound_vars: [] },
Binder { value: TraitPredicate(<_ as LikeTwo>, polarity:Positive), bound_vars: [] },
],
}
but for further analysis I would like to get predicates bound to their generic types.
In the end I would like to get 2 lists for trait
and for self
. Each list contains a generic type and its predicates. The elements of the lists are arranged in the order in which the generic in the corresponding trait
and self
are arranged.
That is:
trait
: [(T, [LikeOne])]
self
: [(K, [LikeTwo]), (R, [])]
Or as in ImplHeader
:
[
(?2t, [
Binder { value: TraitPredicate(<_ as std::marker::Sized>, polarity:Positive), bound_vars: [] },
Binder { value: TraitPredicate(<_ as LikeOne>, polarity:Positive), bound_vars: [] },
])
],
[
(?0t, [
Binder { value: TraitPredicate(<_ as std::marker::Sized>, polarity:Positive), bound_vars: [] },
Binder { value: TraitPredicate(<_ as LikeTwo>>, polarity:Positive), bound_vars: [] },
]),
(?1t, [
Binder { value: TraitPredicate(<_ as std::marker::Sized>, polarity:Positive), bound_vars: [] }
])
]