mirror of
https://github.com/rust-lang/rust.git
synced 2025-02-27 22:34:14 +00:00
clean: Always store enum disriminant.
This commit is contained in:
parent
bb6e76df06
commit
b7b252a4f4
@ -1949,20 +1949,28 @@ pub(crate) fn clean_field_with_def_id(
|
||||
}
|
||||
|
||||
pub(crate) fn clean_variant_def<'tcx>(variant: &ty::VariantDef, cx: &mut DocContext<'tcx>) -> Item {
|
||||
let discriminant = match variant.discr {
|
||||
ty::VariantDiscr::Explicit(def_id) => Some(Discriminant { expr: None, value: def_id }),
|
||||
ty::VariantDiscr::Relative(_) => None,
|
||||
};
|
||||
|
||||
let kind = match variant.ctor_kind() {
|
||||
Some(CtorKind::Const) => Variant::CLike(match variant.discr {
|
||||
ty::VariantDiscr::Explicit(def_id) => Some(Discriminant { expr: None, value: def_id }),
|
||||
ty::VariantDiscr::Relative(_) => None,
|
||||
}),
|
||||
Some(CtorKind::Fn) => Variant::Tuple(
|
||||
Some(CtorKind::Const) => VariantKind::CLike,
|
||||
Some(CtorKind::Fn) => VariantKind::Tuple(
|
||||
variant.fields.iter().map(|field| clean_middle_field(field, cx)).collect(),
|
||||
),
|
||||
None => Variant::Struct(VariantStruct {
|
||||
None => VariantKind::Struct(VariantStruct {
|
||||
ctor_kind: None,
|
||||
fields: variant.fields.iter().map(|field| clean_middle_field(field, cx)).collect(),
|
||||
}),
|
||||
};
|
||||
Item::from_def_id_and_parts(variant.def_id, Some(variant.name), VariantItem(kind), cx)
|
||||
|
||||
Item::from_def_id_and_parts(
|
||||
variant.def_id,
|
||||
Some(variant.name),
|
||||
VariantItem(Variant { kind, discriminant }),
|
||||
cx,
|
||||
)
|
||||
}
|
||||
|
||||
fn clean_variant_data<'tcx>(
|
||||
@ -1970,19 +1978,23 @@ fn clean_variant_data<'tcx>(
|
||||
disr_expr: &Option<hir::AnonConst>,
|
||||
cx: &mut DocContext<'tcx>,
|
||||
) -> Variant {
|
||||
match variant {
|
||||
hir::VariantData::Struct(..) => Variant::Struct(VariantStruct {
|
||||
let discriminant = disr_expr.map(|disr| Discriminant {
|
||||
expr: Some(disr.body),
|
||||
value: cx.tcx.hir().local_def_id(disr.hir_id).to_def_id(),
|
||||
});
|
||||
|
||||
let kind = match variant {
|
||||
hir::VariantData::Struct(..) => VariantKind::Struct(VariantStruct {
|
||||
ctor_kind: None,
|
||||
fields: variant.fields().iter().map(|x| clean_field(x, cx)).collect(),
|
||||
}),
|
||||
hir::VariantData::Tuple(..) => {
|
||||
Variant::Tuple(variant.fields().iter().map(|x| clean_field(x, cx)).collect())
|
||||
VariantKind::Tuple(variant.fields().iter().map(|x| clean_field(x, cx)).collect())
|
||||
}
|
||||
hir::VariantData::Unit(..) => Variant::CLike(disr_expr.map(|disr| Discriminant {
|
||||
expr: Some(disr.body),
|
||||
value: cx.tcx.hir().local_def_id(disr.hir_id).to_def_id(),
|
||||
})),
|
||||
}
|
||||
hir::VariantData::Unit(..) => VariantKind::CLike,
|
||||
};
|
||||
|
||||
Variant { discriminant, kind }
|
||||
}
|
||||
|
||||
fn clean_path<'tcx>(path: &hir::Path<'tcx>, cx: &mut DocContext<'tcx>) -> Path {
|
||||
|
@ -807,8 +807,11 @@ impl ItemKind {
|
||||
match self {
|
||||
StructItem(s) => s.fields.iter(),
|
||||
UnionItem(u) => u.fields.iter(),
|
||||
VariantItem(Variant::Struct(v)) => v.fields.iter(),
|
||||
VariantItem(Variant::Tuple(v)) => v.iter(),
|
||||
VariantItem(v) => match &v.kind {
|
||||
VariantKind::CLike => [].iter(),
|
||||
VariantKind::Tuple(t) => t.iter(),
|
||||
VariantKind::Struct(s) => s.fields.iter(),
|
||||
},
|
||||
EnumItem(e) => e.variants.iter(),
|
||||
TraitItem(t) => t.items.iter(),
|
||||
ImplItem(i) => i.items.iter(),
|
||||
@ -824,7 +827,6 @@ impl ItemKind {
|
||||
| TyMethodItem(_)
|
||||
| MethodItem(_, _)
|
||||
| StructFieldItem(_)
|
||||
| VariantItem(_)
|
||||
| ForeignFunctionItem(_)
|
||||
| ForeignStaticItem(_)
|
||||
| ForeignTypeItem
|
||||
@ -2136,17 +2138,23 @@ impl Enum {
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub(crate) enum Variant {
|
||||
CLike(Option<Discriminant>),
|
||||
pub(crate) struct Variant {
|
||||
pub kind: VariantKind,
|
||||
pub discriminant: Option<Discriminant>,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub(crate) enum VariantKind {
|
||||
CLike,
|
||||
Tuple(Vec<Item>),
|
||||
Struct(VariantStruct),
|
||||
}
|
||||
|
||||
impl Variant {
|
||||
pub(crate) fn has_stripped_entries(&self) -> Option<bool> {
|
||||
match *self {
|
||||
Self::Struct(ref struct_) => Some(struct_.has_stripped_entries()),
|
||||
Self::CLike(..) | Self::Tuple(_) => None,
|
||||
match &self.kind {
|
||||
VariantKind::Struct(struct_) => Some(struct_.has_stripped_entries()),
|
||||
VariantKind::CLike | VariantKind::Tuple(_) => None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -37,17 +37,21 @@ pub(crate) trait DocFolder: Sized {
|
||||
i.items = i.items.into_iter().filter_map(|x| self.fold_item(x)).collect();
|
||||
ImplItem(i)
|
||||
}
|
||||
VariantItem(i) => match i {
|
||||
Variant::Struct(mut j) => {
|
||||
j.fields = j.fields.into_iter().filter_map(|x| self.fold_item(x)).collect();
|
||||
VariantItem(Variant::Struct(j))
|
||||
}
|
||||
Variant::Tuple(fields) => {
|
||||
let fields = fields.into_iter().filter_map(|x| self.fold_item(x)).collect();
|
||||
VariantItem(Variant::Tuple(fields))
|
||||
}
|
||||
Variant::CLike(disr) => VariantItem(Variant::CLike(disr)),
|
||||
},
|
||||
VariantItem(Variant { kind, discriminant }) => {
|
||||
let kind = match kind {
|
||||
VariantKind::Struct(mut j) => {
|
||||
j.fields = j.fields.into_iter().filter_map(|x| self.fold_item(x)).collect();
|
||||
VariantKind::Struct(j)
|
||||
}
|
||||
VariantKind::Tuple(fields) => {
|
||||
let fields = fields.into_iter().filter_map(|x| self.fold_item(x)).collect();
|
||||
VariantKind::Tuple(fields)
|
||||
}
|
||||
VariantKind::CLike => VariantKind::CLike,
|
||||
};
|
||||
|
||||
VariantItem(Variant { kind, discriminant })
|
||||
}
|
||||
ExternCrateItem { src: _ }
|
||||
| ImportItem(_)
|
||||
| FunctionItem(_)
|
||||
|
@ -1220,15 +1220,15 @@ fn item_enum(w: &mut Buffer, cx: &mut Context<'_>, it: &clean::Item, e: &clean::
|
||||
w.write_str(" ");
|
||||
let name = v.name.unwrap();
|
||||
match *v.kind {
|
||||
clean::VariantItem(ref var) => match var {
|
||||
// FIXME(#101337): Show discriminant
|
||||
clean::Variant::CLike(..) => write!(w, "{}", name),
|
||||
clean::Variant::Tuple(ref s) => {
|
||||
// FIXME(#101337): Show discriminant
|
||||
clean::VariantItem(ref var) => match var.kind {
|
||||
clean::VariantKind::CLike => write!(w, "{}", name),
|
||||
clean::VariantKind::Tuple(ref s) => {
|
||||
write!(w, "{}(", name);
|
||||
print_tuple_struct_fields(w, cx, s);
|
||||
w.write_str(")");
|
||||
}
|
||||
clean::Variant::Struct(ref s) => {
|
||||
clean::VariantKind::Struct(ref s) => {
|
||||
render_struct(
|
||||
w,
|
||||
v,
|
||||
@ -1286,25 +1286,28 @@ fn item_enum(w: &mut Buffer, cx: &mut Context<'_>, it: &clean::Item, e: &clean::
|
||||
" rightside",
|
||||
);
|
||||
write!(w, "<h3 class=\"code-header\">{name}", name = variant.name.unwrap());
|
||||
if let clean::VariantItem(clean::Variant::Tuple(ref s)) = *variant.kind {
|
||||
|
||||
let clean::VariantItem(variant_data) = &*variant.kind else { unreachable!() };
|
||||
|
||||
if let clean::VariantKind::Tuple(ref s) = variant_data.kind {
|
||||
w.write_str("(");
|
||||
print_tuple_struct_fields(w, cx, s);
|
||||
w.write_str(")");
|
||||
}
|
||||
w.write_str("</h3></section>");
|
||||
|
||||
use crate::clean::Variant;
|
||||
|
||||
let heading_and_fields = match &*variant.kind {
|
||||
clean::VariantItem(Variant::Struct(s)) => Some(("Fields", &s.fields)),
|
||||
// Documentation on tuple variant fields is rare, so to reduce noise we only emit
|
||||
// the section if at least one field is documented.
|
||||
clean::VariantItem(Variant::Tuple(fields))
|
||||
if fields.iter().any(|f| f.doc_value().is_some()) =>
|
||||
{
|
||||
Some(("Tuple Fields", fields))
|
||||
let heading_and_fields = match &variant_data.kind {
|
||||
clean::VariantKind::Struct(s) => Some(("Fields", &s.fields)),
|
||||
clean::VariantKind::Tuple(fields) => {
|
||||
// Documentation on tuple variant fields is rare, so to reduce noise we only emit
|
||||
// the section if at least one field is documented.
|
||||
if fields.iter().any(|f| f.doc_value().is_some()) {
|
||||
Some(("Tuple Fields", fields))
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}
|
||||
_ => None,
|
||||
clean::VariantKind::CLike => None,
|
||||
};
|
||||
|
||||
if let Some((heading, fields)) = heading_and_fields {
|
||||
|
@ -646,9 +646,12 @@ impl FromWithTcx<clean::Enum> for Enum {
|
||||
|
||||
impl FromWithTcx<clean::Variant> for Variant {
|
||||
fn from_tcx(variant: clean::Variant, tcx: TyCtxt<'_>) -> Self {
|
||||
use clean::Variant::*;
|
||||
match variant {
|
||||
CLike(disr) => Variant::Plain(disr.map(|disr| disr.into_tcx(tcx))),
|
||||
use clean::VariantKind::*;
|
||||
|
||||
let discriminant = variant.discriminant.map(|d| d.into_tcx(tcx));
|
||||
|
||||
match variant.kind {
|
||||
CLike => Variant::Plain(discriminant),
|
||||
Tuple(fields) => Variant::Tuple(ids_keeping_stripped(fields, tcx)),
|
||||
Struct(s) => Variant::Struct {
|
||||
fields_stripped: s.has_stripped_entries(),
|
||||
|
@ -132,7 +132,10 @@ impl<'a, 'tcx> DocFolder for Stripper<'a, 'tcx> {
|
||||
// implementations of traits are always public.
|
||||
clean::ImplItem(ref imp) if imp.trait_.is_some() => true,
|
||||
// Variant fields have inherited visibility
|
||||
clean::VariantItem(clean::Variant::Struct(..) | clean::Variant::Tuple(..)) => true,
|
||||
clean::VariantItem(clean::Variant {
|
||||
kind: clean::VariantKind::Struct(..) | clean::VariantKind::Tuple(..),
|
||||
..
|
||||
}) => true,
|
||||
_ => false,
|
||||
};
|
||||
|
||||
|
@ -17,10 +17,10 @@ pub(crate) trait DocVisitor: Sized {
|
||||
EnumItem(i) => i.variants.iter().for_each(|x| self.visit_item(x)),
|
||||
TraitItem(i) => i.items.iter().for_each(|x| self.visit_item(x)),
|
||||
ImplItem(i) => i.items.iter().for_each(|x| self.visit_item(x)),
|
||||
VariantItem(i) => match i {
|
||||
Variant::Struct(j) => j.fields.iter().for_each(|x| self.visit_item(x)),
|
||||
Variant::Tuple(fields) => fields.iter().for_each(|x| self.visit_item(x)),
|
||||
Variant::CLike(_) => {}
|
||||
VariantItem(i) => match &i.kind {
|
||||
VariantKind::Struct(j) => j.fields.iter().for_each(|x| self.visit_item(x)),
|
||||
VariantKind::Tuple(fields) => fields.iter().for_each(|x| self.visit_item(x)),
|
||||
VariantKind::CLike => {}
|
||||
},
|
||||
ExternCrateItem { src: _ }
|
||||
| ImportItem(_)
|
||||
|
Loading…
Reference in New Issue
Block a user