Skip to content

Commit cca5d21

Browse files
committed
Rustdoc-Json: Report discriminant on all kinds of enum variant.
Closes rust-lang#106299
1 parent b7b252a commit cca5d21

16 files changed

+167
-144
lines changed

src/librustdoc/json/conversions.rs

+7-5
Original file line numberDiff line numberDiff line change
@@ -650,14 +650,16 @@ impl FromWithTcx<clean::Variant> for Variant {
650650

651651
let discriminant = variant.discriminant.map(|d| d.into_tcx(tcx));
652652

653-
match variant.kind {
654-
CLike => Variant::Plain(discriminant),
655-
Tuple(fields) => Variant::Tuple(ids_keeping_stripped(fields, tcx)),
656-
Struct(s) => Variant::Struct {
653+
let kind = match variant.kind {
654+
CLike => VariantKind::Plain,
655+
Tuple(fields) => VariantKind::Tuple(ids_keeping_stripped(fields, tcx)),
656+
Struct(s) => VariantKind::Struct {
657657
fields_stripped: s.has_stripped_entries(),
658658
fields: ids(s.fields, tcx),
659659
},
660-
}
660+
};
661+
662+
Variant { kind, discriminant }
661663
}
662664
}
663665

src/rustdoc-json-types/lib.rs

+12-5
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 = 23;
12+
pub const FORMAT_VERSION: u32 = 24;
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
@@ -333,19 +333,26 @@ pub struct Enum {
333333
pub impls: Vec<Id>,
334334
}
335335

336+
#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
337+
pub struct Variant {
338+
/// Whether the variant is plain, a tuple-like, or struct-like. Contains the fields.
339+
pub kind: VariantKind,
340+
/// The discriminant, if explicitly specified.
341+
pub discriminant: Option<Discriminant>,
342+
}
343+
336344
#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
337345
#[serde(rename_all = "snake_case")]
338-
#[serde(tag = "variant_kind", content = "variant_inner")]
339-
pub enum Variant {
340-
/// A variant with no parentheses, and possible discriminant.
346+
pub enum VariantKind {
347+
/// A variant with no parentheses
341348
///
342349
/// ```rust
343350
/// enum Demo {
344351
/// PlainVariant,
345352
/// PlainWithDiscriminant = 1,
346353
/// }
347354
/// ```
348-
Plain(Option<Discriminant>),
355+
Plain,
349356
/// A variant with unnamed fields.
350357
///
351358
/// Unlike most of json, `#[doc(hidden)]` fields will be given as `None`
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
#[repr(i8)]
22
pub enum Ordering {
3-
// @is "$.index[*][?(@.name=='Less')].inner.variant_inner.expr" '"-1"'
4-
// @is "$.index[*][?(@.name=='Less')].inner.variant_inner.value" '"-1"'
3+
// @is "$.index[*][?(@.name=='Less')].inner.discriminant.expr" '"-1"'
4+
// @is "$.index[*][?(@.name=='Less')].inner.discriminant.value" '"-1"'
55
Less = -1,
6-
// @is "$.index[*][?(@.name=='Equal')].inner.variant_inner.expr" '"0"'
7-
// @is "$.index[*][?(@.name=='Equal')].inner.variant_inner.value" '"0"'
6+
// @is "$.index[*][?(@.name=='Equal')].inner.discriminant.expr" '"0"'
7+
// @is "$.index[*][?(@.name=='Equal')].inner.discriminant.value" '"0"'
88
Equal = 0,
9-
// @is "$.index[*][?(@.name=='Greater')].inner.variant_inner.expr" '"1"'
10-
// @is "$.index[*][?(@.name=='Greater')].inner.variant_inner.value" '"1"'
9+
// @is "$.index[*][?(@.name=='Greater')].inner.discriminant.expr" '"1"'
10+
// @is "$.index[*][?(@.name=='Greater')].inner.discriminant.value" '"1"'
1111
Greater = 1,
1212
}

src/test/rustdoc-json/enums/discriminant/expr.rs

+18-18
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,30 @@
11
pub enum Foo {
2-
// @is "$.index[*][?(@.name=='Addition')].inner.variant_inner.value" '"0"'
3-
// @is "$.index[*][?(@.name=='Addition')].inner.variant_inner.expr" '"{ _ }"'
2+
// @is "$.index[*][?(@.name=='Addition')].inner.discriminant.value" '"0"'
3+
// @is "$.index[*][?(@.name=='Addition')].inner.discriminant.expr" '"{ _ }"'
44
Addition = 0 + 0,
5-
// @is "$.index[*][?(@.name=='Bin')].inner.variant_inner.value" '"1"'
6-
// @is "$.index[*][?(@.name=='Bin')].inner.variant_inner.expr" '"0b1"'
5+
// @is "$.index[*][?(@.name=='Bin')].inner.discriminant.value" '"1"'
6+
// @is "$.index[*][?(@.name=='Bin')].inner.discriminant.expr" '"0b1"'
77
Bin = 0b1,
8-
// @is "$.index[*][?(@.name=='Oct')].inner.variant_inner.value" '"2"'
9-
// @is "$.index[*][?(@.name=='Oct')].inner.variant_inner.expr" '"0o2"'
8+
// @is "$.index[*][?(@.name=='Oct')].inner.discriminant.value" '"2"'
9+
// @is "$.index[*][?(@.name=='Oct')].inner.discriminant.expr" '"0o2"'
1010
Oct = 0o2,
11-
// @is "$.index[*][?(@.name=='PubConst')].inner.variant_inner.value" '"3"'
12-
// @is "$.index[*][?(@.name=='PubConst')].inner.variant_inner.expr" '"THREE"'
11+
// @is "$.index[*][?(@.name=='PubConst')].inner.discriminant.value" '"3"'
12+
// @is "$.index[*][?(@.name=='PubConst')].inner.discriminant.expr" '"THREE"'
1313
PubConst = THREE,
14-
// @is "$.index[*][?(@.name=='Hex')].inner.variant_inner.value" '"4"'
15-
// @is "$.index[*][?(@.name=='Hex')].inner.variant_inner.expr" '"0x4"'
14+
// @is "$.index[*][?(@.name=='Hex')].inner.discriminant.value" '"4"'
15+
// @is "$.index[*][?(@.name=='Hex')].inner.discriminant.expr" '"0x4"'
1616
Hex = 0x4,
17-
// @is "$.index[*][?(@.name=='Cast')].inner.variant_inner.value" '"5"'
18-
// @is "$.index[*][?(@.name=='Cast')].inner.variant_inner.expr" '"{ _ }"'
17+
// @is "$.index[*][?(@.name=='Cast')].inner.discriminant.value" '"5"'
18+
// @is "$.index[*][?(@.name=='Cast')].inner.discriminant.expr" '"{ _ }"'
1919
Cast = 5 as isize,
20-
// @is "$.index[*][?(@.name=='PubCall')].inner.variant_inner.value" '"6"'
21-
// @is "$.index[*][?(@.name=='PubCall')].inner.variant_inner.expr" '"{ _ }"'
20+
// @is "$.index[*][?(@.name=='PubCall')].inner.discriminant.value" '"6"'
21+
// @is "$.index[*][?(@.name=='PubCall')].inner.discriminant.expr" '"{ _ }"'
2222
PubCall = six(),
23-
// @is "$.index[*][?(@.name=='PrivCall')].inner.variant_inner.value" '"7"'
24-
// @is "$.index[*][?(@.name=='PrivCall')].inner.variant_inner.expr" '"{ _ }"'
23+
// @is "$.index[*][?(@.name=='PrivCall')].inner.discriminant.value" '"7"'
24+
// @is "$.index[*][?(@.name=='PrivCall')].inner.discriminant.expr" '"{ _ }"'
2525
PrivCall = seven(),
26-
// @is "$.index[*][?(@.name=='PrivConst')].inner.variant_inner.value" '"8"'
27-
// @is "$.index[*][?(@.name=='PrivConst')].inner.variant_inner.expr" '"EIGHT"'
26+
// @is "$.index[*][?(@.name=='PrivConst')].inner.discriminant.value" '"8"'
27+
// @is "$.index[*][?(@.name=='PrivConst')].inner.discriminant.expr" '"EIGHT"'
2828
PrivConst = EIGHT,
2929
}
3030

src/test/rustdoc-json/enums/discriminant/limits.rs

+16-16
Original file line numberDiff line numberDiff line change
@@ -4,40 +4,40 @@
44

55
#[repr(u64)]
66
pub enum U64 {
7-
// @is "$.index[*][?(@.name=='U64Min')].inner.variant_inner.value" '"0"'
8-
// @is "$.index[*][?(@.name=='U64Min')].inner.variant_inner.expr" '"u64::MIN"'
7+
// @is "$.index[*][?(@.name=='U64Min')].inner.discriminant.value" '"0"'
8+
// @is "$.index[*][?(@.name=='U64Min')].inner.discriminant.expr" '"u64::MIN"'
99
U64Min = u64::MIN,
10-
// @is "$.index[*][?(@.name=='U64Max')].inner.variant_inner.value" '"18446744073709551615"'
11-
// @is "$.index[*][?(@.name=='U64Max')].inner.variant_inner.expr" '"u64::MAX"'
10+
// @is "$.index[*][?(@.name=='U64Max')].inner.discriminant.value" '"18446744073709551615"'
11+
// @is "$.index[*][?(@.name=='U64Max')].inner.discriminant.expr" '"u64::MAX"'
1212
U64Max = u64::MAX,
1313
}
1414

1515
#[repr(i64)]
1616
pub enum I64 {
17-
// @is "$.index[*][?(@.name=='I64Min')].inner.variant_inner.value" '"-9223372036854775808"'
18-
// @is "$.index[*][?(@.name=='I64Min')].inner.variant_inner.expr" '"i64::MIN"'
17+
// @is "$.index[*][?(@.name=='I64Min')].inner.discriminant.value" '"-9223372036854775808"'
18+
// @is "$.index[*][?(@.name=='I64Min')].inner.discriminant.expr" '"i64::MIN"'
1919
I64Min = i64::MIN,
20-
// @is "$.index[*][?(@.name=='I64Max')].inner.variant_inner.value" '"9223372036854775807"'
21-
// @is "$.index[*][?(@.name=='I64Max')].inner.variant_inner.expr" '"i64::MAX"'
20+
// @is "$.index[*][?(@.name=='I64Max')].inner.discriminant.value" '"9223372036854775807"'
21+
// @is "$.index[*][?(@.name=='I64Max')].inner.discriminant.expr" '"i64::MAX"'
2222
I64Max = i64::MAX,
2323
}
2424

2525
#[repr(u128)]
2626
pub enum U128 {
27-
// @is "$.index[*][?(@.name=='U128Min')].inner.variant_inner.value" '"0"'
28-
// @is "$.index[*][?(@.name=='U128Min')].inner.variant_inner.expr" '"u128::MIN"'
27+
// @is "$.index[*][?(@.name=='U128Min')].inner.discriminant.value" '"0"'
28+
// @is "$.index[*][?(@.name=='U128Min')].inner.discriminant.expr" '"u128::MIN"'
2929
U128Min = u128::MIN,
30-
// @is "$.index[*][?(@.name=='U128Max')].inner.variant_inner.value" '"340282366920938463463374607431768211455"'
31-
// @is "$.index[*][?(@.name=='U128Max')].inner.variant_inner.expr" '"u128::MAX"'
30+
// @is "$.index[*][?(@.name=='U128Max')].inner.discriminant.value" '"340282366920938463463374607431768211455"'
31+
// @is "$.index[*][?(@.name=='U128Max')].inner.discriminant.expr" '"u128::MAX"'
3232
U128Max = u128::MAX,
3333
}
3434

3535
#[repr(i128)]
3636
pub enum I128 {
37-
// @is "$.index[*][?(@.name=='I128Min')].inner.variant_inner.value" '"-170141183460469231731687303715884105728"'
38-
// @is "$.index[*][?(@.name=='I128Min')].inner.variant_inner.expr" '"i128::MIN"'
37+
// @is "$.index[*][?(@.name=='I128Min')].inner.discriminant.value" '"-170141183460469231731687303715884105728"'
38+
// @is "$.index[*][?(@.name=='I128Min')].inner.discriminant.expr" '"i128::MIN"'
3939
I128Min = i128::MIN,
40-
// @is "$.index[*][?(@.name=='I128Max')].inner.variant_inner.value" '"170141183460469231731687303715884105727"'
41-
// @is "$.index[*][?(@.name=='I128Max')].inner.variant_inner.expr" '"i128::MAX"'
40+
// @is "$.index[*][?(@.name=='I128Max')].inner.discriminant.value" '"170141183460469231731687303715884105727"'
41+
// @is "$.index[*][?(@.name=='I128Max')].inner.discriminant.expr" '"i128::MAX"'
4242
I128Max = i128::MAX,
4343
}
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
#[repr(u32)]
22
pub enum Foo {
3-
// @is "$.index[*][?(@.name=='Basic')].inner.variant_inner.value" '"0"'
4-
// @is "$.index[*][?(@.name=='Basic')].inner.variant_inner.expr" '"0"'
3+
// @is "$.index[*][?(@.name=='Basic')].inner.discriminant.value" '"0"'
4+
// @is "$.index[*][?(@.name=='Basic')].inner.discriminant.expr" '"0"'
55
Basic = 0,
6-
// @is "$.index[*][?(@.name=='Suffix')].inner.variant_inner.value" '"10"'
7-
// @is "$.index[*][?(@.name=='Suffix')].inner.variant_inner.expr" '"10u32"'
6+
// @is "$.index[*][?(@.name=='Suffix')].inner.discriminant.value" '"10"'
7+
// @is "$.index[*][?(@.name=='Suffix')].inner.discriminant.expr" '"10u32"'
88
Suffix = 10u32,
9-
// @is "$.index[*][?(@.name=='Underscore')].inner.variant_inner.value" '"100"'
10-
// @is "$.index[*][?(@.name=='Underscore')].inner.variant_inner.expr" '"1_0_0"'
9+
// @is "$.index[*][?(@.name=='Underscore')].inner.discriminant.value" '"100"'
10+
// @is "$.index[*][?(@.name=='Underscore')].inner.discriminant.expr" '"1_0_0"'
1111
Underscore = 1_0_0,
12-
// @is "$.index[*][?(@.name=='SuffixUnderscore')].inner.variant_inner.value" '"1000"'
13-
// @is "$.index[*][?(@.name=='SuffixUnderscore')].inner.variant_inner.expr" '"1_0_0_0u32"'
12+
// @is "$.index[*][?(@.name=='SuffixUnderscore')].inner.discriminant.value" '"1000"'
13+
// @is "$.index[*][?(@.name=='SuffixUnderscore')].inner.discriminant.expr" '"1_0_0_0u32"'
1414
SuffixUnderscore = 1_0_0_0u32,
1515
}
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
pub enum Foo {
2-
// @is "$.index[*][?(@.name=='Has')].inner.variant_inner" '{"expr":"0", "value":"0"}'
2+
// @is "$.index[*][?(@.name=='Has')].inner.discriminant" '{"expr":"0", "value":"0"}'
33
Has = 0,
4-
// @is "$.index[*][?(@.name=='Doesnt')].inner.variant_inner" null
4+
// @is "$.index[*][?(@.name=='Doesnt')].inner.discriminant" null
55
Doesnt,
6-
// @is "$.index[*][?(@.name=='AlsoDoesnt')].inner.variant_inner" null
6+
// @is "$.index[*][?(@.name=='AlsoDoesnt')].inner.discriminant" null
77
AlsoDoesnt,
8-
// @is "$.index[*][?(@.name=='AlsoHas')].inner.variant_inner" '{"expr":"44", "value":"44"}'
8+
// @is "$.index[*][?(@.name=='AlsoHas')].inner.discriminant" '{"expr":"44", "value":"44"}'
99
AlsoHas = 44,
1010
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
// ignore-tidy-linelength
2+
3+
#[repr(i32)]
4+
// @is "$.index[*][?(@.name=='Foo')].attrs" '["#[repr(i32)]"]'
5+
pub enum Foo {
6+
// @is "$.index[*][?(@.name=='Struct')].inner.discriminant" null
7+
// @count "$.index[*][?(@.name=='Struct')].inner.kind.struct.fields[*]" 0
8+
Struct {},
9+
// @is "$.index[*][?(@.name=='StructWithDiscr')].inner.discriminant" '{"expr": "42", "value": "42"}'
10+
// @count "$.index[*][?(@.name=='StructWithDiscr')].inner.kind.struct.fields[*]" 1
11+
StructWithDiscr { x: i32 } = 42,
12+
// @is "$.index[*][?(@.name=='StructWithHexDiscr')].inner.discriminant" '{"expr": "0x42", "value": "66"}'
13+
// @count "$.index[*][?(@.name=='StructWithHexDiscr')].inner.kind.struct.fields[*]" 2
14+
StructWithHexDiscr { x: i32, y: bool } = 0x42,
15+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
// ignore-tidy-linelength
2+
3+
#[repr(u32)]
4+
// @is "$.index[*][?(@.name=='Foo')].attrs" '["#[repr(u32)]"]'
5+
pub enum Foo {
6+
// @is "$.index[*][?(@.name=='Tuple')].inner.discriminant" null
7+
// @count "$.index[*][?(@.name=='Tuple')].inner.kind.tuple[*]" 0
8+
Tuple(),
9+
// @is "$.index[*][?(@.name=='TupleWithDiscr')].inner.discriminant" '{"expr": "1", "value": "1"}'
10+
// @count "$.index[*][?(@.name=='TupleWithDiscr')].inner.kind.tuple[*]" 1
11+
TupleWithDiscr(i32) = 1,
12+
// @is "$.index[*][?(@.name=='TupleWithBinDiscr')].inner.discriminant" '{"expr": "0b10", "value": "2"}'
13+
// @count "$.index[*][?(@.name=='TupleWithBinDiscr')].inner.kind.tuple[*]" 2
14+
TupleWithBinDiscr(i32, i32) = 0b10,
15+
}

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
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" [null]
8+
// @is "$.index[*][?(@.name=='UnexpectedEndTag')].inner.kind.tuple" [null]
9+
// @is "$.index[*][?(@.name=='UnexpectedEndTag')].inner.discriminant" null
1010

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

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

+6-11
Original file line numberDiff line numberDiff line change
@@ -5,27 +5,22 @@
55

66
pub enum Foo {
77
// @set Unit = "$.index[*][?(@.name=='Unit')].id"
8-
// @is "$.index[*][?(@.name=='Unit')].inner.variant_kind" '"plain"'
9-
// @is "$.index[*][?(@.name=='Unit')].inner.variant_inner" null
8+
// @is "$.index[*][?(@.name=='Unit')].inner.kind" '"plain"'
109
Unit,
1110
// @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}'
11+
// @is "$.index[*][?(@.name=='Named')].inner.kind.struct" '{"fields": [], "fields_stripped": false}'
1412
Named {},
1513
// @set Tuple = "$.index[*][?(@.name=='Tuple')].id"
16-
// @is "$.index[*][?(@.name=='Tuple')].inner.variant_kind" '"tuple"'
17-
// @is "$.index[*][?(@.name=='Tuple')].inner.variant_inner" []
14+
// @is "$.index[*][?(@.name=='Tuple')].inner.kind.tuple" []
1815
Tuple(),
1916
// @set NamedField = "$.index[*][?(@.name=='NamedField')].id"
2017
// @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
18+
// @is "$.index[*][?(@.name=='NamedField')].inner.kind.struct.fields[*]" $x
19+
// @is "$.index[*][?(@.name=='NamedField')].inner.kind.struct.fields_stripped" false
2420
NamedField { x: i32 },
2521
// @set TupleField = "$.index[*][?(@.name=='TupleField')].id"
26-
// @is "$.index[*][?(@.name=='TupleField')].inner.variant_kind" '"tuple"'
2722
// @set tup_field = "$.index[*][?(@.name=='0' && @.kind=='struct_field')].id"
28-
// @is "$.index[*][?(@.name=='TupleField')].inner.variant_inner[*]" $tup_field
23+
// @is "$.index[*][?(@.name=='TupleField')].inner.kind.tuple[*]" $tup_field
2924
TupleField(i32),
3025
}
3126

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

+4-5
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,8 @@ pub enum Foo {
99
// @set y = "$.index[*][?(@.name=='y')].id"
1010
y: i32,
1111
},
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
12+
// @is "$.index[*][?(@.name=='Variant')].inner.kind.struct.fields_stripped" true
13+
// @is "$.index[*][?(@.name=='Variant')].inner.kind.struct.fields[0]" $b
14+
// @is "$.index[*][?(@.name=='Variant')].inner.kind.struct.fields[1]" $y
15+
// @count "$.index[*][?(@.name=='Variant')].inner.kind.struct.fields[*]" 2
1716
}

0 commit comments

Comments
 (0)