From 9aa68e04fa356b14d963d755ee63a09f33fc6513 Mon Sep 17 00:00:00 2001 From: Nixon Enraght-Moony Date: Fri, 19 Aug 2022 15:47:45 +0100 Subject: [PATCH 1/3] Rustdoc-Json: Put fields for enum typle variants in their own item. Closes https://github.com/rust-lang/rust/issues/100587 Closes https://github.com/rust-lang/rust/issues/92945 --- src/etc/check_missing_items.py | 6 +- src/librustdoc/json/conversions.rs | 64 ++++++++----------- src/rustdoc-json-types/lib.rs | 18 +++--- src/rustdoc-json-types/tests.rs | 2 +- src/test/rustdoc-json/enum_variant_hidden.rs | 5 +- src/test/rustdoc-json/enums/variant_struct.rs | 2 +- .../enums/variant_tuple_struct.rs | 2 +- src/test/rustdoc-json/nested.rs | 2 +- src/test/rustdoc-json/structs/plain_empty.rs | 2 +- src/test/rustdoc-json/structs/tuple.rs | 2 +- src/test/rustdoc-json/structs/unit.rs | 2 +- .../rustdoc-json/structs/with_generics.rs | 2 +- .../rustdoc-json/structs/with_primitives.rs | 2 +- src/test/rustdoc-json/unions/union.rs | 2 +- 14 files changed, 47 insertions(+), 66 deletions(-) diff --git a/src/etc/check_missing_items.py b/src/etc/check_missing_items.py index ce06a79a21c3f..88845299ced17 100644 --- a/src/etc/check_missing_items.py +++ b/src/etc/check_missing_items.py @@ -143,11 +143,7 @@ def check_type(ty): set(item["inner"]["variants"]) | set(item["inner"]["impls"]) ) - visited elif item["kind"] == "variant": - if item["inner"]["variant_kind"] == "tuple": - for ty in item["inner"]["variant_inner"]: - check_type(ty) - elif item["inner"]["variant_kind"] == "struct": - work_list |= set(item["inner"]["variant_inner"]) - visited + work_list |= set(item["inner"]["fields"]) - visited elif item["kind"] in ("function", "method"): check_generics(item["inner"]["generics"]) check_decl(item["inner"]["decl"]) diff --git a/src/librustdoc/json/conversions.rs b/src/librustdoc/json/conversions.rs index c4e8b6f5f8449..22804a2c3be63 100644 --- a/src/librustdoc/json/conversions.rs +++ b/src/librustdoc/json/conversions.rs @@ -238,7 +238,7 @@ fn from_clean_item(item: clean::Item, tcx: TyCtxt<'_>) -> ItemEnum { match *item.kind { ModuleItem(m) => { - ItemEnum::Module(Module { is_crate, items: ids(m.items, tcx), is_stripped: false }) + ItemEnum::Module(Module { is_crate, items: ids(&m.items, tcx), is_stripped: false }) } ImportItem(i) => ItemEnum::Import(i.into_tcx(tcx)), StructItem(s) => ItemEnum::Struct(s.into_tcx(tcx)), @@ -282,7 +282,7 @@ fn from_clean_item(item: clean::Item, tcx: TyCtxt<'_>) -> ItemEnum { match *inner { ModuleItem(m) => ItemEnum::Module(Module { is_crate, - items: ids(m.items, tcx), + items: ids(&m.items, tcx), is_stripped: true, }), // `convert_item` early returns `None` for stripped items we're not including @@ -301,10 +301,10 @@ impl FromWithTcx for Struct { let fields_stripped = struct_.has_stripped_entries(); let clean::Struct { struct_type, generics, fields } = struct_; Struct { - struct_type: from_ctor_kind(struct_type), + kind: from_ctor_kind(struct_type), generics: generics.into_tcx(tcx), fields_stripped, - fields: ids(fields, tcx), + fields: ids(&fields, tcx), impls: Vec::new(), // Added in JsonRenderer::item } } @@ -317,17 +317,17 @@ impl FromWithTcx for Union { Union { generics: generics.into_tcx(tcx), fields_stripped, - fields: ids(fields, tcx), + fields: ids(&fields, tcx), impls: Vec::new(), // Added in JsonRenderer::item } } } -pub(crate) fn from_ctor_kind(struct_type: CtorKind) -> StructType { +pub(crate) fn from_ctor_kind(struct_type: CtorKind) -> StructKind { match struct_type { - CtorKind::Fictive => StructType::Plain, - CtorKind::Fn => StructType::Tuple, - CtorKind::Const => StructType::Unit, + CtorKind::Fictive => StructKind::Struct, + CtorKind::Fn => StructKind::Tuple, + CtorKind::Const => StructKind::Unit, } } @@ -551,7 +551,7 @@ impl FromWithTcx for Trait { Trait { is_auto, is_unsafe, - items: ids(items, tcx), + items: ids(&items, tcx), generics: generics.into_tcx(tcx), bounds: bounds.into_tcx(tcx), implementations: Vec::new(), // Added in JsonRenderer::item @@ -591,7 +591,7 @@ impl FromWithTcx for Impl { .collect(), trait_: trait_.map(|path| path.into_tcx(tcx)), for_: for_.into_tcx(tcx), - items: ids(items, tcx), + items: ids(&items, tcx), negative: negative_polarity, synthetic, blanket_impl: blanket_impl.map(|x| x.into_tcx(tcx)), @@ -634,42 +634,28 @@ impl FromWithTcx for Enum { Enum { generics: generics.into_tcx(tcx), variants_stripped, - variants: ids(variants, tcx), + variants: ids(&variants, tcx), impls: Vec::new(), // Added in JsonRenderer::item } } } -impl FromWithTcx for Struct { - fn from_tcx(struct_: clean::VariantStruct, tcx: TyCtxt<'_>) -> Self { - let fields_stripped = struct_.has_stripped_entries(); - let clean::VariantStruct { struct_type, fields } = struct_; - Struct { - struct_type: from_ctor_kind(struct_type), - generics: Generics { params: vec![], where_predicates: vec![] }, - fields_stripped, - fields: ids(fields, tcx), - impls: Vec::new(), - } - } -} - impl FromWithTcx for Variant { fn from_tcx(variant: clean::Variant, tcx: TyCtxt<'_>) -> Self { use clean::Variant::*; + match variant { - CLike => Variant::Plain, - Tuple(fields) => Variant::Tuple( - fields - .into_iter() - .filter_map(|f| match *f.kind { - clean::StructFieldItem(ty) => Some(ty.into_tcx(tcx)), - clean::StrippedItem(_) => None, - _ => unreachable!(), - }) - .collect(), - ), - Struct(s) => Variant::Struct(ids(s.fields, tcx)), + CLike => Variant { kind: StructKind::Unit, fields: Vec::new(), fields_stripped: false }, + Tuple(fields) => Variant { + kind: StructKind::Tuple, + fields: ids(&fields, tcx), + fields_stripped: fields.iter().any(|i| i.is_stripped()), + }, + Struct(s) => Variant { + kind: StructKind::Struct, + fields: ids(&s.fields, tcx), + fields_stripped: s.has_stripped_entries(), + }, } } } @@ -773,7 +759,7 @@ impl FromWithTcx for ItemKind { } } -fn ids(items: impl IntoIterator, tcx: TyCtxt<'_>) -> Vec { +fn ids<'a>(items: impl IntoIterator, tcx: TyCtxt<'_>) -> Vec { items .into_iter() .filter(|x| !x.is_stripped() && !x.is_keyword()) diff --git a/src/rustdoc-json-types/lib.rs b/src/rustdoc-json-types/lib.rs index 7dcad66b1f992..432cf44a0db08 100644 --- a/src/rustdoc-json-types/lib.rs +++ b/src/rustdoc-json-types/lib.rs @@ -9,7 +9,7 @@ use std::path::PathBuf; use serde::{Deserialize, Serialize}; /// rustdoc format-version. -pub const FORMAT_VERSION: u32 = 18; +pub const FORMAT_VERSION: u32 = 19; /// A `Crate` is the root of the emitted JSON blob. It contains all type/documentation information /// about the language items in the local crate, as well as info about external items to allow @@ -289,7 +289,7 @@ pub struct Union { #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] pub struct Struct { - pub struct_type: StructType, + pub kind: StructKind, pub generics: Generics, pub fields_stripped: bool, pub fields: Vec, @@ -305,18 +305,16 @@ pub struct Enum { } #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] -#[serde(rename_all = "snake_case")] -#[serde(tag = "variant_kind", content = "variant_inner")] -pub enum Variant { - Plain, - Tuple(Vec), - Struct(Vec), +pub struct Variant { + pub kind: StructKind, + pub fields: Vec, + pub fields_stripped: bool, } #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] #[serde(rename_all = "snake_case")] -pub enum StructType { - Plain, +pub enum StructKind { + Struct, Tuple, Unit, } diff --git a/src/rustdoc-json-types/tests.rs b/src/rustdoc-json-types/tests.rs index e7f6447ed8753..d70e0987c93fa 100644 --- a/src/rustdoc-json-types/tests.rs +++ b/src/rustdoc-json-types/tests.rs @@ -3,7 +3,7 @@ use super::*; #[test] fn test_struct_info_roundtrip() { let s = ItemEnum::Struct(Struct { - struct_type: StructType::Plain, + kind: StructKind::Struct, generics: Generics { params: vec![], where_predicates: vec![] }, fields_stripped: false, fields: vec![], diff --git a/src/test/rustdoc-json/enum_variant_hidden.rs b/src/test/rustdoc-json/enum_variant_hidden.rs index c5e063a055c56..450e52089e408 100644 --- a/src/test/rustdoc-json/enum_variant_hidden.rs +++ b/src/test/rustdoc-json/enum_variant_hidden.rs @@ -5,8 +5,9 @@ // @has "$.index[*][?(@.name=='ParseError')]" // @has "$.index[*][?(@.name=='UnexpectedEndTag')]" -// @is "$.index[*][?(@.name=='UnexpectedEndTag')].inner.variant_kind" '"tuple"' -// @is "$.index[*][?(@.name=='UnexpectedEndTag')].inner.variant_inner" [] +// @is "$.index[*][?(@.name=='UnexpectedEndTag')].inner.kind" '"tuple"' +// @is "$.index[*][?(@.name=='UnexpectedEndTag')].inner.fields" [] +// @is "$.index[*][?(@.name=='UnexpectedEndTag')].inner.fields_stripped" true pub enum ParseError { UnexpectedEndTag(#[doc(hidden)] u32), diff --git a/src/test/rustdoc-json/enums/variant_struct.rs b/src/test/rustdoc-json/enums/variant_struct.rs index 704ec35d2f0ba..ea56b6382b9e0 100644 --- a/src/test/rustdoc-json/enums/variant_struct.rs +++ b/src/test/rustdoc-json/enums/variant_struct.rs @@ -1,7 +1,7 @@ // @has "$.index[*][?(@.name=='EnumStruct')].visibility" \"public\" // @has "$.index[*][?(@.name=='EnumStruct')].kind" \"enum\" pub enum EnumStruct { - // @has "$.index[*][?(@.name=='VariantS')].inner.variant_kind" \"struct\" + // @has "$.index[*][?(@.name=='VariantS')].inner.kind" \"struct\" // @has "$.index[*][?(@.name=='x')].kind" \"struct_field\" // @has "$.index[*][?(@.name=='y')].kind" \"struct_field\" VariantS { diff --git a/src/test/rustdoc-json/enums/variant_tuple_struct.rs b/src/test/rustdoc-json/enums/variant_tuple_struct.rs index 71ddd73ec76a4..51e79f55e7fc4 100644 --- a/src/test/rustdoc-json/enums/variant_tuple_struct.rs +++ b/src/test/rustdoc-json/enums/variant_tuple_struct.rs @@ -1,7 +1,7 @@ // @has "$.index[*][?(@.name=='EnumTupleStruct')].visibility" \"public\" // @has "$.index[*][?(@.name=='EnumTupleStruct')].kind" \"enum\" pub enum EnumTupleStruct { - // @has "$.index[*][?(@.name=='VariantA')].inner.variant_kind" \"tuple\" + // @has "$.index[*][?(@.name=='VariantA')].inner.kind" \"tuple\" // @has "$.index[*][?(@.name=='0')].kind" \"struct_field\" // @has "$.index[*][?(@.name=='1')].kind" \"struct_field\" VariantA(u32, String), diff --git a/src/test/rustdoc-json/nested.rs b/src/test/rustdoc-json/nested.rs index 73ec9392ce94b..ee2d2efa960e8 100644 --- a/src/test/rustdoc-json/nested.rs +++ b/src/test/rustdoc-json/nested.rs @@ -17,7 +17,7 @@ pub mod l1 { pub mod l3 { // @is "$.index[*][?(@.name=='L4')].kind" \"struct\" - // @is "$.index[*][?(@.name=='L4')].inner.struct_type" \"unit\" + // @is "$.index[*][?(@.name=='L4')].inner.kind" \"unit\" // @set l4_id = "$.index[*][?(@.name=='L4')].id" // @ismany "$.index[*][?(@.name=='l3')].inner.items[*]" $l4_id pub struct L4; diff --git a/src/test/rustdoc-json/structs/plain_empty.rs b/src/test/rustdoc-json/structs/plain_empty.rs index 2ad9e86096c36..7d4b339a07c16 100644 --- a/src/test/rustdoc-json/structs/plain_empty.rs +++ b/src/test/rustdoc-json/structs/plain_empty.rs @@ -1,6 +1,6 @@ // @has "$.index[*][?(@.name=='PlainEmpty')].visibility" \"public\" // @has "$.index[*][?(@.name=='PlainEmpty')].kind" \"struct\" -// @has "$.index[*][?(@.name=='PlainEmpty')].inner.struct_type" \"plain\" +// @has "$.index[*][?(@.name=='PlainEmpty')].inner.kind" \"struct\" // @has "$.index[*][?(@.name=='PlainEmpty')].inner.fields_stripped" false // @has "$.index[*][?(@.name=='PlainEmpty')].inner.fields" [] pub struct PlainEmpty {} diff --git a/src/test/rustdoc-json/structs/tuple.rs b/src/test/rustdoc-json/structs/tuple.rs index 91fac359422e9..973b864ab3d3b 100644 --- a/src/test/rustdoc-json/structs/tuple.rs +++ b/src/test/rustdoc-json/structs/tuple.rs @@ -1,5 +1,5 @@ // @has "$.index[*][?(@.name=='Tuple')].visibility" \"public\" // @has "$.index[*][?(@.name=='Tuple')].kind" \"struct\" -// @has "$.index[*][?(@.name=='Tuple')].inner.struct_type" \"tuple\" +// @has "$.index[*][?(@.name=='Tuple')].inner.kind" \"tuple\" // @has "$.index[*][?(@.name=='Tuple')].inner.fields_stripped" true pub struct Tuple(u32, String); diff --git a/src/test/rustdoc-json/structs/unit.rs b/src/test/rustdoc-json/structs/unit.rs index 85a515b5e78ac..138a541af30de 100644 --- a/src/test/rustdoc-json/structs/unit.rs +++ b/src/test/rustdoc-json/structs/unit.rs @@ -1,5 +1,5 @@ // @has "$.index[*][?(@.name=='Unit')].visibility" \"public\" // @has "$.index[*][?(@.name=='Unit')].kind" \"struct\" -// @has "$.index[*][?(@.name=='Unit')].inner.struct_type" \"unit\" +// @has "$.index[*][?(@.name=='Unit')].inner.kind" \"unit\" // @has "$.index[*][?(@.name=='Unit')].inner.fields" [] pub struct Unit; diff --git a/src/test/rustdoc-json/structs/with_generics.rs b/src/test/rustdoc-json/structs/with_generics.rs index b0ad1883f8a2f..be74d5981260d 100644 --- a/src/test/rustdoc-json/structs/with_generics.rs +++ b/src/test/rustdoc-json/structs/with_generics.rs @@ -6,7 +6,7 @@ use std::collections::HashMap; // @has "$.index[*][?(@.name=='WithGenerics')].inner.generics.params[0].kind.type" // @has "$.index[*][?(@.name=='WithGenerics')].inner.generics.params[1].name" \"U\" // @has "$.index[*][?(@.name=='WithGenerics')].inner.generics.params[1].kind.type" -// @has "$.index[*][?(@.name=='WithGenerics')].inner.struct_type" \"plain\" +// @has "$.index[*][?(@.name=='WithGenerics')].inner.kind" \"struct\" // @has "$.index[*][?(@.name=='WithGenerics')].inner.fields_stripped" true pub struct WithGenerics { stuff: Vec, diff --git a/src/test/rustdoc-json/structs/with_primitives.rs b/src/test/rustdoc-json/structs/with_primitives.rs index b74050dde7869..f08a59066d246 100644 --- a/src/test/rustdoc-json/structs/with_primitives.rs +++ b/src/test/rustdoc-json/structs/with_primitives.rs @@ -2,7 +2,7 @@ // @has "$.index[*][?(@.name=='WithPrimitives')].kind" \"struct\" // @has "$.index[*][?(@.name=='WithPrimitives')].inner.generics.params[0].name" \"\'a\" // @has "$.index[*][?(@.name=='WithPrimitives')].inner.generics.params[0].kind.lifetime.outlives" [] -// @has "$.index[*][?(@.name=='WithPrimitives')].inner.struct_type" \"plain\" +// @has "$.index[*][?(@.name=='WithPrimitives')].inner.kind" \"struct\" // @has "$.index[*][?(@.name=='WithPrimitives')].inner.fields_stripped" true pub struct WithPrimitives<'a> { num: u32, diff --git a/src/test/rustdoc-json/unions/union.rs b/src/test/rustdoc-json/unions/union.rs index 5467f68477fc7..7d1e5b6ee117e 100644 --- a/src/test/rustdoc-json/unions/union.rs +++ b/src/test/rustdoc-json/unions/union.rs @@ -1,6 +1,6 @@ // @has "$.index[*][?(@.name=='Union')].visibility" \"public\" // @has "$.index[*][?(@.name=='Union')].kind" \"union\" -// @!has "$.index[*][?(@.name=='Union')].inner.struct_type" +// @!has "$.index[*][?(@.name=='Union')].inner.kind" pub union Union { int: i32, float: f32, From cf6ed31044d6db4909b935f085d252e91aa000d3 Mon Sep 17 00:00:00 2001 From: Nixon Enraght-Moony Date: Fri, 19 Aug 2022 16:41:47 +0100 Subject: [PATCH 2/3] Rustdoc-Json-Types: Better docs and names --- src/librustdoc/json/conversions.rs | 6 +-- src/librustdoc/json/mod.rs | 2 +- src/rustdoc-json-types/lib.rs | 53 ++++++++++++++++++- src/rustdoc-json-types/tests.rs | 2 +- src/test/rustdoc-json/enums/variant_struct.rs | 15 +++--- .../enums/variant_tuple_struct.rs | 10 ++-- src/test/rustdoc-json/structs/plain_empty.rs | 2 +- .../rustdoc-json/structs/with_generics.rs | 2 +- .../rustdoc-json/structs/with_primitives.rs | 2 +- 9 files changed, 70 insertions(+), 24 deletions(-) diff --git a/src/librustdoc/json/conversions.rs b/src/librustdoc/json/conversions.rs index 22804a2c3be63..93245da8fbf69 100644 --- a/src/librustdoc/json/conversions.rs +++ b/src/librustdoc/json/conversions.rs @@ -243,7 +243,7 @@ fn from_clean_item(item: clean::Item, tcx: TyCtxt<'_>) -> ItemEnum { ImportItem(i) => ItemEnum::Import(i.into_tcx(tcx)), StructItem(s) => ItemEnum::Struct(s.into_tcx(tcx)), UnionItem(u) => ItemEnum::Union(u.into_tcx(tcx)), - StructFieldItem(f) => ItemEnum::StructField(f.into_tcx(tcx)), + StructFieldItem(f) => ItemEnum::Field(f.into_tcx(tcx)), EnumItem(e) => ItemEnum::Enum(e.into_tcx(tcx)), VariantItem(v) => ItemEnum::Variant(v.into_tcx(tcx)), FunctionItem(f) => ItemEnum::Function(from_function(f, header.unwrap(), tcx)), @@ -325,7 +325,7 @@ impl FromWithTcx for Union { pub(crate) fn from_ctor_kind(struct_type: CtorKind) -> StructKind { match struct_type { - CtorKind::Fictive => StructKind::Struct, + CtorKind::Fictive => StructKind::NamedFields, CtorKind::Fn => StructKind::Tuple, CtorKind::Const => StructKind::Unit, } @@ -652,7 +652,7 @@ impl FromWithTcx for Variant { fields_stripped: fields.iter().any(|i| i.is_stripped()), }, Struct(s) => Variant { - kind: StructKind::Struct, + kind: StructKind::NamedFields, fields: ids(&s.fields, tcx), fields_stripped: s.has_stripped_entries(), }, diff --git a/src/librustdoc/json/mod.rs b/src/librustdoc/json/mod.rs index 7b1b059e14dcb..e1d6dc8057354 100644 --- a/src/librustdoc/json/mod.rs +++ b/src/librustdoc/json/mod.rs @@ -215,7 +215,7 @@ impl<'tcx> FormatRenderer<'tcx> for JsonRenderer<'tcx> { | types::ItemEnum::PrimitiveType(_) => true, types::ItemEnum::ExternCrate { .. } | types::ItemEnum::Import(_) - | types::ItemEnum::StructField(_) + | types::ItemEnum::Field(_) | types::ItemEnum::Variant(_) | types::ItemEnum::Function(_) | types::ItemEnum::TraitAlias(_) diff --git a/src/rustdoc-json-types/lib.rs b/src/rustdoc-json-types/lib.rs index 432cf44a0db08..25491318556fa 100644 --- a/src/rustdoc-json-types/lib.rs +++ b/src/rustdoc-json-types/lib.rs @@ -230,7 +230,8 @@ pub enum ItemEnum { Union(Union), Struct(Struct), - StructField(Type), + /// The name of the field is given in the enclosing [`Item`] + Field(Type), Enum(Enum), Variant(Variant), @@ -283,6 +284,7 @@ pub struct Module { pub struct Union { pub generics: Generics, pub fields_stripped: bool, + /// Will all be [`ItemEnum::Field`] pub fields: Vec, pub impls: Vec, } @@ -292,6 +294,7 @@ pub struct Struct { pub kind: StructKind, pub generics: Generics, pub fields_stripped: bool, + /// Will all be [`ItemEnum::Field`] pub fields: Vec, pub impls: Vec, } @@ -300,6 +303,7 @@ pub struct Struct { pub struct Enum { pub generics: Generics, pub variants_stripped: bool, + /// Will all be [`ItemEnum::Variant`] pub variants: Vec, pub impls: Vec, } @@ -307,15 +311,60 @@ pub struct Enum { #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] pub struct Variant { pub kind: StructKind, + /// Will all be [`ItemEnum::Field`] pub fields: Vec, pub fields_stripped: bool, } #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] #[serde(rename_all = "snake_case")] +/// The kind used for literals of a struct or enum. pub enum StructKind { - Struct, + /// A "normal" struct, with named fields. + /// + /// Eg: + /// + /// ```rust + /// pub struct A { + /// x: i32, + /// } + /// pub struct B {} + /// pub enum C { + /// Variant { x: i32 }, + /// } + /// pub enum D { + /// Variant {}, + /// } + /// ``` + NamedFields, + /// Unnamed fields, accessed with a number. + /// + /// Eg: + /// + /// ```rust + /// pub struct A(i32); + /// pub struct B(); + /// pub enum C { + /// Variant(i32), + /// } + /// pub enum D { + /// Variant(), + /// } + /// ``` Tuple, + /// No fields, and no parentheses. + /// + /// Note: Cases without fields but with parentheses will have a different + /// kind, as seen in the examples above. + /// + /// Eg: + /// + /// ```rust + /// pub struct A; + /// pub enum B { + /// Variant, + /// } + /// ``` Unit, } diff --git a/src/rustdoc-json-types/tests.rs b/src/rustdoc-json-types/tests.rs index d70e0987c93fa..5ccfbaded88ff 100644 --- a/src/rustdoc-json-types/tests.rs +++ b/src/rustdoc-json-types/tests.rs @@ -3,7 +3,7 @@ use super::*; #[test] fn test_struct_info_roundtrip() { let s = ItemEnum::Struct(Struct { - kind: StructKind::Struct, + kind: StructKind::NamedFields, generics: Generics { params: vec![], where_predicates: vec![] }, fields_stripped: false, fields: vec![], diff --git a/src/test/rustdoc-json/enums/variant_struct.rs b/src/test/rustdoc-json/enums/variant_struct.rs index ea56b6382b9e0..504f94b5ee18e 100644 --- a/src/test/rustdoc-json/enums/variant_struct.rs +++ b/src/test/rustdoc-json/enums/variant_struct.rs @@ -1,11 +1,8 @@ -// @has "$.index[*][?(@.name=='EnumStruct')].visibility" \"public\" -// @has "$.index[*][?(@.name=='EnumStruct')].kind" \"enum\" +// @is "$.index[*][?(@.name=='EnumStruct')].visibility" \"public\" +// @is "$.index[*][?(@.name=='EnumStruct')].kind" \"enum\" pub enum EnumStruct { - // @has "$.index[*][?(@.name=='VariantS')].inner.kind" \"struct\" - // @has "$.index[*][?(@.name=='x')].kind" \"struct_field\" - // @has "$.index[*][?(@.name=='y')].kind" \"struct_field\" - VariantS { - x: u32, - y: String, - }, + // @is "$.index[*][?(@.name=='VariantS')].inner.kind" \"named_fields\" + // @is "$.index[*][?(@.name=='x')].kind" \"field\" + // @is "$.index[*][?(@.name=='y')].kind" \"field\" + VariantS { x: u32, y: String }, } diff --git a/src/test/rustdoc-json/enums/variant_tuple_struct.rs b/src/test/rustdoc-json/enums/variant_tuple_struct.rs index 51e79f55e7fc4..42ee4d47c0d73 100644 --- a/src/test/rustdoc-json/enums/variant_tuple_struct.rs +++ b/src/test/rustdoc-json/enums/variant_tuple_struct.rs @@ -1,8 +1,8 @@ -// @has "$.index[*][?(@.name=='EnumTupleStruct')].visibility" \"public\" -// @has "$.index[*][?(@.name=='EnumTupleStruct')].kind" \"enum\" +// @is "$.index[*][?(@.name=='EnumTupleStruct')].visibility" \"public\" +// @is "$.index[*][?(@.name=='EnumTupleStruct')].kind" \"enum\" pub enum EnumTupleStruct { - // @has "$.index[*][?(@.name=='VariantA')].inner.kind" \"tuple\" - // @has "$.index[*][?(@.name=='0')].kind" \"struct_field\" - // @has "$.index[*][?(@.name=='1')].kind" \"struct_field\" + // @is "$.index[*][?(@.name=='VariantA')].inner.kind" \"tuple\" + // @is "$.index[*][?(@.name=='0')].kind" \"field\" + // @is "$.index[*][?(@.name=='1')].kind" \"field\" VariantA(u32, String), } diff --git a/src/test/rustdoc-json/structs/plain_empty.rs b/src/test/rustdoc-json/structs/plain_empty.rs index 7d4b339a07c16..5d9a323b1c718 100644 --- a/src/test/rustdoc-json/structs/plain_empty.rs +++ b/src/test/rustdoc-json/structs/plain_empty.rs @@ -1,6 +1,6 @@ // @has "$.index[*][?(@.name=='PlainEmpty')].visibility" \"public\" // @has "$.index[*][?(@.name=='PlainEmpty')].kind" \"struct\" -// @has "$.index[*][?(@.name=='PlainEmpty')].inner.kind" \"struct\" +// @has "$.index[*][?(@.name=='PlainEmpty')].inner.kind" \"named_fields\" // @has "$.index[*][?(@.name=='PlainEmpty')].inner.fields_stripped" false // @has "$.index[*][?(@.name=='PlainEmpty')].inner.fields" [] pub struct PlainEmpty {} diff --git a/src/test/rustdoc-json/structs/with_generics.rs b/src/test/rustdoc-json/structs/with_generics.rs index be74d5981260d..49edbdfdb210b 100644 --- a/src/test/rustdoc-json/structs/with_generics.rs +++ b/src/test/rustdoc-json/structs/with_generics.rs @@ -6,7 +6,7 @@ use std::collections::HashMap; // @has "$.index[*][?(@.name=='WithGenerics')].inner.generics.params[0].kind.type" // @has "$.index[*][?(@.name=='WithGenerics')].inner.generics.params[1].name" \"U\" // @has "$.index[*][?(@.name=='WithGenerics')].inner.generics.params[1].kind.type" -// @has "$.index[*][?(@.name=='WithGenerics')].inner.kind" \"struct\" +// @has "$.index[*][?(@.name=='WithGenerics')].inner.kind" \"named_fields\" // @has "$.index[*][?(@.name=='WithGenerics')].inner.fields_stripped" true pub struct WithGenerics { stuff: Vec, diff --git a/src/test/rustdoc-json/structs/with_primitives.rs b/src/test/rustdoc-json/structs/with_primitives.rs index f08a59066d246..b46256821c6d3 100644 --- a/src/test/rustdoc-json/structs/with_primitives.rs +++ b/src/test/rustdoc-json/structs/with_primitives.rs @@ -2,7 +2,7 @@ // @has "$.index[*][?(@.name=='WithPrimitives')].kind" \"struct\" // @has "$.index[*][?(@.name=='WithPrimitives')].inner.generics.params[0].name" \"\'a\" // @has "$.index[*][?(@.name=='WithPrimitives')].inner.generics.params[0].kind.lifetime.outlives" [] -// @has "$.index[*][?(@.name=='WithPrimitives')].inner.kind" \"struct\" +// @has "$.index[*][?(@.name=='WithPrimitives')].inner.kind" \"named_fields\" // @has "$.index[*][?(@.name=='WithPrimitives')].inner.fields_stripped" true pub struct WithPrimitives<'a> { num: u32, From 6ca1ee3d986113ff857d373380748c1021c0d02a Mon Sep 17 00:00:00 2001 From: Nixon Enraght-Moony Date: Fri, 19 Aug 2022 17:21:05 +0100 Subject: [PATCH 3/3] Rustdoc-Json: Add more tests for enums and hidden fields --- .../field_hidden.rs} | 0 src/test/rustdoc-json/enums/kind.rs | 34 +++++++++++++++++++ .../rustdoc-json/enums/some_fields_hidden.rs | 22 ++++++++++++ src/test/rustdoc-json/structs/empty_kinds.rs | 6 ++++ 4 files changed, 62 insertions(+) rename src/test/rustdoc-json/{enum_variant_hidden.rs => enums/field_hidden.rs} (100%) create mode 100644 src/test/rustdoc-json/enums/kind.rs create mode 100644 src/test/rustdoc-json/enums/some_fields_hidden.rs create mode 100644 src/test/rustdoc-json/structs/empty_kinds.rs diff --git a/src/test/rustdoc-json/enum_variant_hidden.rs b/src/test/rustdoc-json/enums/field_hidden.rs similarity index 100% rename from src/test/rustdoc-json/enum_variant_hidden.rs rename to src/test/rustdoc-json/enums/field_hidden.rs diff --git a/src/test/rustdoc-json/enums/kind.rs b/src/test/rustdoc-json/enums/kind.rs new file mode 100644 index 0000000000000..50bff0968d6b4 --- /dev/null +++ b/src/test/rustdoc-json/enums/kind.rs @@ -0,0 +1,34 @@ +#![feature(no_core)] +#![no_core] + +pub enum Foo { + // @is "$.index[*][?(@.name=='Unit')].inner.kind" '"unit"' + // @set Unit = "$.index[*][?(@.name=='Unit')].id" + // @is "$.index[*][?(@.name=='Unit')].inner.fields" [] + Unit, + // @is "$.index[*][?(@.name=='Named')].inner.kind" '"named_fields"' + // @set Named = "$.index[*][?(@.name=='Named')].id" + // @is "$.index[*][?(@.name=='Named')].inner.fields" [] + Named {}, + // @is "$.index[*][?(@.name=='Tuple')].inner.kind" '"tuple"' + // @set Tuple = "$.index[*][?(@.name=='Tuple')].id" + // @is "$.index[*][?(@.name=='Tuple')].inner.fields" [] + Tuple(), + // @is "$.index[*][?(@.name=='NamedField')].inner.kind" '"named_fields"' + // @set NamedField = "$.index[*][?(@.name=='NamedField')].id" + // @set x = "$.index[*][?(@.name=='x' && @.kind=='field')].id" + // @is "$.index[*][?(@.name=='NamedField')].inner.fields[*]" $x + NamedField { x: i32 }, + // @is "$.index[*][?(@.name=='TupleField')].inner.kind" '"tuple"' + // @set TupleField = "$.index[*][?(@.name=='TupleField')].id" + // @set tup_field = "$.index[*][?(@.name=='0' && @.kind=='field')].id" + // @is "$.index[*][?(@.name=='TupleField')].inner.fields[*]" $tup_field + TupleField(i32), +} + +// @is "$.index[*][?(@.name=='Foo')].inner.variants[0]" $Unit +// @is "$.index[*][?(@.name=='Foo')].inner.variants[1]" $Named +// @is "$.index[*][?(@.name=='Foo')].inner.variants[2]" $Tuple +// @is "$.index[*][?(@.name=='Foo')].inner.variants[3]" $NamedField +// @is "$.index[*][?(@.name=='Foo')].inner.variants[4]" $TupleField +// @count "$.index[*][?(@.name=='Foo')].inner.variants[*]" 5 diff --git a/src/test/rustdoc-json/enums/some_fields_hidden.rs b/src/test/rustdoc-json/enums/some_fields_hidden.rs new file mode 100644 index 0000000000000..4eb2279f72b02 --- /dev/null +++ b/src/test/rustdoc-json/enums/some_fields_hidden.rs @@ -0,0 +1,22 @@ +#![feature(no_core)] +#![no_core] + +pub enum Foo { + // @set i8 = "$.index[*][?(@.docs=='i8' && @.kind=='field')].id" + // @is "$.index[*][?(@.docs=='i8' && @.kind=='field')].name" '"0"' + // @is "$.index[*][?(@.name=='V1')].inner.fields[*]" $i8 + // @is "$.index[*][?(@.name=='V1')].inner.fields_stripped" false + V1( + /// i8 + i8, + ), + // @set u8 = "$.index[*][?(@.docs=='u8' && @.kind=='field')].id" + // @is "$.index[*][?(@.docs=='u8' && @.kind=='field')].name" '"1"' + // @is "$.index[*][?(@.name=='V2')].inner.fields[*]" $u8 + // @is "$.index[*][?(@.name=='V2')].inner.fields_stripped" true + V2( + #[doc(hidden)] u8, + /// u8 + u8, + ), +} diff --git a/src/test/rustdoc-json/structs/empty_kinds.rs b/src/test/rustdoc-json/structs/empty_kinds.rs new file mode 100644 index 0000000000000..f2c4a86938875 --- /dev/null +++ b/src/test/rustdoc-json/structs/empty_kinds.rs @@ -0,0 +1,6 @@ +// @is "$.index[*][?(@.name == 'Unit')].inner.kind" '"unit"' +pub struct Unit; +// @is "$.index[*][?(@.name == 'Tuple')].inner.kind" '"tuple"' +pub struct Tuple(); +// @is "$.index[*][?(@.name == 'NamedFields')].inner.kind" '"named_fields"' +pub struct NamedFields {}