rustdoc: Pretty-print assoc const defaults on-demand
This should improve performance, clean up the code, and help pave the way for #83035.
This commit is contained in:
parent
b8dc6aa673
commit
d38ae767f8
@ -912,7 +912,9 @@ fn clean(&self, cx: &mut DocContext<'_>) -> Item {
|
|||||||
cx.with_param_env(local_did, |cx| {
|
cx.with_param_env(local_did, |cx| {
|
||||||
let inner = match self.kind {
|
let inner = match self.kind {
|
||||||
hir::TraitItemKind::Const(ref ty, default) => {
|
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)) => {
|
hir::TraitItemKind::Fn(ref sig, hir::TraitFn::Provided(body)) => {
|
||||||
let mut m = clean_function(cx, sig, &self.generics, body);
|
let mut m = clean_function(cx, sig, &self.generics, body);
|
||||||
@ -959,7 +961,8 @@ fn clean(&self, cx: &mut DocContext<'_>) -> Item {
|
|||||||
cx.with_param_env(local_did, |cx| {
|
cx.with_param_env(local_did, |cx| {
|
||||||
let inner = match self.kind {
|
let inner = match self.kind {
|
||||||
hir::ImplItemKind::Const(ref ty, expr) => {
|
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) => {
|
hir::ImplItemKind::Fn(ref sig, body) => {
|
||||||
let mut m = clean_function(cx, sig, &self.generics, body);
|
let mut m = clean_function(cx, sig, &self.generics, body);
|
||||||
@ -1009,7 +1012,7 @@ fn clean(&self, cx: &mut DocContext<'_>) -> Item {
|
|||||||
ty::AssocKind::Const => {
|
ty::AssocKind::Const => {
|
||||||
let ty = tcx.type_of(self.def_id);
|
let ty = tcx.type_of(self.def_id);
|
||||||
let default = if self.defaultness.has_value() {
|
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 {
|
} else {
|
||||||
None
|
None
|
||||||
};
|
};
|
||||||
|
@ -670,7 +670,7 @@ pub fn from_def_id_and_attrs_and_parts(
|
|||||||
MacroItem(Macro),
|
MacroItem(Macro),
|
||||||
ProcMacroItem(ProcMacro),
|
ProcMacroItem(ProcMacro),
|
||||||
PrimitiveItem(PrimitiveType),
|
PrimitiveItem(PrimitiveType),
|
||||||
AssocConstItem(Type, Option<String>),
|
AssocConstItem(Type, Option<ConstantKind>),
|
||||||
/// An associated item in a trait or trait impl.
|
/// An associated item in a trait or trait impl.
|
||||||
///
|
///
|
||||||
/// The bounds may be non-empty if there is a `where` clause.
|
/// The bounds may be non-empty if there is a `where` clause.
|
||||||
@ -2153,7 +2153,21 @@ impl Path {
|
|||||||
|
|
||||||
impl Constant {
|
impl Constant {
|
||||||
crate fn expr(&self, tcx: TyCtxt<'_>) -> String {
|
crate fn expr(&self, tcx: TyCtxt<'_>) -> String {
|
||||||
match self.kind {
|
self.kind.expr(tcx)
|
||||||
|
}
|
||||||
|
|
||||||
|
crate fn value(&self, tcx: TyCtxt<'_>) -> Option<String> {
|
||||||
|
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::TyConst { ref expr } => expr.clone(),
|
||||||
ConstantKind::Extern { def_id } => print_inlined_const(tcx, def_id),
|
ConstantKind::Extern { def_id } => print_inlined_const(tcx, def_id),
|
||||||
ConstantKind::Local { body, .. } | ConstantKind::Anonymous { body } => {
|
ConstantKind::Local { body, .. } | ConstantKind::Anonymous { body } => {
|
||||||
@ -2163,7 +2177,7 @@ impl Constant {
|
|||||||
}
|
}
|
||||||
|
|
||||||
crate fn value(&self, tcx: TyCtxt<'_>) -> Option<String> {
|
crate fn value(&self, tcx: TyCtxt<'_>) -> Option<String> {
|
||||||
match self.kind {
|
match *self {
|
||||||
ConstantKind::TyConst { .. } | ConstantKind::Anonymous { .. } => None,
|
ConstantKind::TyConst { .. } | ConstantKind::Anonymous { .. } => None,
|
||||||
ConstantKind::Extern { def_id } | ConstantKind::Local { def_id, .. } => {
|
ConstantKind::Extern { def_id } | ConstantKind::Local { def_id, .. } => {
|
||||||
print_evaluated_const(tcx, def_id)
|
print_evaluated_const(tcx, def_id)
|
||||||
@ -2172,7 +2186,7 @@ impl Constant {
|
|||||||
}
|
}
|
||||||
|
|
||||||
crate fn is_literal(&self, tcx: TyCtxt<'_>) -> bool {
|
crate fn is_literal(&self, tcx: TyCtxt<'_>) -> bool {
|
||||||
match self.kind {
|
match *self {
|
||||||
ConstantKind::TyConst { .. } => false,
|
ConstantKind::TyConst { .. } => false,
|
||||||
ConstantKind::Extern { def_id } => def_id.as_local().map_or(false, |def_id| {
|
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))
|
is_literal_expr(tcx, tcx.hir().local_def_id_to_hir_id(def_id))
|
||||||
|
@ -762,7 +762,7 @@ fn assoc_const(
|
|||||||
w: &mut Buffer,
|
w: &mut Buffer,
|
||||||
it: &clean::Item,
|
it: &clean::Item,
|
||||||
ty: &clean::Type,
|
ty: &clean::Type,
|
||||||
_default: Option<&String>,
|
_default: Option<&clean::ConstantKind>,
|
||||||
link: AssocItemLink<'_>,
|
link: AssocItemLink<'_>,
|
||||||
extra: &str,
|
extra: &str,
|
||||||
cx: &Context<'_>,
|
cx: &Context<'_>,
|
||||||
|
@ -219,7 +219,9 @@ fn from_clean_item(item: clean::Item, tcx: TyCtxt<'_>) -> ItemEnum {
|
|||||||
MacroItem(m) => ItemEnum::Macro(m.source),
|
MacroItem(m) => ItemEnum::Macro(m.source),
|
||||||
ProcMacroItem(m) => ItemEnum::ProcMacro(m.into_tcx(tcx)),
|
ProcMacroItem(m) => ItemEnum::ProcMacro(m.into_tcx(tcx)),
|
||||||
PrimitiveItem(p) => ItemEnum::PrimitiveType(p.as_sym().to_string()),
|
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 {
|
AssocTypeItem(g, t) => ItemEnum::AssocType {
|
||||||
bounds: g.into_iter().map(|x| x.into_tcx(tcx)).collect(),
|
bounds: g.into_iter().map(|x| x.into_tcx(tcx)).collect(),
|
||||||
default: t.map(|x| x.into_tcx(tcx)),
|
default: t.map(|x| x.into_tcx(tcx)),
|
||||||
|
Loading…
Reference in New Issue
Block a user