Skip to content

Commit 10cd92e

Browse files
committed
make display_c_like_variant return impl fmt::Display
1 parent 39078aa commit 10cd92e

File tree

1 file changed

+44
-32
lines changed

1 file changed

+44
-32
lines changed

src/librustdoc/html/render/print_item.rs

Lines changed: 44 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1623,29 +1623,31 @@ fn should_show_enum_discriminant(
16231623
repr.c() || repr.int.is_some()
16241624
}
16251625

1626-
fn display_c_like_variant(
1627-
w: &mut String,
1628-
cx: &Context<'_>,
1629-
item: &clean::Item,
1630-
variant: &clean::Variant,
1626+
fn display_c_like_variant<'a, 'tcx>(
1627+
cx: &'a Context<'tcx>,
1628+
item: &'a clean::Item,
1629+
variant: &'a clean::Variant,
16311630
index: VariantIdx,
16321631
should_show_enum_discriminant: bool,
16331632
enum_def_id: DefId,
1634-
) {
1635-
let name = item.name.unwrap();
1636-
if let Some(ref value) = variant.discriminant {
1637-
write_str(w, format_args!("{} = {}", name.as_str(), value.value(cx.tcx(), true)));
1638-
} else if should_show_enum_discriminant {
1639-
let adt_def = cx.tcx().adt_def(enum_def_id);
1640-
let discr = adt_def.discriminant_for_variant(cx.tcx(), index);
1641-
if discr.ty.is_signed() {
1642-
write_str(w, format_args!("{} = {}", name.as_str(), discr.val as i128));
1633+
) -> impl fmt::Display + 'a + Captures<'tcx> {
1634+
fmt::from_fn(move |w| {
1635+
let name = item.name.unwrap();
1636+
if let Some(ref value) = variant.discriminant {
1637+
write!(w, "{} = {}", name.as_str(), value.value(cx.tcx(), true))?;
1638+
} else if should_show_enum_discriminant {
1639+
let adt_def = cx.tcx().adt_def(enum_def_id);
1640+
let discr = adt_def.discriminant_for_variant(cx.tcx(), index);
1641+
if discr.ty.is_signed() {
1642+
write!(w, "{} = {}", name.as_str(), discr.val as i128)?;
1643+
} else {
1644+
write!(w, "{} = {}", name.as_str(), discr.val)?;
1645+
}
16431646
} else {
1644-
write_str(w, format_args!("{} = {}", name.as_str(), discr.val));
1647+
write!(w, "{name}")?;
16451648
}
1646-
} else {
1647-
w.push_str(name.as_str());
1648-
}
1649+
Ok(())
1650+
})
16491651
}
16501652

16511653
fn render_enum_fields(
@@ -1685,14 +1687,19 @@ fn render_enum_fields(
16851687
w.push_str(TAB);
16861688
match v.kind {
16871689
clean::VariantItem(ref var) => match var.kind {
1688-
clean::VariantKind::CLike => display_c_like_variant(
1690+
clean::VariantKind::CLike => write_str(
16891691
w,
1690-
cx,
1691-
v,
1692-
var,
1693-
index,
1694-
should_show_enum_discriminant,
1695-
enum_def_id,
1692+
format_args!(
1693+
"{}",
1694+
display_c_like_variant(
1695+
cx,
1696+
v,
1697+
var,
1698+
index,
1699+
should_show_enum_discriminant,
1700+
enum_def_id,
1701+
)
1702+
),
16961703
),
16971704
clean::VariantKind::Tuple(ref s) => {
16981705
write_str(
@@ -1774,14 +1781,19 @@ fn item_variants(
17741781
if let clean::VariantItem(ref var) = variant.kind
17751782
&& let clean::VariantKind::CLike = var.kind
17761783
{
1777-
display_c_like_variant(
1784+
write_str(
17781785
w,
1779-
cx,
1780-
variant,
1781-
var,
1782-
index,
1783-
should_show_enum_discriminant,
1784-
enum_def_id,
1786+
format_args!(
1787+
"{}",
1788+
display_c_like_variant(
1789+
cx,
1790+
variant,
1791+
var,
1792+
index,
1793+
should_show_enum_discriminant,
1794+
enum_def_id,
1795+
)
1796+
),
17851797
);
17861798
} else {
17871799
w.push_str(variant.name.unwrap().as_str());

0 commit comments

Comments
 (0)