Skip to content

Commit 8fb1250

Browse files
Improve sidebar rendering and add methods list
1 parent bed9a85 commit 8fb1250

File tree

2 files changed

+69
-20
lines changed

2 files changed

+69
-20
lines changed

src/librustdoc/html/render.rs

+48-14
Original file line numberDiff line numberDiff line change
@@ -3513,12 +3513,29 @@ impl<'a> fmt::Display for Sidebar<'a> {
35133513
}
35143514
}
35153515

3516+
fn get_methods(i: &clean::Impl) -> Vec<String> {
3517+
i.items.iter().filter_map(|item| {
3518+
match item.name {
3519+
// Maybe check with clean::Visibility::Public as well?
3520+
Some(ref name) if !name.is_empty() && item.visibility.is_some() && item.is_method() => {
3521+
Some(format!("<a href=\"#method.{name}\">{name}</a>", name = name))
3522+
}
3523+
_ => None,
3524+
}
3525+
}).collect::<Vec<_>>()
3526+
}
3527+
35163528
fn sidebar_assoc_items(it: &clean::Item) -> String {
35173529
let mut out = String::new();
35183530
let c = cache();
35193531
if let Some(v) = c.impls.get(&it.def_id) {
3520-
if v.iter().any(|i| i.inner_impl().trait_.is_none()) {
3521-
out.push_str("<li><a href=\"#methods\">Methods</a></li>");
3532+
let ret = v.iter()
3533+
.filter(|i| i.inner_impl().trait_.is_none())
3534+
.flat_map(|i| get_methods(i.inner_impl()))
3535+
.collect::<String>();
3536+
if !ret.is_empty() {
3537+
out.push_str(&format!("<a class=\"sidebar-title\" href=\"#methods\">Methods\
3538+
</a><div class=\"sidebar-links\">{}</div>", ret));
35223539
}
35233540

35243541
if v.iter().any(|i| i.inner_impl().trait_.is_some()) {
@@ -3534,16 +3551,33 @@ fn sidebar_assoc_items(it: &clean::Item) -> String {
35343551
let inner_impl = target.def_id().or(target.primitive_type().and_then(|prim| {
35353552
c.primitive_locations.get(&prim).cloned()
35363553
})).and_then(|did| c.impls.get(&did));
3537-
if inner_impl.is_some() {
3538-
out.push_str("<li><a href=\"#deref-methods\">");
3554+
if let Some(impls) = inner_impl {
3555+
out.push_str("<a class=\"sidebar-title\" href=\"#deref-methods\">");
35393556
out.push_str(&format!("Methods from {:#}&lt;Target={:#}&gt;",
3540-
impl_.inner_impl().trait_.as_ref().unwrap(),
3541-
target));
3542-
out.push_str("</a></li>");
3557+
impl_.inner_impl().trait_.as_ref().unwrap(),
3558+
target));
3559+
out.push_str("</a>");
3560+
let ret = impls.iter()
3561+
.filter(|i| i.inner_impl().trait_.is_none())
3562+
.flat_map(|i| get_methods(i.inner_impl()))
3563+
.collect::<String>();
3564+
out.push_str(&format!("<div class=\"sidebar-links\">{}</div>", ret));
35433565
}
35443566
}
35453567
}
3546-
out.push_str("<li><a href=\"#implementations\">Trait Implementations</a></li>");
3568+
let ret = v.iter()
3569+
.filter_map(|i| if let Some(ref i) = i.inner_impl().trait_ {
3570+
let out = format!("{:#}", i).replace("<", "&lt;").replace(">", "&gt;");
3571+
Some(format!("<a href=\"#impl-{:#}\">{name}</a>", i, out))
3572+
} else {
3573+
None
3574+
})
3575+
.collect::<String>();
3576+
if !ret.is_empty() {
3577+
out.push_str("<a class=\"sidebar-title\" href=\"#implementations\">\
3578+
Trait Implementations</a>");
3579+
out.push_str(&format!("<div class=\"sidebar-links\">{}</div>", ret));
3580+
}
35473581
}
35483582
}
35493583

@@ -3564,7 +3598,7 @@ fn sidebar_struct(fmt: &mut fmt::Formatter, it: &clean::Item,
35643598
sidebar.push_str(&sidebar_assoc_items(it));
35653599

35663600
if !sidebar.is_empty() {
3567-
write!(fmt, "<div class=\"block items\"><ul>{}</ul></div>", sidebar)?;
3601+
write!(fmt, "<div class=\"block items\">{}</div>", sidebar)?;
35683602
}
35693603
Ok(())
35703604
}
@@ -3606,15 +3640,15 @@ fn sidebar_trait(fmt: &mut fmt::Formatter, it: &clean::Item,
36063640

36073641
sidebar.push_str("<li><a href=\"#implementors\">Implementors</a></li>");
36083642

3609-
write!(fmt, "<div class=\"block items\"><ul>{}</ul></div>", sidebar)
3643+
write!(fmt, "<div class=\"block items\">{}</div>", sidebar)
36103644
}
36113645

36123646
fn sidebar_primitive(fmt: &mut fmt::Formatter, it: &clean::Item,
36133647
_p: &clean::PrimitiveType) -> fmt::Result {
36143648
let sidebar = sidebar_assoc_items(it);
36153649

36163650
if !sidebar.is_empty() {
3617-
write!(fmt, "<div class=\"block items\"><ul>{}</ul></div>", sidebar)?;
3651+
write!(fmt, "<div class=\"block items\">{}</div>", sidebar)?;
36183652
}
36193653
Ok(())
36203654
}
@@ -3624,7 +3658,7 @@ fn sidebar_typedef(fmt: &mut fmt::Formatter, it: &clean::Item,
36243658
let sidebar = sidebar_assoc_items(it);
36253659

36263660
if !sidebar.is_empty() {
3627-
write!(fmt, "<div class=\"block items\"><ul>{}</ul></div>", sidebar)?;
3661+
write!(fmt, "<div class=\"block items\">{}</div>", sidebar)?;
36283662
}
36293663
Ok(())
36303664
}
@@ -3641,7 +3675,7 @@ fn sidebar_union(fmt: &mut fmt::Formatter, it: &clean::Item,
36413675
sidebar.push_str(&sidebar_assoc_items(it));
36423676

36433677
if !sidebar.is_empty() {
3644-
write!(fmt, "<div class=\"block items\"><ul>{}</ul></div>", sidebar)?;
3678+
write!(fmt, "<div class=\"block items\">{}</div>", sidebar)?;
36453679
}
36463680
Ok(())
36473681
}
@@ -3657,7 +3691,7 @@ fn sidebar_enum(fmt: &mut fmt::Formatter, it: &clean::Item,
36573691
sidebar.push_str(&sidebar_assoc_items(it));
36583692

36593693
if !sidebar.is_empty() {
3660-
write!(fmt, "<div class=\"block items\"><ul>{}</ul></div>", sidebar)?;
3694+
write!(fmt, "<div class=\"block items\">{}</div>", sidebar)?;
36613695
}
36623696
Ok(())
36633697
}

src/librustdoc/html/static/rustdoc.css

+21-6
Original file line numberDiff line numberDiff line change
@@ -188,18 +188,16 @@ nav.sub {
188188

189189
.js-only, .hidden { display: none !important; }
190190

191-
.sidebar {
192-
padding: 10px;
193-
}
194191
.sidebar img {
195192
margin: 20px auto;
196193
display: block;
194+
margin-top: 10px;
197195
}
198196

199197
.sidebar .location {
200198
border: 1px solid;
201199
font-size: 17px;
202-
margin: 30px 0 20px 0;
200+
margin: 30px 10px 20px 10px;
203201
text-align: center;
204202
word-wrap: break-word;
205203
}
@@ -220,7 +218,7 @@ nav.sub {
220218
.location a:first-child { font-weight: 500; }
221219

222220
.block {
223-
padding: 0 10px;
221+
padding: 0;
224222
margin-bottom: 14px;
225223
}
226224
.block h2, .block h3 {
@@ -229,7 +227,7 @@ nav.sub {
229227
text-align: center;
230228
}
231229
.block ul, .block li {
232-
margin: 0;
230+
margin: 0 10px;
233231
padding: 0;
234232
list-style: none;
235233
}
@@ -245,6 +243,23 @@ nav.sub {
245243
transition: border 500ms ease-out;
246244
}
247245

246+
.sidebar-title {
247+
border-top: 1px solid #777;
248+
border-bottom: 1px solid #777;
249+
text-align: center;
250+
font-size: 17px;
251+
margin-bottom: 5px;
252+
}
253+
254+
.sidebar-links {
255+
margin-bottom: 15px;
256+
}
257+
258+
.sidebar-links > a {
259+
padding-left: 10px;
260+
width: 100%;
261+
}
262+
248263
.content {
249264
padding: 15px 0;
250265
}

0 commit comments

Comments
 (0)