From 588a99bbddc0a4d1816df1c1f9fa23daeea2368d Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Sat, 27 Nov 2021 14:37:30 +0100 Subject: [PATCH] Fix display for "const" deref methods in rustdoc --- src/librustdoc/html/render/mod.rs | 39 +++++++++++++++----- src/librustdoc/html/render/print_item.rs | 45 +++++++++++++++++++++--- 2 files changed, 70 insertions(+), 14 deletions(-) diff --git a/src/librustdoc/html/render/mod.rs b/src/librustdoc/html/render/mod.rs index 08022d526fe..5a2c1ea214d 100644 --- a/src/librustdoc/html/render/mod.rs +++ b/src/librustdoc/html/render/mod.rs @@ -861,6 +861,7 @@ fn render_assoc_item( link: AssocItemLink<'_>, parent: ItemType, cx: &Context<'_>, + render_mode: RenderMode, ) { fn method( w: &mut Buffer, @@ -871,6 +872,7 @@ fn render_assoc_item( link: AssocItemLink<'_>, parent: ItemType, cx: &Context<'_>, + render_mode: RenderMode, ) { let name = meth.name.as_ref().unwrap(); let href = match link { @@ -893,8 +895,14 @@ fn render_assoc_item( } }; let vis = meth.visibility.print_with_space(meth.def_id, cx).to_string(); - let constness = - print_constness_with_space(&header.constness, meth.const_stability(cx.tcx())); + // FIXME: Once https://github.com/rust-lang/rust/issues/67792 is implemented, we can remove + // this condition. + let constness = match render_mode { + RenderMode::Normal => { + print_constness_with_space(&header.constness, meth.const_stability(cx.tcx())) + } + RenderMode::ForDeref { .. } => "", + }; let asyncness = header.asyncness.print_with_space(); let unsafety = header.unsafety.print_with_space(); let defaultness = print_default_space(meth.is_default()); @@ -945,10 +953,10 @@ fn render_assoc_item( match *item.kind { clean::StrippedItem(..) => {} clean::TyMethodItem(ref m) => { - method(w, item, m.header, &m.generics, &m.decl, link, parent, cx) + method(w, item, m.header, &m.generics, &m.decl, link, parent, cx, render_mode) } clean::MethodItem(ref m, _) => { - method(w, item, m.header, &m.generics, &m.decl, link, parent, cx) + method(w, item, m.header, &m.generics, &m.decl, link, parent, cx, render_mode) } clean::AssocConstItem(ref ty, ref default) => assoc_const( w, @@ -1415,7 +1423,7 @@ fn render_impl( "
", id, item_type, in_trait_class, ); - render_rightside(w, cx, item, containing_item); + render_rightside(w, cx, item, containing_item, render_mode); write!(w, "", id); w.write_str("

"); render_assoc_item( @@ -1424,6 +1432,7 @@ fn render_impl( link.anchor(source_id.as_ref().unwrap_or(&id)), ItemType::Impl, cx, + render_mode, ); w.write_str("

"); w.write_str("
"); @@ -1459,7 +1468,7 @@ fn render_impl( "
", id, item_type, in_trait_class ); - render_rightside(w, cx, item, containing_item); + render_rightside(w, cx, item, containing_item, render_mode); write!(w, "", id); w.write_str("

"); assoc_const( @@ -1638,16 +1647,28 @@ fn render_rightside( cx: &Context<'_>, item: &clean::Item, containing_item: &clean::Item, + render_mode: RenderMode, ) { let tcx = cx.tcx(); + let const_stable_since; + // FIXME: Once https://github.com/rust-lang/rust/issues/67792 is implemented, we can remove + // this condition. + let (const_stability, const_stable_since) = match render_mode { + RenderMode::Normal => { + const_stable_since = containing_item.const_stable_since(tcx); + (item.const_stability(tcx), const_stable_since.as_deref()) + } + RenderMode::ForDeref { .. } => (None, None), + }; + write!(w, "
"); render_stability_since_raw( w, item.stable_since(tcx).as_deref(), - item.const_stability(tcx), + const_stability, containing_item.stable_since(tcx).as_deref(), - containing_item.const_stable_since(tcx).as_deref(), + const_stable_since, ); write_srclink(cx, item, w); @@ -1683,7 +1704,7 @@ pub(crate) fn render_impl_summary( format!(" data-aliases=\"{}\"", aliases.join(",")) }; write!(w, "
", id, aliases); - render_rightside(w, cx, &i.impl_item, containing_item); + render_rightside(w, cx, &i.impl_item, containing_item, RenderMode::Normal); write!(w, "", id); write!(w, "

"); diff --git a/src/librustdoc/html/render/print_item.rs b/src/librustdoc/html/render/print_item.rs index d3738cfa3e7..fc65b1d63cb 100644 --- a/src/librustdoc/html/render/print_item.rs +++ b/src/librustdoc/html/render/print_item.rs @@ -556,7 +556,14 @@ fn item_trait(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, t: &clean::Tra ); } for t in &types { - render_assoc_item(w, t, AssocItemLink::Anchor(None), ItemType::Trait, cx); + render_assoc_item( + w, + t, + AssocItemLink::Anchor(None), + ItemType::Trait, + cx, + RenderMode::Normal, + ); w.write_str(";\n"); } // If there are too many associated constants, hide everything after them @@ -580,7 +587,14 @@ fn item_trait(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, t: &clean::Tra w.write_str("\n"); } for t in &consts { - render_assoc_item(w, t, AssocItemLink::Anchor(None), ItemType::Trait, cx); + render_assoc_item( + w, + t, + AssocItemLink::Anchor(None), + ItemType::Trait, + cx, + RenderMode::Normal, + ); w.write_str(";\n"); } if !toggle && should_hide_fields(count_methods) { @@ -591,7 +605,14 @@ fn item_trait(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, t: &clean::Tra w.write_str("\n"); } for (pos, m) in required.iter().enumerate() { - render_assoc_item(w, m, AssocItemLink::Anchor(None), ItemType::Trait, cx); + render_assoc_item( + w, + m, + AssocItemLink::Anchor(None), + ItemType::Trait, + cx, + RenderMode::Normal, + ); w.write_str(";\n"); if pos < required.len() - 1 { @@ -602,7 +623,14 @@ fn item_trait(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, t: &clean::Tra w.write_str("\n"); } for (pos, m) in provided.iter().enumerate() { - render_assoc_item(w, m, AssocItemLink::Anchor(None), ItemType::Trait, cx); + render_assoc_item( + w, + m, + AssocItemLink::Anchor(None), + ItemType::Trait, + cx, + RenderMode::Normal, + ); match *m.kind { clean::MethodItem(ref inner, _) if !inner.generics.where_predicates.is_empty() => @@ -655,7 +683,14 @@ fn item_trait(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, t: &clean::Tra write_srclink(cx, m, w); write!(w, "

"); write!(w, "

"); - render_assoc_item(w, m, AssocItemLink::Anchor(Some(&id)), ItemType::Impl, cx); + render_assoc_item( + w, + m, + AssocItemLink::Anchor(Some(&id)), + ItemType::Impl, + cx, + RenderMode::Normal, + ); w.write_str("

"); w.write_str("
"); if toggled {