Skip to content

Commit efbd8f6

Browse files
committed
rustdoc: Compute enum discriminant on demand
1 parent b76a012 commit efbd8f6

File tree

3 files changed

+28
-24
lines changed

3 files changed

+28
-24
lines changed

src/librustdoc/clean/mod.rs

+4-14
Original file line numberDiff line numberDiff line change
@@ -1787,10 +1787,7 @@ pub(crate) fn clean_visibility(vis: ty::Visibility) -> Visibility {
17871787
pub(crate) fn clean_variant_def<'tcx>(variant: &ty::VariantDef, cx: &mut DocContext<'tcx>) -> Item {
17881788
let kind = match variant.ctor_kind {
17891789
CtorKind::Const => Variant::CLike(match variant.discr {
1790-
ty::VariantDiscr::Explicit(def_id) => Some(Discriminant {
1791-
expr: None,
1792-
value: print_evaluated_const(cx.tcx, def_id, false).unwrap(),
1793-
}),
1790+
ty::VariantDiscr::Explicit(def_id) => Some(Discriminant { expr: None, value: def_id }),
17941791
ty::VariantDiscr::Relative(_) => None,
17951792
}),
17961793
CtorKind::Fn => Variant::Tuple(
@@ -1820,16 +1817,9 @@ fn clean_variant_data<'tcx>(
18201817
hir::VariantData::Tuple(..) => {
18211818
Variant::Tuple(variant.fields().iter().map(|x| clean_field(x, cx)).collect())
18221819
}
1823-
hir::VariantData::Unit(..) => Variant::CLike(disr_expr.map(|disr| {
1824-
Discriminant {
1825-
expr: Some(print_const_expr(cx.tcx, disr.body)),
1826-
value: print_evaluated_const(
1827-
cx.tcx,
1828-
cx.tcx.hir().local_def_id(disr.hir_id).to_def_id(),
1829-
false,
1830-
)
1831-
.unwrap(),
1832-
}
1820+
hir::VariantData::Unit(..) => Variant::CLike(disr_expr.map(|disr| Discriminant {
1821+
expr: Some(disr.body),
1822+
value: cx.tcx.hir().local_def_id(disr.hir_id).to_def_id(),
18331823
})),
18341824
}
18351825
}

src/librustdoc/clean/types.rs

+14-2
Original file line numberDiff line numberDiff line change
@@ -2116,8 +2116,20 @@ impl Variant {
21162116
pub(crate) struct Discriminant {
21172117
// In the case of cross crate re-exports, we don't have the nessesary information
21182118
// to reconstruct the expression of the discriminant, only the value.
2119-
pub(crate) expr: Option<String>,
2120-
pub(crate) value: String,
2119+
pub(super) expr: Option<BodyId>,
2120+
pub(super) value: DefId,
2121+
}
2122+
2123+
impl Discriminant {
2124+
/// Will be `None` in the case of cross-crate reexports, and may be
2125+
/// simplified
2126+
pub(crate) fn expr(&self, tcx: TyCtxt<'_>) -> Option<String> {
2127+
self.expr.map(|body| print_const_expr(tcx, body))
2128+
}
2129+
/// Will always be a machine readable number, without underscores or suffixes.
2130+
pub(crate) fn value(&self, tcx: TyCtxt<'_>) -> String {
2131+
print_evaluated_const(tcx, self.value, false).unwrap()
2132+
}
21212133
}
21222134

21232135
/// Small wrapper around [`rustc_span::Span`] that adds helper methods

src/librustdoc/json/conversions.rs

+10-8
Original file line numberDiff line numberDiff line change
@@ -662,7 +662,7 @@ impl FromWithTcx<clean::Variant> for Variant {
662662
fn from_tcx(variant: clean::Variant, tcx: TyCtxt<'_>) -> Self {
663663
use clean::Variant::*;
664664
match variant {
665-
CLike(disr) => Variant::Plain(disr.map(convert_discriminant)),
665+
CLike(disr) => Variant::Plain(disr.map(|disr| disr.into_tcx(tcx))),
666666
Tuple(fields) => Variant::Tuple(
667667
fields
668668
.into_iter()
@@ -678,13 +678,15 @@ impl FromWithTcx<clean::Variant> for Variant {
678678
}
679679
}
680680

681-
fn convert_discriminant(disr: clean::Discriminant) -> Discriminant {
682-
Discriminant {
683-
// expr is only none if going throught the inlineing path, which gets
684-
// `rustc_middle` types, not `rustc_hir`, but because JSON never inlines
685-
// the expr is always some.
686-
expr: disr.expr.unwrap(),
687-
value: disr.value,
681+
impl FromWithTcx<clean::Discriminant> for Discriminant {
682+
fn from_tcx(disr: clean::Discriminant, tcx: TyCtxt<'_>) -> Self {
683+
Discriminant {
684+
// expr is only none if going throught the inlineing path, which gets
685+
// `rustc_middle` types, not `rustc_hir`, but because JSON never inlines
686+
// the expr is always some.
687+
expr: disr.expr(tcx).unwrap(),
688+
value: disr.value(tcx),
689+
}
688690
}
689691
}
690692

0 commit comments

Comments
 (0)