From d38ae767f841a307911abd5713695eae8390bbf0 Mon Sep 17 00:00:00 2001 From: Noah Lev Date: Sat, 11 Dec 2021 14:15:52 -0800 Subject: [PATCH 1/2] rustdoc: Pretty-print assoc const defaults on-demand This should improve performance, clean up the code, and help pave the way for #83035. --- src/librustdoc/clean/mod.rs | 9 ++++++--- src/librustdoc/clean/types.rs | 22 ++++++++++++++++++---- src/librustdoc/html/render/mod.rs | 2 +- src/librustdoc/json/conversions.rs | 4 +++- 4 files changed, 28 insertions(+), 9 deletions(-) diff --git a/src/librustdoc/clean/mod.rs b/src/librustdoc/clean/mod.rs index f11fa0295c522..2b4466d404170 100644 --- a/src/librustdoc/clean/mod.rs +++ b/src/librustdoc/clean/mod.rs @@ -912,7 +912,9 @@ impl Clean for hir::TraitItem<'_> { cx.with_param_env(local_did, |cx| { let inner = match self.kind { hir::TraitItemKind::Const(ref ty, default) => { - AssocConstItem(ty.clean(cx), default.map(|e| print_const_expr(cx.tcx, e))) + let default = + default.map(|e| ConstantKind::Local { def_id: local_did, body: e }); + AssocConstItem(ty.clean(cx), default) } hir::TraitItemKind::Fn(ref sig, hir::TraitFn::Provided(body)) => { let mut m = clean_function(cx, sig, &self.generics, body); @@ -959,7 +961,8 @@ impl Clean for hir::ImplItem<'_> { cx.with_param_env(local_did, |cx| { let inner = match self.kind { hir::ImplItemKind::Const(ref ty, expr) => { - AssocConstItem(ty.clean(cx), Some(print_const_expr(cx.tcx, expr))) + let default = Some(ConstantKind::Local { def_id: local_did, body: expr }); + AssocConstItem(ty.clean(cx), default) } hir::ImplItemKind::Fn(ref sig, body) => { let mut m = clean_function(cx, sig, &self.generics, body); @@ -1009,7 +1012,7 @@ impl Clean for ty::AssocItem { ty::AssocKind::Const => { let ty = tcx.type_of(self.def_id); let default = if self.defaultness.has_value() { - Some(inline::print_inlined_const(tcx, self.def_id)) + Some(ConstantKind::Extern { def_id: self.def_id }) } else { None }; diff --git a/src/librustdoc/clean/types.rs b/src/librustdoc/clean/types.rs index 1fe4aa9023ea3..6ce6d88915010 100644 --- a/src/librustdoc/clean/types.rs +++ b/src/librustdoc/clean/types.rs @@ -670,7 +670,7 @@ crate enum ItemKind { MacroItem(Macro), ProcMacroItem(ProcMacro), PrimitiveItem(PrimitiveType), - AssocConstItem(Type, Option), + AssocConstItem(Type, Option), /// An associated item in a trait or trait impl. /// /// The bounds may be non-empty if there is a `where` clause. @@ -2153,7 +2153,21 @@ crate enum ConstantKind { impl Constant { crate fn expr(&self, tcx: TyCtxt<'_>) -> String { - match self.kind { + self.kind.expr(tcx) + } + + crate fn value(&self, tcx: TyCtxt<'_>) -> Option { + self.kind.value(tcx) + } + + crate fn is_literal(&self, tcx: TyCtxt<'_>) -> bool { + self.kind.is_literal(tcx) + } +} + +impl ConstantKind { + crate fn expr(&self, tcx: TyCtxt<'_>) -> String { + match *self { ConstantKind::TyConst { ref expr } => expr.clone(), ConstantKind::Extern { def_id } => print_inlined_const(tcx, def_id), ConstantKind::Local { body, .. } | ConstantKind::Anonymous { body } => { @@ -2163,7 +2177,7 @@ impl Constant { } crate fn value(&self, tcx: TyCtxt<'_>) -> Option { - match self.kind { + match *self { ConstantKind::TyConst { .. } | ConstantKind::Anonymous { .. } => None, ConstantKind::Extern { def_id } | ConstantKind::Local { def_id, .. } => { print_evaluated_const(tcx, def_id) @@ -2172,7 +2186,7 @@ impl Constant { } crate fn is_literal(&self, tcx: TyCtxt<'_>) -> bool { - match self.kind { + match *self { ConstantKind::TyConst { .. } => false, ConstantKind::Extern { def_id } => def_id.as_local().map_or(false, |def_id| { is_literal_expr(tcx, tcx.hir().local_def_id_to_hir_id(def_id)) diff --git a/src/librustdoc/html/render/mod.rs b/src/librustdoc/html/render/mod.rs index 166e084012724..db31751176bde 100644 --- a/src/librustdoc/html/render/mod.rs +++ b/src/librustdoc/html/render/mod.rs @@ -762,7 +762,7 @@ fn assoc_const( w: &mut Buffer, it: &clean::Item, ty: &clean::Type, - _default: Option<&String>, + _default: Option<&clean::ConstantKind>, link: AssocItemLink<'_>, extra: &str, cx: &Context<'_>, diff --git a/src/librustdoc/json/conversions.rs b/src/librustdoc/json/conversions.rs index 7fc295747f41a..ee29bfcc7a48d 100644 --- a/src/librustdoc/json/conversions.rs +++ b/src/librustdoc/json/conversions.rs @@ -219,7 +219,9 @@ fn from_clean_item(item: clean::Item, tcx: TyCtxt<'_>) -> ItemEnum { MacroItem(m) => ItemEnum::Macro(m.source), ProcMacroItem(m) => ItemEnum::ProcMacro(m.into_tcx(tcx)), PrimitiveItem(p) => ItemEnum::PrimitiveType(p.as_sym().to_string()), - AssocConstItem(t, s) => ItemEnum::AssocConst { type_: t.into_tcx(tcx), default: s }, + AssocConstItem(ty, default) => { + ItemEnum::AssocConst { type_: ty.into_tcx(tcx), default: default.map(|c| c.expr(tcx)) } + } AssocTypeItem(g, t) => ItemEnum::AssocType { bounds: g.into_iter().map(|x| x.into_tcx(tcx)).collect(), default: t.map(|x| x.into_tcx(tcx)), From 719d7a53751eb2eb4166c9f272507b345aa444ef Mon Sep 17 00:00:00 2001 From: Noah Lev Date: Sat, 11 Dec 2021 14:18:24 -0800 Subject: [PATCH 2/2] rustdoc: Remove unused `_default` parameter It can always be re-added later if we decide to display associated const default values. --- src/librustdoc/html/render/mod.rs | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/src/librustdoc/html/render/mod.rs b/src/librustdoc/html/render/mod.rs index db31751176bde..289908303002b 100644 --- a/src/librustdoc/html/render/mod.rs +++ b/src/librustdoc/html/render/mod.rs @@ -762,7 +762,6 @@ fn assoc_const( w: &mut Buffer, it: &clean::Item, ty: &clean::Type, - _default: Option<&clean::ConstantKind>, link: AssocItemLink<'_>, extra: &str, cx: &Context<'_>, @@ -958,15 +957,9 @@ fn render_assoc_item( clean::MethodItem(ref m, _) => { method(w, item, m.header, &m.generics, &m.decl, link, parent, cx, render_mode) } - clean::AssocConstItem(ref ty, ref default) => assoc_const( - w, - item, - ty, - default.as_ref(), - link, - if parent == ItemType::Trait { " " } else { "" }, - cx, - ), + clean::AssocConstItem(ref ty, _) => { + assoc_const(w, item, ty, link, if parent == ItemType::Trait { " " } else { "" }, cx) + } clean::AssocTypeItem(ref bounds, ref default) => assoc_type( w, item, @@ -1467,7 +1460,7 @@ fn render_impl( w.write_str(""); w.write_str(""); } - clean::AssocConstItem(ref ty, ref default) => { + clean::AssocConstItem(ref ty, _) => { let source_id = format!("{}.{}", item_type, name); let id = cx.derive_id(source_id.clone()); write!( @@ -1482,7 +1475,6 @@ fn render_impl( w, item, ty, - default.as_ref(), link.anchor(if trait_.is_some() { &source_id } else { &id }), "", cx,