1
Fork 0

Don't display full blanket implementation and put it into its own section

This commit is contained in:
Guillaume Gomez 2018-07-27 22:59:16 +02:00
parent ef7d6fcbd1
commit 7a3c7b2097
8 changed files with 59 additions and 24 deletions

View file

@ -198,7 +198,7 @@ impl<'a, 'tcx, 'rcx> AutoTraitFinder<'a, 'tcx, 'rcx> {
.collect(); .collect();
let ty = self.get_real_ty(def_id, def_ctor, &real_name, generics); let ty = self.get_real_ty(def_id, def_ctor, &real_name, generics);
let predicates = infcx.tcx.predicates_of(def_id); let predicates = infcx.tcx.predicates_of(impl_def_id);
traits.push(Item { traits.push(Item {
source: infcx.tcx.def_span(impl_def_id).clean(self.cx), source: infcx.tcx.def_span(impl_def_id).clean(self.cx),
@ -218,7 +218,9 @@ impl<'a, 'tcx, 'rcx> AutoTraitFinder<'a, 'tcx, 'rcx> {
.collect::<Vec<_>>() .collect::<Vec<_>>()
.clean(self.cx), .clean(self.cx),
polarity: None, polarity: None,
synthetic: true, synthetic: false,
blanket_impl: Some(infcx.tcx.type_of(impl_def_id)
.clean(self.cx)),
}), }),
}); });
debug!("{:?} => {}", trait_ref, may_apply); debug!("{:?} => {}", trait_ref, may_apply);
@ -345,6 +347,7 @@ impl<'a, 'tcx, 'rcx> AutoTraitFinder<'a, 'tcx, 'rcx> {
items: Vec::new(), items: Vec::new(),
polarity, polarity,
synthetic: true, synthetic: true,
blanket_impl: None,
}), }),
}); });
} }

View file

@ -414,6 +414,7 @@ pub fn build_impl(cx: &DocContext, did: DefId, ret: &mut Vec<clean::Item>) {
items: trait_items, items: trait_items,
polarity: Some(polarity.clean(cx)), polarity: Some(polarity.clean(cx)),
synthetic: false, synthetic: false,
blanket_impl: None,
}), }),
source: tcx.def_span(did).clean(cx), source: tcx.def_span(did).clean(cx),
name: None, name: None,

View file

@ -3881,6 +3881,7 @@ pub struct Impl {
pub items: Vec<Item>, pub items: Vec<Item>,
pub polarity: Option<ImplPolarity>, pub polarity: Option<ImplPolarity>,
pub synthetic: bool, pub synthetic: bool,
pub blanket_impl: Option<Type>,
} }
pub fn get_auto_traits_with_node_id(cx: &DocContext, id: ast::NodeId, name: String) -> Vec<Item> { pub fn get_auto_traits_with_node_id(cx: &DocContext, id: ast::NodeId, name: String) -> Vec<Item> {
@ -3948,6 +3949,7 @@ impl Clean<Vec<Item>> for doctree::Impl {
items, items,
polarity: Some(self.polarity.clean(cx)), polarity: Some(self.polarity.clean(cx)),
synthetic: false, synthetic: false,
blanket_impl: None,
}) })
}); });
ret ret

View file

@ -769,7 +769,11 @@ fn fmt_impl(i: &clean::Impl,
write!(f, " for ")?; write!(f, " for ")?;
} }
if let Some(ref ty) = i.blanket_impl {
fmt_type(ty, f, use_absolute)?;
} else {
fmt_type(&i.for_, f, use_absolute)?; fmt_type(&i.for_, f, use_absolute)?;
}
fmt::Display::fmt(&WhereClause { gens: &i.generics, indent: 0, end_newline: true }, f)?; fmt::Display::fmt(&WhereClause { gens: &i.generics, indent: 0, end_newline: true }, f)?;
Ok(()) Ok(())

View file

@ -177,7 +177,7 @@ pub enum ExternalLocation {
} }
/// Metadata about implementations for a type or trait. /// Metadata about implementations for a type or trait.
#[derive(Clone)] #[derive(Clone, Debug)]
pub struct Impl { pub struct Impl {
pub impl_item: clean::Item, pub impl_item: clean::Item,
} }
@ -2900,18 +2900,18 @@ fn item_trait(
render_assoc_items(w, cx, it, it.def_id, AssocItemRender::All)?; render_assoc_items(w, cx, it, it.def_id, AssocItemRender::All)?;
let cache = cache(); let cache = cache();
let impl_header = " let impl_header = "\
<h2 id='implementors' class='small-section-header'> <h2 id='implementors' class='small-section-header'>\
Implementors<a href='#implementors' class='anchor'></a> Implementors<a href='#implementors' class='anchor'></a>\
</h2> </h2>\
<ul class='item-list' id='implementors-list'> <ul class='item-list' id='implementors-list'>\
"; ";
let synthetic_impl_header = " let synthetic_impl_header = "\
<h2 id='synthetic-implementors' class='small-section-header'> <h2 id='synthetic-implementors' class='small-section-header'>\
Auto implementors<a href='#synthetic-implementors' class='anchor'></a> Auto implementors<a href='#synthetic-implementors' class='anchor'></a>\
</h2> </h2>\
<ul class='item-list' id='synthetic-implementors-list'> <ul class='item-list' id='synthetic-implementors-list'>\
"; ";
let mut synthetic_types = Vec::new(); let mut synthetic_types = Vec::new();
@ -2942,9 +2942,9 @@ fn item_trait(
.map_or(true, |d| cache.paths.contains_key(&d))); .map_or(true, |d| cache.paths.contains_key(&d)));
let (synthetic, concrete) = local.iter() let (synthetic, concrete): (Vec<&&Impl>, Vec<&&Impl>) = local.iter()
.partition::<Vec<_>, _>(|i| i.inner_impl().synthetic); .filter(|i| i.inner_impl().blanket_impl.is_none())
.partition(|i| i.inner_impl().synthetic);
if !foreign.is_empty() { if !foreign.is_empty() {
write!(w, " write!(w, "
@ -3626,9 +3626,12 @@ fn render_assoc_items(w: &mut fmt::Formatter,
render_deref_methods(w, cx, impl_, containing_item, has_deref_mut)?; render_deref_methods(w, cx, impl_, containing_item, has_deref_mut)?;
} }
let (synthetic, concrete) = traits let (synthetic, concrete): (Vec<&&Impl>, Vec<&&Impl>) = traits
.iter() .iter()
.partition::<Vec<_>, _>(|t| t.inner_impl().synthetic); .partition(|t| t.inner_impl().synthetic);
let (blanket_impl, concrete) = concrete
.into_iter()
.partition(|t| t.inner_impl().blanket_impl.is_some());
struct RendererStruct<'a, 'b, 'c>(&'a Context, Vec<&'b &'b Impl>, &'c clean::Item); struct RendererStruct<'a, 'b, 'c>(&'a Context, Vec<&'b &'b Impl>, &'c clean::Item);
@ -3658,6 +3661,18 @@ fn render_assoc_items(w: &mut fmt::Formatter,
render_impls(cx, w, &synthetic, containing_item)?; render_impls(cx, w, &synthetic, containing_item)?;
write!(w, "</div>")?; write!(w, "</div>")?;
} }
if !blanket_impl.is_empty() {
write!(w, "\
<h2 id='blanket-implementations' class='small-section-header'>\
Blanket Implementations\
<a href='#blanket-implementations' class='anchor'></a>\
</h2>\
<div id='blanket-implementations-list'>\
")?;
render_impls(cx, w, &blanket_impl, containing_item)?;
write!(w, "</div>")?;
}
} }
Ok(()) Ok(())
} }
@ -4203,12 +4218,16 @@ fn sidebar_assoc_items(it: &clean::Item) -> String {
.collect::<String>() .collect::<String>()
}; };
let (synthetic, concrete) = v let (synthetic, concrete): (Vec<&Impl>, Vec<&Impl>) = v
.iter() .iter()
.partition::<Vec<_>, _>(|i| i.inner_impl().synthetic); .partition::<Vec<_>, _>(|i| i.inner_impl().synthetic);
let (blanket_impl, concrete): (Vec<&Impl>, Vec<&Impl>) = concrete
.into_iter()
.partition::<Vec<_>, _>(|i| i.inner_impl().blanket_impl.is_some());
let concrete_format = format_impls(concrete); let concrete_format = format_impls(concrete);
let synthetic_format = format_impls(synthetic); let synthetic_format = format_impls(synthetic);
let blanket_format = format_impls(blanket_impl);
if !concrete_format.is_empty() { if !concrete_format.is_empty() {
out.push_str("<a class=\"sidebar-title\" href=\"#implementations\">\ out.push_str("<a class=\"sidebar-title\" href=\"#implementations\">\
@ -4221,6 +4240,12 @@ fn sidebar_assoc_items(it: &clean::Item) -> String {
Auto Trait Implementations</a>"); Auto Trait Implementations</a>");
out.push_str(&format!("<div class=\"sidebar-links\">{}</div>", synthetic_format)); out.push_str(&format!("<div class=\"sidebar-links\">{}</div>", synthetic_format));
} }
if !blanket_format.is_empty() {
out.push_str("<a class=\"sidebar-title\" href=\"#blanket-implementations\">\
Blanket Implementations</a>");
out.push_str(&format!("<div class=\"sidebar-links\">{}</div>", blanket_format));
}
} }
} }

View file

@ -12,10 +12,10 @@
use std::fmt; use std::fmt;
// @!has foo/struct.Bar.html '//h3[@id="impl-ToString"]//code' 'impl<T> ToString for Bar' // @!has foo/struct.Bar.html '//h3[@id="impl-ToString"]//code' 'impl<T> ToString for T'
pub struct Bar; pub struct Bar;
// @has foo/struct.Foo.html '//h3[@id="impl-ToString"]//code' 'impl<T> ToString for Foo' // @has foo/struct.Foo.html '//h3[@id="impl-ToString"]//code' 'impl<T> ToString for T'
pub struct Foo; pub struct Foo;
impl fmt::Display for Foo { impl fmt::Display for Foo {

View file

@ -12,7 +12,7 @@
// @has - '//code' 'impl<T> Send for Foo<T> where T: Send' // @has - '//code' 'impl<T> Send for Foo<T> where T: Send'
// @has - '//code' 'impl<T> Sync for Foo<T> where T: Sync' // @has - '//code' 'impl<T> Sync for Foo<T> where T: Sync'
// @count - '//*[@id="implementations-list"]/*[@class="impl"]' 0 // @count - '//*[@id="implementations-list"]/*[@class="impl"]' 0
// @count - '//*[@id="synthetic-implementations-list"]/*[@class="impl"]' 9 // @count - '//*[@id="synthetic-implementations-list"]/*[@class="impl"]' 2
pub struct Foo<T> { pub struct Foo<T> {
field: T, field: T,
} }

View file

@ -16,7 +16,7 @@
// 'impl<T> Send for Foo<T>' // 'impl<T> Send for Foo<T>'
// //
// @count - '//*[@id="implementations-list"]/*[@class="impl"]' 1 // @count - '//*[@id="implementations-list"]/*[@class="impl"]' 1
// @count - '//*[@id="synthetic-implementations-list"]/*[@class="impl"]' 8 // @count - '//*[@id="synthetic-implementations-list"]/*[@class="impl"]' 1
pub struct Foo<T> { pub struct Foo<T> {
field: T, field: T,
} }