Skip to content

Commit b59c1aa

Browse files
Rollup merge of #101462 - aDotInTheVoid:rdj-enum-field-2, r=GuillaumeGomez
Rustdoc-Json: Store Variant Fields as their own item. Closes #100587 Closes #92945 Successor to #100762 Unlike that one, we don't have merge `StructType` and `Variant`, as after #101386 `Variant` stores enum specific information (discriminant). Resolves the naming discussion (#100762 (comment)) by having seperate enums for struct and enum kinds Resolves `#[doc(hidden)]` on tuple structs (#100762 (comment)) by storing as a `Vec<Option<Id>>` r? `@GuillaumeGomez`
2 parents 78968e5 + 065e0b9 commit b59c1aa

File tree

7 files changed

+203
-18
lines changed

7 files changed

+203
-18
lines changed

src/etc/check_missing_items.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -144,10 +144,10 @@ def check_type(ty):
144144
) - visited
145145
elif item["kind"] == "variant":
146146
if item["inner"]["variant_kind"] == "tuple":
147-
for ty in item["inner"]["variant_inner"]:
148-
check_type(ty)
147+
for field_id in filter(None, item["inner"]["variant_inner"]):
148+
work_list.add(field_id)
149149
elif item["inner"]["variant_kind"] == "struct":
150-
work_list |= set(item["inner"]["variant_inner"]) - visited
150+
work_list |= set(item["inner"]["variant_inner"]["fields"]) - visited
151151
elif item["kind"] in ("function", "method"):
152152
check_generics(item["inner"]["generics"])
153153
check_decl(item["inner"]["decl"])

src/librustdoc/json/conversions.rs

+21-11
Original file line numberDiff line numberDiff line change
@@ -663,17 +663,11 @@ impl FromWithTcx<clean::Variant> for Variant {
663663
use clean::Variant::*;
664664
match variant {
665665
CLike(disr) => Variant::Plain(disr.map(|disr| disr.into_tcx(tcx))),
666-
Tuple(fields) => Variant::Tuple(
667-
fields
668-
.into_iter()
669-
.filter_map(|f| match *f.kind {
670-
clean::StructFieldItem(ty) => Some(ty.into_tcx(tcx)),
671-
clean::StrippedItem(_) => None,
672-
_ => unreachable!(),
673-
})
674-
.collect(),
675-
),
676-
Struct(s) => Variant::Struct(ids(s.fields, tcx)),
666+
Tuple(fields) => Variant::Tuple(ids_keeping_stripped(fields, tcx)),
667+
Struct(s) => Variant::Struct {
668+
fields_stripped: s.has_stripped_entries(),
669+
fields: ids(s.fields, tcx),
670+
},
677671
}
678672
}
679673
}
@@ -796,3 +790,19 @@ fn ids(items: impl IntoIterator<Item = clean::Item>, tcx: TyCtxt<'_>) -> Vec<Id>
796790
.map(|i| from_item_id_with_name(i.item_id, tcx, i.name))
797791
.collect()
798792
}
793+
794+
fn ids_keeping_stripped(
795+
items: impl IntoIterator<Item = clean::Item>,
796+
tcx: TyCtxt<'_>,
797+
) -> Vec<Option<Id>> {
798+
items
799+
.into_iter()
800+
.map(|i| {
801+
if !i.is_stripped() && !i.is_keyword() {
802+
Some(from_item_id_with_name(i.item_id, tcx, i.name))
803+
} else {
804+
None
805+
}
806+
})
807+
.collect()
808+
}

src/rustdoc-json-types/lib.rs

+30-3
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 = 19;
12+
pub const FORMAT_VERSION: u32 = 20;
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
@@ -308,9 +308,36 @@ pub struct Enum {
308308
#[serde(rename_all = "snake_case")]
309309
#[serde(tag = "variant_kind", content = "variant_inner")]
310310
pub enum Variant {
311+
/// A variant with no parentheses, and possible discriminant.
312+
///
313+
/// ```rust
314+
/// enum Demo {
315+
/// PlainVariant,
316+
/// PlainWithDiscriminant = 1,
317+
/// }
318+
/// ```
311319
Plain(Option<Discriminant>),
312-
Tuple(Vec<Type>),
313-
Struct(Vec<Id>),
320+
/// A variant with unnamed fields.
321+
///
322+
/// Unlike most of json, `#[doc(hidden)]` fields will be given as `None`
323+
/// instead of being ommited, because order matters.
324+
///
325+
/// ```rust
326+
/// enum Demo {
327+
/// TupleVariant(i32),
328+
/// EmptyTupleVariant(),
329+
/// }
330+
/// ```
331+
Tuple(Vec<Option<Id>>),
332+
/// A variant with named fields.
333+
///
334+
/// ```rust
335+
/// enum Demo {
336+
/// StructVariant { x: i32 },
337+
/// EmptyStructVariant {},
338+
/// }
339+
/// ```
340+
Struct { fields: Vec<Id>, fields_stripped: bool },
314341
}
315342

316343
#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]

src/test/rustdoc-json/enum_variant_hidden.rs src/test/rustdoc-json/enums/field_hidden.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
// @has "$.index[*][?(@.name=='ParseError')]"
77
// @has "$.index[*][?(@.name=='UnexpectedEndTag')]"
88
// @is "$.index[*][?(@.name=='UnexpectedEndTag')].inner.variant_kind" '"tuple"'
9-
// @is "$.index[*][?(@.name=='UnexpectedEndTag')].inner.variant_inner" []
9+
// @is "$.index[*][?(@.name=='UnexpectedEndTag')].inner.variant_inner" [null]
1010

1111
pub enum ParseError {
1212
UnexpectedEndTag(#[doc(hidden)] u32),

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

+37
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
// ignore-tidy-linelength
2+
3+
#![feature(no_core)]
4+
#![no_core]
5+
6+
pub enum Foo {
7+
// @set Unit = "$.index[*][?(@.name=='Unit')].id"
8+
// @is "$.index[*][?(@.name=='Unit')].inner.variant_kind" '"plain"'
9+
// @is "$.index[*][?(@.name=='Unit')].inner.variant_inner" null
10+
Unit,
11+
// @set Named = "$.index[*][?(@.name=='Named')].id"
12+
// @is "$.index[*][?(@.name=='Named')].inner.variant_kind" '"struct"'
13+
// @is "$.index[*][?(@.name=='Named')].inner.variant_inner" '{"fields": [], "fields_stripped": false}'
14+
Named {},
15+
// @set Tuple = "$.index[*][?(@.name=='Tuple')].id"
16+
// @is "$.index[*][?(@.name=='Tuple')].inner.variant_kind" '"tuple"'
17+
// @is "$.index[*][?(@.name=='Tuple')].inner.variant_inner" []
18+
Tuple(),
19+
// @set NamedField = "$.index[*][?(@.name=='NamedField')].id"
20+
// @set x = "$.index[*][?(@.name=='x' && @.kind=='struct_field')].id"
21+
// @is "$.index[*][?(@.name=='NamedField')].inner.variant_kind" '"struct"'
22+
// @is "$.index[*][?(@.name=='NamedField')].inner.variant_inner.fields[*]" $x
23+
// @is "$.index[*][?(@.name=='NamedField')].inner.variant_inner.fields_stripped" false
24+
NamedField { x: i32 },
25+
// @set TupleField = "$.index[*][?(@.name=='TupleField')].id"
26+
// @is "$.index[*][?(@.name=='TupleField')].inner.variant_kind" '"tuple"'
27+
// @set tup_field = "$.index[*][?(@.name=='0' && @.kind=='struct_field')].id"
28+
// @is "$.index[*][?(@.name=='TupleField')].inner.variant_inner[*]" $tup_field
29+
TupleField(i32),
30+
}
31+
32+
// @is "$.index[*][?(@.name=='Foo')].inner.variants[0]" $Unit
33+
// @is "$.index[*][?(@.name=='Foo')].inner.variants[1]" $Named
34+
// @is "$.index[*][?(@.name=='Foo')].inner.variants[2]" $Tuple
35+
// @is "$.index[*][?(@.name=='Foo')].inner.variants[3]" $NamedField
36+
// @is "$.index[*][?(@.name=='Foo')].inner.variants[4]" $TupleField
37+
// @count "$.index[*][?(@.name=='Foo')].inner.variants[*]" 5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
pub enum Foo {
2+
Variant {
3+
#[doc(hidden)]
4+
a: i32,
5+
// @set b = "$.index[*][?(@.name=='b')].id"
6+
b: i32,
7+
#[doc(hidden)]
8+
x: i32,
9+
// @set y = "$.index[*][?(@.name=='y')].id"
10+
y: i32,
11+
},
12+
// @is "$.index[*][?(@.name=='Variant')].inner.variant_kind" '"struct"'
13+
// @is "$.index[*][?(@.name=='Variant')].inner.variant_inner.fields_stripped" true
14+
// @is "$.index[*][?(@.name=='Variant')].inner.variant_inner.fields[0]" $b
15+
// @is "$.index[*][?(@.name=='Variant')].inner.variant_inner.fields[1]" $y
16+
// @count "$.index[*][?(@.name=='Variant')].inner.variant_inner.fields[*]" 2
17+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
#![feature(no_core)]
2+
#![no_core]
3+
4+
// @set 1.1.0 = "$.index[*][?(@.docs=='1.1.0')].id"
5+
// @set 2.1.0 = "$.index[*][?(@.docs=='2.1.0')].id"
6+
// @set 2.1.1 = "$.index[*][?(@.docs=='2.1.1')].id"
7+
// @set 2.2.1 = "$.index[*][?(@.docs=='2.2.1')].id"
8+
// @set 2.3.0 = "$.index[*][?(@.docs=='2.3.0')].id"
9+
// @set 3.1.1 = "$.index[*][?(@.docs=='3.1.1')].id"
10+
// @set 3.1.2 = "$.index[*][?(@.docs=='3.1.2')].id"
11+
// @set 3.2.0 = "$.index[*][?(@.docs=='3.2.0')].id"
12+
// @set 3.2.2 = "$.index[*][?(@.docs=='3.2.2')].id"
13+
// @set 3.3.0 = "$.index[*][?(@.docs=='3.3.0')].id"
14+
// @set 3.3.1 = "$.index[*][?(@.docs=='3.3.1')].id"
15+
16+
pub enum EnumWithStrippedTupleVariants {
17+
// @is "$.index[*][?(@.name=='None')].inner.variant_kind" '"tuple"'
18+
// @count "$.index[*][?(@.name=='None')].inner.variant_inner[*]" 0
19+
None(),
20+
21+
// @is "$.index[*][?(@.name=='One')].inner.variant_kind" '"tuple"'
22+
// @count "$.index[*][?(@.name=='One')].inner.variant_inner[*]" 1
23+
// @is "$.index[*][?(@.name=='One')].inner.variant_inner[0]" $1.1.0
24+
One(/** 1.1.0*/ bool),
25+
// @is "$.index[*][?(@.name=='OneHidden')].inner.variant_kind" '"tuple"'
26+
// @count "$.index[*][?(@.name=='OneHidden')].inner.variant_inner[*]" 1
27+
// @is "$.index[*][?(@.name=='OneHidden')].inner.variant_inner[0]" null
28+
OneHidden(#[doc(hidden)] bool),
29+
30+
// @is "$.index[*][?(@.name=='Two')].inner.variant_kind" '"tuple"'
31+
// @count "$.index[*][?(@.name=='Two')].inner.variant_inner[*]" 2
32+
// @is "$.index[*][?(@.name=='Two')].inner.variant_inner[0]" $2.1.0
33+
// @is "$.index[*][?(@.name=='Two')].inner.variant_inner[1]" $2.1.1
34+
Two(/** 2.1.0*/ bool, /** 2.1.1*/ bool),
35+
// @is "$.index[*][?(@.name=='TwoLeftHidden')].inner.variant_kind" '"tuple"'
36+
// @count "$.index[*][?(@.name=='TwoLeftHidden')].inner.variant_inner[*]" 2
37+
// @is "$.index[*][?(@.name=='TwoLeftHidden')].inner.variant_inner[0]" null
38+
// @is "$.index[*][?(@.name=='TwoLeftHidden')].inner.variant_inner[1]" $2.2.1
39+
TwoLeftHidden(#[doc(hidden)] bool, /** 2.2.1*/ bool),
40+
// @is "$.index[*][?(@.name=='TwoRightHidden')].inner.variant_kind" '"tuple"'
41+
// @count "$.index[*][?(@.name=='TwoRightHidden')].inner.variant_inner[*]" 2
42+
// @is "$.index[*][?(@.name=='TwoRightHidden')].inner.variant_inner[0]" $2.3.0
43+
// @is "$.index[*][?(@.name=='TwoRightHidden')].inner.variant_inner[1]" null
44+
TwoRightHidden(/** 2.3.0*/ bool, #[doc(hidden)] bool),
45+
// @is "$.index[*][?(@.name=='TwoBothHidden')].inner.variant_kind" '"tuple"'
46+
// @count "$.index[*][?(@.name=='TwoBothHidden')].inner.variant_inner[*]" 2
47+
// @is "$.index[*][?(@.name=='TwoBothHidden')].inner.variant_inner[0]" null
48+
// @is "$.index[*][?(@.name=='TwoBothHidden')].inner.variant_inner[1]" null
49+
TwoBothHidden(#[doc(hidden)] bool, #[doc(hidden)] bool),
50+
51+
// @is "$.index[*][?(@.name=='Three1')].inner.variant_kind" '"tuple"'
52+
// @count "$.index[*][?(@.name=='Three1')].inner.variant_inner[*]" 3
53+
// @is "$.index[*][?(@.name=='Three1')].inner.variant_inner[0]" null
54+
// @is "$.index[*][?(@.name=='Three1')].inner.variant_inner[1]" $3.1.1
55+
// @is "$.index[*][?(@.name=='Three1')].inner.variant_inner[2]" $3.1.2
56+
Three1(#[doc(hidden)] bool, /** 3.1.1*/ bool, /** 3.1.2*/ bool),
57+
// @is "$.index[*][?(@.name=='Three2')].inner.variant_kind" '"tuple"'
58+
// @count "$.index[*][?(@.name=='Three2')].inner.variant_inner[*]" 3
59+
// @is "$.index[*][?(@.name=='Three2')].inner.variant_inner[0]" $3.2.0
60+
// @is "$.index[*][?(@.name=='Three2')].inner.variant_inner[1]" null
61+
// @is "$.index[*][?(@.name=='Three2')].inner.variant_inner[2]" $3.2.2
62+
Three2(/** 3.2.0*/ bool, #[doc(hidden)] bool, /** 3.2.2*/ bool),
63+
// @is "$.index[*][?(@.name=='Three3')].inner.variant_kind" '"tuple"'
64+
// @count "$.index[*][?(@.name=='Three3')].inner.variant_inner[*]" 3
65+
// @is "$.index[*][?(@.name=='Three3')].inner.variant_inner[0]" $3.3.0
66+
// @is "$.index[*][?(@.name=='Three3')].inner.variant_inner[1]" $3.3.1
67+
// @is "$.index[*][?(@.name=='Three3')].inner.variant_inner[2]" null
68+
Three3(/** 3.3.0*/ bool, /** 3.3.1*/ bool, #[doc(hidden)] bool),
69+
}
70+
71+
72+
// @is "$.index[*][?(@.docs=='1.1.0')].name" '"0"'
73+
// @is "$.index[*][?(@.docs=='2.1.0')].name" '"0"'
74+
// @is "$.index[*][?(@.docs=='2.1.1')].name" '"1"'
75+
// @is "$.index[*][?(@.docs=='2.2.1')].name" '"1"'
76+
// @is "$.index[*][?(@.docs=='2.3.0')].name" '"0"'
77+
// @is "$.index[*][?(@.docs=='3.1.1')].name" '"1"'
78+
// @is "$.index[*][?(@.docs=='3.1.2')].name" '"2"'
79+
// @is "$.index[*][?(@.docs=='3.2.0')].name" '"0"'
80+
// @is "$.index[*][?(@.docs=='3.2.2')].name" '"2"'
81+
// @is "$.index[*][?(@.docs=='3.3.0')].name" '"0"'
82+
// @is "$.index[*][?(@.docs=='3.3.1')].name" '"1"'
83+
84+
// @is "$.index[*][?(@.docs=='1.1.0')].inner" '{"kind": "primitive", "inner": "bool"}'
85+
// @is "$.index[*][?(@.docs=='2.1.0')].inner" '{"kind": "primitive", "inner": "bool"}'
86+
// @is "$.index[*][?(@.docs=='2.1.1')].inner" '{"kind": "primitive", "inner": "bool"}'
87+
// @is "$.index[*][?(@.docs=='2.2.1')].inner" '{"kind": "primitive", "inner": "bool"}'
88+
// @is "$.index[*][?(@.docs=='2.3.0')].inner" '{"kind": "primitive", "inner": "bool"}'
89+
// @is "$.index[*][?(@.docs=='3.1.1')].inner" '{"kind": "primitive", "inner": "bool"}'
90+
// @is "$.index[*][?(@.docs=='3.1.2')].inner" '{"kind": "primitive", "inner": "bool"}'
91+
// @is "$.index[*][?(@.docs=='3.2.0')].inner" '{"kind": "primitive", "inner": "bool"}'
92+
// @is "$.index[*][?(@.docs=='3.2.2')].inner" '{"kind": "primitive", "inner": "bool"}'
93+
// @is "$.index[*][?(@.docs=='3.3.0')].inner" '{"kind": "primitive", "inner": "bool"}'
94+
// @is "$.index[*][?(@.docs=='3.3.1')].inner" '{"kind": "primitive", "inner": "bool"}'

0 commit comments

Comments
 (0)