Skip to content

Commit 303ae8d

Browse files
committed
Split traits by local & non-local (external)
1 parent 7fc70f8 commit 303ae8d

File tree

2 files changed

+66
-6
lines changed

2 files changed

+66
-6
lines changed

src/librustdoc/html/render/mod.rs

+25-3
Original file line numberDiff line numberDiff line change
@@ -1197,11 +1197,33 @@ pub(crate) fn render_all_impls(
11971197
blanket_impl: &[&Impl],
11981198
) {
11991199
let mut impls = Buffer::html();
1200-
render_impls(cx, &mut impls, concrete, containing_item, true);
1200+
1201+
let (concrete_local, concrete_nonlocal): (Vec<&Impl>, Vec<&Impl>) = concrete
1202+
.into_iter()
1203+
.filter(|elem| elem.inner_impl().trait_.is_some())
1204+
.partition(|elem| elem.inner_impl().trait_.as_ref().unwrap().def_id().is_local());
1205+
1206+
render_impls(cx, &mut impls, &concrete_local, containing_item, true);
1207+
12011208
let impls = impls.into_inner();
12021209
if !impls.is_empty() {
1203-
write_impl_section_heading(&mut w, "Trait Implementations", "trait-implementations");
1204-
write!(w, "<div id=\"trait-implementations-list\">{impls}</div>").unwrap();
1210+
write_impl_section_heading(
1211+
&mut w,
1212+
"Crate Trait Implementations",
1213+
"crate-trait-implementations",
1214+
);
1215+
write!(w, "<div id=\"crate-trait-implementations-list\">{impls}</div>").unwrap();
1216+
}
1217+
1218+
if !concrete_nonlocal.is_empty() {
1219+
write_impl_section_heading(
1220+
&mut w,
1221+
"External Trait Implementations",
1222+
"external-trait-implementations",
1223+
);
1224+
w.write_str("<div id=\"external-trait-implementations-list\">").unwrap();
1225+
render_impls(cx, &mut w, &concrete_nonlocal, containing_item, false);
1226+
w.write_str("</div>").unwrap();
12051227
}
12061228

12071229
if !synthetic.is_empty() {

src/librustdoc/html/render/sidebar.rs

+41-3
Original file line numberDiff line numberDiff line change
@@ -620,6 +620,39 @@ fn sidebar_render_assoc_items(
620620
blanket_impl: Vec<&Impl>,
621621
items: &mut Vec<LinkBlock<'_>>,
622622
) {
623+
let format_concrete_impls = |impls: Vec<&Impl>, id_map: &mut IdMap| {
624+
let mut links = FxHashSet::default();
625+
626+
let (locals, externals): (Vec<(Link<'static>, bool)>, Vec<(Link<'static>, bool)>) = impls
627+
.iter()
628+
.filter_map(|it| {
629+
let trait_ = it.inner_impl().trait_.as_ref()?;
630+
631+
let encoded = id_map.derive(super::get_id_for_impl(cx.tcx(), it.impl_item.item_id));
632+
633+
let prefix = match it.inner_impl().polarity {
634+
ty::ImplPolarity::Positive | ty::ImplPolarity::Reservation => "",
635+
ty::ImplPolarity::Negative => "!",
636+
};
637+
let generated = Link::new(encoded, format!("{prefix}{:#}", trait_.print(cx)));
638+
if links.insert(generated.clone()) {
639+
Some((generated, trait_.res.def_id().is_local()))
640+
} else {
641+
None
642+
}
643+
})
644+
.partition(|elem| elem.1);
645+
646+
let mut locals = locals.into_iter().map(|elem| elem.0).collect::<Vec<Link<'static>>>();
647+
locals.sort();
648+
649+
let mut externals =
650+
externals.into_iter().map(|elem| elem.0).collect::<Vec<Link<'static>>>();
651+
externals.sort();
652+
653+
(locals, externals)
654+
};
655+
623656
let format_impls = |impls: Vec<&Impl>, id_map: &mut IdMap| {
624657
let mut links = FxHashSet::default();
625658

@@ -641,14 +674,19 @@ fn sidebar_render_assoc_items(
641674
ret
642675
};
643676

644-
let concrete = format_impls(concrete, id_map);
677+
let (concrete_locals, concrete_externals) = format_concrete_impls(concrete, id_map);
645678
let synthetic = format_impls(synthetic, id_map);
646679
let blanket = format_impls(blanket_impl, id_map);
647680
items.extend([
648681
LinkBlock::new(
649-
Link::new("trait-implementations", "Trait Implementations"),
682+
Link::new("crate-trait-implementations", "Crate Trait Implementations"),
683+
"trait-implementation",
684+
concrete_locals,
685+
),
686+
LinkBlock::new(
687+
Link::new("external-trait-implementations", "External Trait Implementations"),
650688
"trait-implementation",
651-
concrete,
689+
concrete_externals,
652690
),
653691
LinkBlock::new(
654692
Link::new("synthetic-implementations", "Auto Trait Implementations"),

0 commit comments

Comments
 (0)