Skip to content

Commit 9aa68e0

Browse files
committed
Rustdoc-Json: Put fields for enum typle variants in their own item.
Closes #100587 Closes #92945
1 parent 1cff564 commit 9aa68e0

File tree

14 files changed

+47
-66
lines changed

14 files changed

+47
-66
lines changed

src/etc/check_missing_items.py

+1-5
Original file line numberDiff line numberDiff line change
@@ -143,11 +143,7 @@ def check_type(ty):
143143
set(item["inner"]["variants"]) | set(item["inner"]["impls"])
144144
) - visited
145145
elif item["kind"] == "variant":
146-
if item["inner"]["variant_kind"] == "tuple":
147-
for ty in item["inner"]["variant_inner"]:
148-
check_type(ty)
149-
elif item["inner"]["variant_kind"] == "struct":
150-
work_list |= set(item["inner"]["variant_inner"]) - visited
146+
work_list |= set(item["inner"]["fields"]) - visited
151147
elif item["kind"] in ("function", "method"):
152148
check_generics(item["inner"]["generics"])
153149
check_decl(item["inner"]["decl"])

src/librustdoc/json/conversions.rs

+25-39
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,7 @@ fn from_clean_item(item: clean::Item, tcx: TyCtxt<'_>) -> ItemEnum {
238238

239239
match *item.kind {
240240
ModuleItem(m) => {
241-
ItemEnum::Module(Module { is_crate, items: ids(m.items, tcx), is_stripped: false })
241+
ItemEnum::Module(Module { is_crate, items: ids(&m.items, tcx), is_stripped: false })
242242
}
243243
ImportItem(i) => ItemEnum::Import(i.into_tcx(tcx)),
244244
StructItem(s) => ItemEnum::Struct(s.into_tcx(tcx)),
@@ -282,7 +282,7 @@ fn from_clean_item(item: clean::Item, tcx: TyCtxt<'_>) -> ItemEnum {
282282
match *inner {
283283
ModuleItem(m) => ItemEnum::Module(Module {
284284
is_crate,
285-
items: ids(m.items, tcx),
285+
items: ids(&m.items, tcx),
286286
is_stripped: true,
287287
}),
288288
// `convert_item` early returns `None` for stripped items we're not including
@@ -301,10 +301,10 @@ impl FromWithTcx<clean::Struct> for Struct {
301301
let fields_stripped = struct_.has_stripped_entries();
302302
let clean::Struct { struct_type, generics, fields } = struct_;
303303
Struct {
304-
struct_type: from_ctor_kind(struct_type),
304+
kind: from_ctor_kind(struct_type),
305305
generics: generics.into_tcx(tcx),
306306
fields_stripped,
307-
fields: ids(fields, tcx),
307+
fields: ids(&fields, tcx),
308308
impls: Vec::new(), // Added in JsonRenderer::item
309309
}
310310
}
@@ -317,17 +317,17 @@ impl FromWithTcx<clean::Union> for Union {
317317
Union {
318318
generics: generics.into_tcx(tcx),
319319
fields_stripped,
320-
fields: ids(fields, tcx),
320+
fields: ids(&fields, tcx),
321321
impls: Vec::new(), // Added in JsonRenderer::item
322322
}
323323
}
324324
}
325325

326-
pub(crate) fn from_ctor_kind(struct_type: CtorKind) -> StructType {
326+
pub(crate) fn from_ctor_kind(struct_type: CtorKind) -> StructKind {
327327
match struct_type {
328-
CtorKind::Fictive => StructType::Plain,
329-
CtorKind::Fn => StructType::Tuple,
330-
CtorKind::Const => StructType::Unit,
328+
CtorKind::Fictive => StructKind::Struct,
329+
CtorKind::Fn => StructKind::Tuple,
330+
CtorKind::Const => StructKind::Unit,
331331
}
332332
}
333333

@@ -551,7 +551,7 @@ impl FromWithTcx<clean::Trait> for Trait {
551551
Trait {
552552
is_auto,
553553
is_unsafe,
554-
items: ids(items, tcx),
554+
items: ids(&items, tcx),
555555
generics: generics.into_tcx(tcx),
556556
bounds: bounds.into_tcx(tcx),
557557
implementations: Vec::new(), // Added in JsonRenderer::item
@@ -591,7 +591,7 @@ impl FromWithTcx<clean::Impl> for Impl {
591591
.collect(),
592592
trait_: trait_.map(|path| path.into_tcx(tcx)),
593593
for_: for_.into_tcx(tcx),
594-
items: ids(items, tcx),
594+
items: ids(&items, tcx),
595595
negative: negative_polarity,
596596
synthetic,
597597
blanket_impl: blanket_impl.map(|x| x.into_tcx(tcx)),
@@ -634,42 +634,28 @@ impl FromWithTcx<clean::Enum> for Enum {
634634
Enum {
635635
generics: generics.into_tcx(tcx),
636636
variants_stripped,
637-
variants: ids(variants, tcx),
637+
variants: ids(&variants, tcx),
638638
impls: Vec::new(), // Added in JsonRenderer::item
639639
}
640640
}
641641
}
642642

643-
impl FromWithTcx<clean::VariantStruct> for Struct {
644-
fn from_tcx(struct_: clean::VariantStruct, tcx: TyCtxt<'_>) -> Self {
645-
let fields_stripped = struct_.has_stripped_entries();
646-
let clean::VariantStruct { struct_type, fields } = struct_;
647-
Struct {
648-
struct_type: from_ctor_kind(struct_type),
649-
generics: Generics { params: vec![], where_predicates: vec![] },
650-
fields_stripped,
651-
fields: ids(fields, tcx),
652-
impls: Vec::new(),
653-
}
654-
}
655-
}
656-
657643
impl FromWithTcx<clean::Variant> for Variant {
658644
fn from_tcx(variant: clean::Variant, tcx: TyCtxt<'_>) -> Self {
659645
use clean::Variant::*;
646+
660647
match variant {
661-
CLike => Variant::Plain,
662-
Tuple(fields) => Variant::Tuple(
663-
fields
664-
.into_iter()
665-
.filter_map(|f| match *f.kind {
666-
clean::StructFieldItem(ty) => Some(ty.into_tcx(tcx)),
667-
clean::StrippedItem(_) => None,
668-
_ => unreachable!(),
669-
})
670-
.collect(),
671-
),
672-
Struct(s) => Variant::Struct(ids(s.fields, tcx)),
648+
CLike => Variant { kind: StructKind::Unit, fields: Vec::new(), fields_stripped: false },
649+
Tuple(fields) => Variant {
650+
kind: StructKind::Tuple,
651+
fields: ids(&fields, tcx),
652+
fields_stripped: fields.iter().any(|i| i.is_stripped()),
653+
},
654+
Struct(s) => Variant {
655+
kind: StructKind::Struct,
656+
fields: ids(&s.fields, tcx),
657+
fields_stripped: s.has_stripped_entries(),
658+
},
673659
}
674660
}
675661
}
@@ -773,7 +759,7 @@ impl FromWithTcx<ItemType> for ItemKind {
773759
}
774760
}
775761

776-
fn ids(items: impl IntoIterator<Item = clean::Item>, tcx: TyCtxt<'_>) -> Vec<Id> {
762+
fn ids<'a>(items: impl IntoIterator<Item = &'a clean::Item>, tcx: TyCtxt<'_>) -> Vec<Id> {
777763
items
778764
.into_iter()
779765
.filter(|x| !x.is_stripped() && !x.is_keyword())

src/rustdoc-json-types/lib.rs

+8-10
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use std::path::PathBuf;
99
use serde::{Deserialize, Serialize};
1010

1111
/// rustdoc format-version.
12-
pub const FORMAT_VERSION: u32 = 18;
12+
pub const FORMAT_VERSION: u32 = 19;
1313

1414
/// A `Crate` is the root of the emitted JSON blob. It contains all type/documentation information
1515
/// about the language items in the local crate, as well as info about external items to allow
@@ -289,7 +289,7 @@ pub struct Union {
289289

290290
#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
291291
pub struct Struct {
292-
pub struct_type: StructType,
292+
pub kind: StructKind,
293293
pub generics: Generics,
294294
pub fields_stripped: bool,
295295
pub fields: Vec<Id>,
@@ -305,18 +305,16 @@ pub struct Enum {
305305
}
306306

307307
#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
308-
#[serde(rename_all = "snake_case")]
309-
#[serde(tag = "variant_kind", content = "variant_inner")]
310-
pub enum Variant {
311-
Plain,
312-
Tuple(Vec<Type>),
313-
Struct(Vec<Id>),
308+
pub struct Variant {
309+
pub kind: StructKind,
310+
pub fields: Vec<Id>,
311+
pub fields_stripped: bool,
314312
}
315313

316314
#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
317315
#[serde(rename_all = "snake_case")]
318-
pub enum StructType {
319-
Plain,
316+
pub enum StructKind {
317+
Struct,
320318
Tuple,
321319
Unit,
322320
}

src/rustdoc-json-types/tests.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use super::*;
33
#[test]
44
fn test_struct_info_roundtrip() {
55
let s = ItemEnum::Struct(Struct {
6-
struct_type: StructType::Plain,
6+
kind: StructKind::Struct,
77
generics: Generics { params: vec![], where_predicates: vec![] },
88
fields_stripped: false,
99
fields: vec![],

src/test/rustdoc-json/enum_variant_hidden.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,9 @@
55

66
// @has "$.index[*][?(@.name=='ParseError')]"
77
// @has "$.index[*][?(@.name=='UnexpectedEndTag')]"
8-
// @is "$.index[*][?(@.name=='UnexpectedEndTag')].inner.variant_kind" '"tuple"'
9-
// @is "$.index[*][?(@.name=='UnexpectedEndTag')].inner.variant_inner" []
8+
// @is "$.index[*][?(@.name=='UnexpectedEndTag')].inner.kind" '"tuple"'
9+
// @is "$.index[*][?(@.name=='UnexpectedEndTag')].inner.fields" []
10+
// @is "$.index[*][?(@.name=='UnexpectedEndTag')].inner.fields_stripped" true
1011

1112
pub enum ParseError {
1213
UnexpectedEndTag(#[doc(hidden)] u32),

src/test/rustdoc-json/enums/variant_struct.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// @has "$.index[*][?(@.name=='EnumStruct')].visibility" \"public\"
22
// @has "$.index[*][?(@.name=='EnumStruct')].kind" \"enum\"
33
pub enum EnumStruct {
4-
// @has "$.index[*][?(@.name=='VariantS')].inner.variant_kind" \"struct\"
4+
// @has "$.index[*][?(@.name=='VariantS')].inner.kind" \"struct\"
55
// @has "$.index[*][?(@.name=='x')].kind" \"struct_field\"
66
// @has "$.index[*][?(@.name=='y')].kind" \"struct_field\"
77
VariantS {

src/test/rustdoc-json/enums/variant_tuple_struct.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// @has "$.index[*][?(@.name=='EnumTupleStruct')].visibility" \"public\"
22
// @has "$.index[*][?(@.name=='EnumTupleStruct')].kind" \"enum\"
33
pub enum EnumTupleStruct {
4-
// @has "$.index[*][?(@.name=='VariantA')].inner.variant_kind" \"tuple\"
4+
// @has "$.index[*][?(@.name=='VariantA')].inner.kind" \"tuple\"
55
// @has "$.index[*][?(@.name=='0')].kind" \"struct_field\"
66
// @has "$.index[*][?(@.name=='1')].kind" \"struct_field\"
77
VariantA(u32, String),

src/test/rustdoc-json/nested.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ pub mod l1 {
1717
pub mod l3 {
1818

1919
// @is "$.index[*][?(@.name=='L4')].kind" \"struct\"
20-
// @is "$.index[*][?(@.name=='L4')].inner.struct_type" \"unit\"
20+
// @is "$.index[*][?(@.name=='L4')].inner.kind" \"unit\"
2121
// @set l4_id = "$.index[*][?(@.name=='L4')].id"
2222
// @ismany "$.index[*][?(@.name=='l3')].inner.items[*]" $l4_id
2323
pub struct L4;
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// @has "$.index[*][?(@.name=='PlainEmpty')].visibility" \"public\"
22
// @has "$.index[*][?(@.name=='PlainEmpty')].kind" \"struct\"
3-
// @has "$.index[*][?(@.name=='PlainEmpty')].inner.struct_type" \"plain\"
3+
// @has "$.index[*][?(@.name=='PlainEmpty')].inner.kind" \"struct\"
44
// @has "$.index[*][?(@.name=='PlainEmpty')].inner.fields_stripped" false
55
// @has "$.index[*][?(@.name=='PlainEmpty')].inner.fields" []
66
pub struct PlainEmpty {}
+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// @has "$.index[*][?(@.name=='Tuple')].visibility" \"public\"
22
// @has "$.index[*][?(@.name=='Tuple')].kind" \"struct\"
3-
// @has "$.index[*][?(@.name=='Tuple')].inner.struct_type" \"tuple\"
3+
// @has "$.index[*][?(@.name=='Tuple')].inner.kind" \"tuple\"
44
// @has "$.index[*][?(@.name=='Tuple')].inner.fields_stripped" true
55
pub struct Tuple(u32, String);

src/test/rustdoc-json/structs/unit.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// @has "$.index[*][?(@.name=='Unit')].visibility" \"public\"
22
// @has "$.index[*][?(@.name=='Unit')].kind" \"struct\"
3-
// @has "$.index[*][?(@.name=='Unit')].inner.struct_type" \"unit\"
3+
// @has "$.index[*][?(@.name=='Unit')].inner.kind" \"unit\"
44
// @has "$.index[*][?(@.name=='Unit')].inner.fields" []
55
pub struct Unit;

src/test/rustdoc-json/structs/with_generics.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use std::collections::HashMap;
66
// @has "$.index[*][?(@.name=='WithGenerics')].inner.generics.params[0].kind.type"
77
// @has "$.index[*][?(@.name=='WithGenerics')].inner.generics.params[1].name" \"U\"
88
// @has "$.index[*][?(@.name=='WithGenerics')].inner.generics.params[1].kind.type"
9-
// @has "$.index[*][?(@.name=='WithGenerics')].inner.struct_type" \"plain\"
9+
// @has "$.index[*][?(@.name=='WithGenerics')].inner.kind" \"struct\"
1010
// @has "$.index[*][?(@.name=='WithGenerics')].inner.fields_stripped" true
1111
pub struct WithGenerics<T, U> {
1212
stuff: Vec<T>,

src/test/rustdoc-json/structs/with_primitives.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
// @has "$.index[*][?(@.name=='WithPrimitives')].kind" \"struct\"
33
// @has "$.index[*][?(@.name=='WithPrimitives')].inner.generics.params[0].name" \"\'a\"
44
// @has "$.index[*][?(@.name=='WithPrimitives')].inner.generics.params[0].kind.lifetime.outlives" []
5-
// @has "$.index[*][?(@.name=='WithPrimitives')].inner.struct_type" \"plain\"
5+
// @has "$.index[*][?(@.name=='WithPrimitives')].inner.kind" \"struct\"
66
// @has "$.index[*][?(@.name=='WithPrimitives')].inner.fields_stripped" true
77
pub struct WithPrimitives<'a> {
88
num: u32,

src/test/rustdoc-json/unions/union.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// @has "$.index[*][?(@.name=='Union')].visibility" \"public\"
22
// @has "$.index[*][?(@.name=='Union')].kind" \"union\"
3-
// @!has "$.index[*][?(@.name=='Union')].inner.struct_type"
3+
// @!has "$.index[*][?(@.name=='Union')].inner.kind"
44
pub union Union {
55
int: i32,
66
float: f32,

0 commit comments

Comments
 (0)