Skip to content

Commit 0db26d6

Browse files
Don't put empty implementations into details/summary blocks
1 parent e188693 commit 0db26d6

File tree

2 files changed

+112
-97
lines changed

2 files changed

+112
-97
lines changed

src/librustdoc/html/format.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,10 @@ impl Buffer {
8282
self.buffer.push_str(s);
8383
}
8484

85+
crate fn push_buffer(&mut self, other: Buffer) {
86+
self.buffer.push_str(&other.buffer);
87+
}
88+
8589
// Intended for consumption by write! and writeln! (std::fmt) but without
8690
// the fmt::Result return type imposed by fmt::Write (and avoiding the trait
8791
// import).

src/librustdoc/html/render/mod.rs

Lines changed: 108 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -1286,99 +1286,6 @@ fn render_impl(
12861286
let trait_ = i.trait_did_full(cache).map(|did| &traits[&did]);
12871287
let mut close_tags = String::new();
12881288

1289-
if render_mode == RenderMode::Normal {
1290-
let id = cx.derive_id(match i.inner_impl().trait_ {
1291-
Some(ref t) => {
1292-
if is_on_foreign_type {
1293-
get_id_for_impl_on_foreign_type(&i.inner_impl().for_, t, cx)
1294-
} else {
1295-
format!("impl-{}", small_url_encode(format!("{:#}", t.print(cx))))
1296-
}
1297-
}
1298-
None => "impl".to_string(),
1299-
});
1300-
let aliases = if aliases.is_empty() {
1301-
String::new()
1302-
} else {
1303-
format!(" aliases=\"{}\"", aliases.join(","))
1304-
};
1305-
if let Some(use_absolute) = use_absolute {
1306-
write!(
1307-
w,
1308-
"<details class=\"rustdoc-toggle implementors-toggle\" open>\
1309-
<summary>\
1310-
<h3 id=\"{}\" class=\"impl\"{}>\
1311-
<code class=\"in-band\">",
1312-
id, aliases
1313-
);
1314-
close_tags.insert_str(0, "</details>");
1315-
write!(w, "{}", i.inner_impl().print(use_absolute, cx));
1316-
if show_def_docs {
1317-
for it in &i.inner_impl().items {
1318-
if let clean::TypedefItem(ref tydef, _) = *it.kind {
1319-
w.write_str("<span class=\"where fmt-newline\"> ");
1320-
assoc_type(
1321-
w,
1322-
it,
1323-
&[],
1324-
Some(&tydef.type_),
1325-
AssocItemLink::Anchor(None),
1326-
"",
1327-
cx,
1328-
);
1329-
w.write_str(";</span>");
1330-
}
1331-
}
1332-
}
1333-
w.write_str("</code>");
1334-
} else {
1335-
write!(
1336-
w,
1337-
"<details class=\"rustdoc-toggle implementors-toggle\" open>\
1338-
<summary>\
1339-
<h3 id=\"{}\" class=\"impl\"{}>\
1340-
<code class=\"in-band\">{}</code>",
1341-
id,
1342-
aliases,
1343-
i.inner_impl().print(false, cx)
1344-
);
1345-
close_tags.insert_str(0, "</details>");
1346-
}
1347-
write!(w, "<a href=\"#{}\" class=\"anchor\"></a>", id);
1348-
render_stability_since_raw(
1349-
w,
1350-
i.impl_item.stable_since(tcx).as_deref(),
1351-
i.impl_item.const_stable_since(tcx).as_deref(),
1352-
outer_version,
1353-
outer_const_version,
1354-
);
1355-
write_srclink(cx, &i.impl_item, w);
1356-
w.write_str("</h3></summary>");
1357-
1358-
if trait_.is_some() {
1359-
if let Some(portability) = portability(&i.impl_item, Some(parent)) {
1360-
write!(w, "<div class=\"item-info\">{}</div>", portability);
1361-
}
1362-
}
1363-
1364-
if let Some(ref dox) = cx.shared.maybe_collapsed_doc_value(&i.impl_item) {
1365-
let mut ids = cx.id_map.borrow_mut();
1366-
write!(
1367-
w,
1368-
"<div class=\"docblock\">{}</div>",
1369-
Markdown(
1370-
&*dox,
1371-
&i.impl_item.links(cx),
1372-
&mut ids,
1373-
cx.shared.codes,
1374-
cx.shared.edition(),
1375-
&cx.shared.playground
1376-
)
1377-
.into_string()
1378-
);
1379-
}
1380-
}
1381-
13821289
fn doc_impl_item(
13831290
w: &mut Buffer,
13841291
cx: &Context<'_>,
@@ -1554,11 +1461,10 @@ fn render_impl(
15541461
}
15551462
}
15561463

1557-
w.write_str("<div class=\"impl-items\">");
1558-
close_tags.insert_str(0, "</div>");
1464+
let mut impl_items = Buffer::empty_from(w);
15591465
for trait_item in &i.inner_impl().items {
15601466
doc_impl_item(
1561-
w,
1467+
&mut impl_items,
15621468
cx,
15631469
trait_item,
15641470
if trait_.is_some() { &i.impl_item } else { parent },
@@ -1614,7 +1520,7 @@ fn render_impl(
16141520
if show_default_items {
16151521
if let Some(t) = trait_ {
16161522
render_default_items(
1617-
w,
1523+
&mut impl_items,
16181524
cx,
16191525
&t.trait_,
16201526
&i.inner_impl(),
@@ -1626,6 +1532,111 @@ fn render_impl(
16261532
);
16271533
}
16281534
}
1535+
let details_str = if impl_items.is_empty() {
1536+
""
1537+
} else {
1538+
"<details class=\"rustdoc-toggle implementors-toggle\" open><summary>"
1539+
};
1540+
if render_mode == RenderMode::Normal {
1541+
let id = cx.derive_id(match i.inner_impl().trait_ {
1542+
Some(ref t) => {
1543+
if is_on_foreign_type {
1544+
get_id_for_impl_on_foreign_type(&i.inner_impl().for_, t, cx)
1545+
} else {
1546+
format!("impl-{}", small_url_encode(format!("{:#}", t.print(cx))))
1547+
}
1548+
}
1549+
None => "impl".to_string(),
1550+
});
1551+
let aliases = if aliases.is_empty() {
1552+
String::new()
1553+
} else {
1554+
format!(" aliases=\"{}\"", aliases.join(","))
1555+
};
1556+
if let Some(use_absolute) = use_absolute {
1557+
write!(
1558+
w,
1559+
"{}<h3 id=\"{}\" class=\"impl\"{}><code class=\"in-band\">",
1560+
details_str, id, aliases
1561+
);
1562+
if !impl_items.is_empty() {
1563+
close_tags.insert_str(0, "</details>");
1564+
}
1565+
write!(w, "{}", i.inner_impl().print(use_absolute, cx));
1566+
if show_def_docs {
1567+
for it in &i.inner_impl().items {
1568+
if let clean::TypedefItem(ref tydef, _) = *it.kind {
1569+
w.write_str("<span class=\"where fmt-newline\"> ");
1570+
assoc_type(
1571+
w,
1572+
it,
1573+
&[],
1574+
Some(&tydef.type_),
1575+
AssocItemLink::Anchor(None),
1576+
"",
1577+
cx,
1578+
);
1579+
w.write_str(";</span>");
1580+
}
1581+
}
1582+
}
1583+
w.write_str("</code>");
1584+
} else {
1585+
write!(
1586+
w,
1587+
"{}<h3 id=\"{}\" class=\"impl\"{}><code class=\"in-band\">{}</code>",
1588+
details_str,
1589+
id,
1590+
aliases,
1591+
i.inner_impl().print(false, cx)
1592+
);
1593+
if !impl_items.is_empty() {
1594+
close_tags.insert_str(0, "</details>");
1595+
}
1596+
}
1597+
write!(w, "<a href=\"#{}\" class=\"anchor\"></a>", id);
1598+
render_stability_since_raw(
1599+
w,
1600+
i.impl_item.stable_since(tcx).as_deref(),
1601+
i.impl_item.const_stable_since(tcx).as_deref(),
1602+
outer_version,
1603+
outer_const_version,
1604+
);
1605+
write_srclink(cx, &i.impl_item, w);
1606+
if impl_items.is_empty() {
1607+
w.write_str("</h3>");
1608+
} else {
1609+
w.write_str("</h3></summary>");
1610+
}
1611+
1612+
if trait_.is_some() {
1613+
if let Some(portability) = portability(&i.impl_item, Some(parent)) {
1614+
write!(w, "<div class=\"item-info\">{}</div>", portability);
1615+
}
1616+
}
1617+
1618+
if let Some(ref dox) = cx.shared.maybe_collapsed_doc_value(&i.impl_item) {
1619+
let mut ids = cx.id_map.borrow_mut();
1620+
write!(
1621+
w,
1622+
"<div class=\"docblock\">{}</div>",
1623+
Markdown(
1624+
&*dox,
1625+
&i.impl_item.links(cx),
1626+
&mut ids,
1627+
cx.shared.codes,
1628+
cx.shared.edition(),
1629+
&cx.shared.playground
1630+
)
1631+
.into_string()
1632+
);
1633+
}
1634+
}
1635+
if !impl_items.is_empty() {
1636+
w.write_str("<div class=\"impl-items\">");
1637+
w.push_buffer(impl_items);
1638+
close_tags.insert_str(0, "</div>");
1639+
}
16291640
w.write_str(&close_tags);
16301641
}
16311642

0 commit comments

Comments
 (0)