// Bounds in the type_params and lifetimes fields are repeated in the
// predicates field (see rustc_typeck::collect::ty_generics), so remove
// them.
- let stripped_typarams = gens
+ let stripped_params = gens
.params
.iter()
.filter_map(|param| match param.kind {
- ty::GenericParamDefKind::Lifetime => None,
+ ty::GenericParamDefKind::Lifetime => Some(param.clean(cx)),
ty::GenericParamDefKind::Type { synthetic, .. } => {
if param.name == kw::SelfUpper {
assert_eq!(param.index, 0);
}
Some(param.clean(cx))
}
- ty::GenericParamDefKind::Const { .. } => None,
+ ty::GenericParamDefKind::Const { .. } => Some(param.clean(cx)),
})
.collect::<Vec<GenericParamDef>>();
// Run through the type parameters again and insert a ?Sized
// unbound for any we didn't find to be Sized.
- for tp in &stripped_typarams {
- if !sized_params.contains(&tp.name) {
+ for tp in &stripped_params {
+ if matches!(tp.kind, types::GenericParamDefKind::Type { .. })
+ && !sized_params.contains(&tp.name)
+ {
where_predicates.push(WP::BoundPredicate {
ty: Type::Generic(tp.name.clone()),
bounds: vec![GenericBound::maybe_sized(cx)],
// and instead see `where T: Foo + Bar + Sized + 'a`
Generics {
- params: gens
- .params
- .iter()
- .flat_map(|param| match param.kind {
- ty::GenericParamDefKind::Lifetime => Some(param.clean(cx)),
- ty::GenericParamDefKind::Type { .. } => None,
- ty::GenericParamDefKind::Const { .. } => Some(param.clean(cx)),
- })
- .chain(simplify::ty_params(stripped_typarams).into_iter())
- .collect(),
+ params: stripped_params,
where_predicates: simplify::where_clauses(cx, where_predicates),
}
}
//! bounds by special casing scenarios such as these. Fun!
use std::collections::BTreeMap;
-use std::mem;
use rustc_hir::def_id::DefId;
use rustc_middle::ty;
})
}
-pub fn ty_params(mut params: Vec<clean::GenericParamDef>) -> Vec<clean::GenericParamDef> {
- for param in &mut params {
- match param.kind {
- clean::GenericParamDefKind::Type { ref mut bounds, .. } => {
- *bounds = mem::take(bounds);
- }
- _ => panic!("expected only type parameters"),
- }
- }
- params
-}
-
fn trait_is_same_or_supertrait(cx: &DocContext<'_>, child: DefId, trait_: DefId) -> bool {
if child == trait_ {
return true;
}
// @has foo/struct.VSet.html '//pre[@class="rust struct"]' 'pub struct VSet<T, const ORDER: Order>'
-// @has foo/struct.VSet.html '//h3[@id="impl-Send"]/code' 'impl<const ORDER: Order, T> Send for VSet<T, ORDER>'
-// @has foo/struct.VSet.html '//h3[@id="impl-Sync"]/code' 'impl<const ORDER: Order, T> Sync for VSet<T, ORDER>'
+// @has foo/struct.VSet.html '//h3[@id="impl-Send"]/code' 'impl<T, const ORDER: Order> Send for VSet<T, ORDER>'
+// @has foo/struct.VSet.html '//h3[@id="impl-Sync"]/code' 'impl<T, const ORDER: Order> Sync for VSet<T, ORDER>'
pub struct VSet<T, const ORDER: Order> {
inner: Vec<T>,
}