Skip to content

Commit af6889c

Browse files
committed
rustdoc: bind typedef inner type items to the folding system
This let's us handle a multitude of things for free: - #[doc(hidden)] - private fields/variants - --document-private-items - --document-hidden-items And correct in the process the determination of "has stripped items" by doing the same logic done by other ones.
1 parent 6b3bba8 commit af6889c

File tree

6 files changed

+53
-36
lines changed

6 files changed

+53
-36
lines changed

src/librustdoc/clean/mod.rs

+2-7
Original file line numberDiff line numberDiff line change
@@ -971,10 +971,8 @@ fn clean_ty_alias_inner_type<'tcx>(
971971
.map(|variant| clean_variant_def_with_args(variant, args, cx))
972972
.collect();
973973

974-
let has_stripped_variants = adt_def.variants().len() != variants.len();
975974
TypeAliasInnerType::Enum {
976975
variants,
977-
has_stripped_variants,
978976
is_non_exhaustive: adt_def.is_variant_list_non_exhaustive(),
979977
}
980978
} else {
@@ -987,11 +985,10 @@ fn clean_ty_alias_inner_type<'tcx>(
987985
let fields: Vec<_> =
988986
clean_variant_def_with_args(variant, args, cx).kind.inner_items().cloned().collect();
989987

990-
let has_stripped_fields = variant.fields.len() != fields.len();
991988
if adt_def.is_struct() {
992-
TypeAliasInnerType::Struct { ctor_kind: variant.ctor_kind(), fields, has_stripped_fields }
989+
TypeAliasInnerType::Struct { ctor_kind: variant.ctor_kind(), fields }
993990
} else {
994-
TypeAliasInnerType::Union { fields, has_stripped_fields }
991+
TypeAliasInnerType::Union { fields }
995992
}
996993
})
997994
}
@@ -2415,7 +2412,6 @@ pub(crate) fn clean_variant_def_with_args<'tcx>(
24152412
variant
24162413
.fields
24172414
.iter()
2418-
.filter(|field| field.vis.is_public())
24192415
.map(|field| {
24202416
let ty = cx.tcx.type_of(field.did).instantiate(cx.tcx, args);
24212417
clean_field_with_def_id(
@@ -2431,7 +2427,6 @@ pub(crate) fn clean_variant_def_with_args<'tcx>(
24312427
fields: variant
24322428
.fields
24332429
.iter()
2434-
.filter(|field| field.vis.is_public())
24352430
.map(|field| {
24362431
let ty = cx.tcx.type_of(field.did).instantiate(cx.tcx, args);
24372432
clean_field_with_def_id(

src/librustdoc/clean/types.rs

+3-14
Original file line numberDiff line numberDiff line change
@@ -2231,20 +2231,9 @@ pub(crate) struct PathSegment {
22312231

22322232
#[derive(Clone, Debug)]
22332233
pub(crate) enum TypeAliasInnerType {
2234-
Enum {
2235-
variants: IndexVec<VariantIdx, Item>,
2236-
has_stripped_variants: bool,
2237-
is_non_exhaustive: bool,
2238-
},
2239-
Union {
2240-
fields: Vec<Item>,
2241-
has_stripped_fields: bool,
2242-
},
2243-
Struct {
2244-
ctor_kind: Option<CtorKind>,
2245-
fields: Vec<Item>,
2246-
has_stripped_fields: bool,
2247-
},
2234+
Enum { variants: IndexVec<VariantIdx, Item>, is_non_exhaustive: bool },
2235+
Union { fields: Vec<Item> },
2236+
Struct { ctor_kind: Option<CtorKind>, fields: Vec<Item> },
22482237
}
22492238

22502239
#[derive(Clone, Debug)]

src/librustdoc/fold.rs

+22-1
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,31 @@ pub(crate) trait DocFolder: Sized {
5252

5353
VariantItem(Variant { kind, discriminant })
5454
}
55+
TypeAliasItem(mut typealias) => {
56+
typealias.inner_type = typealias.inner_type.map(|inner_type| match inner_type {
57+
TypeAliasInnerType::Enum { variants, is_non_exhaustive } => {
58+
let variants = variants
59+
.into_iter_enumerated()
60+
.filter_map(|(_, x)| self.fold_item(x))
61+
.collect();
62+
63+
TypeAliasInnerType::Enum { variants, is_non_exhaustive }
64+
}
65+
TypeAliasInnerType::Union { fields } => {
66+
let fields = fields.into_iter().filter_map(|x| self.fold_item(x)).collect();
67+
TypeAliasInnerType::Union { fields }
68+
}
69+
TypeAliasInnerType::Struct { ctor_kind, fields } => {
70+
let fields = fields.into_iter().filter_map(|x| self.fold_item(x)).collect();
71+
TypeAliasInnerType::Struct { ctor_kind, fields }
72+
}
73+
});
74+
75+
TypeAliasItem(typealias)
76+
}
5577
ExternCrateItem { src: _ }
5678
| ImportItem(_)
5779
| FunctionItem(_)
58-
| TypeAliasItem(_)
5980
| OpaqueTyItem(_)
6081
| StaticItem(_)
6182
| ConstantItem(_)

src/librustdoc/formats/cache.rs

+1
Original file line numberDiff line numberDiff line change
@@ -457,6 +457,7 @@ impl<'a, 'tcx> DocFolder for CacheBuilder<'a, 'tcx> {
457457
| clean::StructItem(..)
458458
| clean::UnionItem(..)
459459
| clean::VariantItem(..)
460+
| clean::TypeAliasItem(..)
460461
| clean::ImplItem(..) => {
461462
self.cache.parent_stack.push(ParentStackItem::new(&item));
462463
(self.fold_item_recur(item), true)

src/librustdoc/html/render/print_item.rs

+20-13
Original file line numberDiff line numberDiff line change
@@ -1270,30 +1270,34 @@ fn item_type_alias(w: &mut Buffer, cx: &mut Context<'_>, it: &clean::Item, t: &c
12701270
}
12711271

12721272
match &t.inner_type {
1273-
Some(clean::TypeAliasInnerType::Enum {
1274-
variants,
1275-
has_stripped_variants: has_stripped_entries,
1276-
is_non_exhaustive,
1277-
}) => {
1273+
Some(clean::TypeAliasInnerType::Enum { variants, is_non_exhaustive }) => {
12781274
toggle(w, |w| {
1275+
let variants_iter = || variants.iter().filter(|i| !i.is_stripped());
12791276
wrap_item(w, |w| {
1277+
let variants_len = variants.len();
1278+
let variants_count = variants_iter().count();
1279+
let has_stripped_entries = variants_len != variants_count;
1280+
12801281
write!(w, "enum {}{}", it.name.unwrap(), t.generics.print(cx));
12811282
render_enum_fields(
12821283
w,
12831284
cx,
12841285
None,
1285-
variants.iter(),
1286-
variants.len(),
1287-
*has_stripped_entries,
1286+
variants_iter(),
1287+
variants_count,
1288+
has_stripped_entries,
12881289
*is_non_exhaustive,
12891290
)
12901291
});
1291-
item_variants(w, cx, it, variants.iter());
1292+
item_variants(w, cx, it, variants_iter());
12921293
});
12931294
}
1294-
Some(clean::TypeAliasInnerType::Union { fields, has_stripped_fields }) => {
1295+
Some(clean::TypeAliasInnerType::Union { fields }) => {
12951296
toggle(w, |w| {
12961297
wrap_item(w, |w| {
1298+
let fields_count = fields.iter().filter(|i| !i.is_stripped()).count();
1299+
let has_stripped_fields = fields.len() != fields_count;
1300+
12971301
write!(w, "union {}{}", it.name.unwrap(), t.generics.print(cx));
12981302
render_struct_fields(
12991303
w,
@@ -1302,16 +1306,19 @@ fn item_type_alias(w: &mut Buffer, cx: &mut Context<'_>, it: &clean::Item, t: &c
13021306
fields,
13031307
"",
13041308
true,
1305-
*has_stripped_fields,
1309+
has_stripped_fields,
13061310
cx,
13071311
);
13081312
});
13091313
item_fields(w, cx, it, fields, None);
13101314
});
13111315
}
1312-
Some(clean::TypeAliasInnerType::Struct { ctor_kind, fields, has_stripped_fields }) => {
1316+
Some(clean::TypeAliasInnerType::Struct { ctor_kind, fields }) => {
13131317
toggle(w, |w| {
13141318
wrap_item(w, |w| {
1319+
let fields_count = fields.iter().filter(|i| !i.is_stripped()).count();
1320+
let has_stripped_fields = fields.len() != fields_count;
1321+
13151322
write!(w, "struct {}{}", it.name.unwrap(), t.generics.print(cx));
13161323
render_struct_fields(
13171324
w,
@@ -1320,7 +1327,7 @@ fn item_type_alias(w: &mut Buffer, cx: &mut Context<'_>, it: &clean::Item, t: &c
13201327
fields,
13211328
"",
13221329
true,
1323-
*has_stripped_fields,
1330+
has_stripped_fields,
13241331
cx,
13251332
);
13261333
});

tests/rustdoc/typedef-inner-variants.rs

+5-1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ pub enum IrTyKind<A, B> {
2222
TyKind(A, B),
2323
// no comment
2424
StructKind { a: A, },
25+
#[doc(hidden)]
26+
Unspecified,
2527
}
2628

2729
// @has 'inner_variants/type.NearlyTyKind.html'
@@ -52,7 +54,9 @@ pub type OneOrF64 = OneOr<f64>;
5254
// @has 'inner_variants/struct.One.html'
5355
pub struct One<T> {
5456
pub val: T,
55-
__hidden: T,
57+
#[doc(hidden)]
58+
pub __hidden: T,
59+
__private: T,
5660
}
5761

5862
// @has 'inner_variants/type.OneU64.html'

0 commit comments

Comments
 (0)