From ed0f097e4dcf8f557df038a7011d121f653bd24f Mon Sep 17 00:00:00 2001 From: Nixon Enraght-Moony Date: Sat, 26 Nov 2022 15:06:46 +0000 Subject: [PATCH] jsondoclint: Handle using enum variants and glob using enums. Closes #104942 --- src/test/rustdoc-json/enums/use_glob.rs | 18 ++++++++++++++++++ src/test/rustdoc-json/enums/use_variant.rs | 15 +++++++++++++++ src/tools/jsondoclint/src/item_kind.rs | 18 +++++++++++++++++- src/tools/jsondoclint/src/validator.rs | 13 +++++++++++-- 4 files changed, 61 insertions(+), 3 deletions(-) create mode 100644 src/test/rustdoc-json/enums/use_glob.rs create mode 100644 src/test/rustdoc-json/enums/use_variant.rs diff --git a/src/test/rustdoc-json/enums/use_glob.rs b/src/test/rustdoc-json/enums/use_glob.rs new file mode 100644 index 0000000000000..62b8b832afdaa --- /dev/null +++ b/src/test/rustdoc-json/enums/use_glob.rs @@ -0,0 +1,18 @@ +// Regression test for + +#![feature(no_core)] +#![no_core] + +// @set Color = "$.index[*][?(@.name == 'Color')].id" +pub enum Color { + Red, + Green, + Blue, +} + +// @set use_Color = "$.index[*][?(@.kind == 'import')].id" +// @is "$.index[*][?(@.kind == 'import')].inner.id" $Color +// @is "$.index[*][?(@.kind == 'import')].inner.glob" true +pub use Color::*; + +// @ismany "$.index[*][?(@.name == 'use_glob')].inner.items[*]" $Color $use_Color diff --git a/src/test/rustdoc-json/enums/use_variant.rs b/src/test/rustdoc-json/enums/use_variant.rs new file mode 100644 index 0000000000000..5f0d2b9b1ec84 --- /dev/null +++ b/src/test/rustdoc-json/enums/use_variant.rs @@ -0,0 +1,15 @@ +#![feature(no_core)] +#![no_core] + +// @set AlwaysNone = "$.index[*][?(@.name == 'AlwaysNone')].id" +pub enum AlwaysNone { + // @set None = "$.index[*][?(@.name == 'None')].id" + None, +} +// @is "$.index[*][?(@.name == 'AlwaysNone')].inner.variants[*]" $None + +// @set use_None = "$.index[*][?(@.kind == 'import')].id" +// @is "$.index[*][?(@.kind == 'import')].inner.id" $None +pub use AlwaysNone::None; + +// @ismany "$.index[*][?(@.name == 'use_variant')].inner.items[*]" $AlwaysNone $use_None diff --git a/src/tools/jsondoclint/src/item_kind.rs b/src/tools/jsondoclint/src/item_kind.rs index a533e36712236..7aaad0c055914 100644 --- a/src/tools/jsondoclint/src/item_kind.rs +++ b/src/tools/jsondoclint/src/item_kind.rs @@ -1,7 +1,7 @@ use rustdoc_json_types::{Item, ItemEnum, ItemKind, ItemSummary}; /// A univeral way to represent an [`ItemEnum`] or [`ItemKind`] -#[derive(Debug)] +#[derive(Debug, Clone, Copy)] pub(crate) enum Kind { Module, ExternCrate, @@ -68,6 +68,22 @@ impl Kind { } } + pub fn can_appear_in_import(self) -> bool { + match self { + Kind::Variant => true, + Kind::Import => false, + other => other.can_appear_in_mod(), + } + } + + pub fn can_appear_in_glob_import(self) -> bool { + match self { + Kind::Module => true, + Kind::Enum => true, + _ => false, + } + } + pub fn can_appear_in_trait(self) -> bool { match self { Kind::AssocConst => true, diff --git a/src/tools/jsondoclint/src/validator.rs b/src/tools/jsondoclint/src/validator.rs index 9548276d826fb..84968bf4a680f 100644 --- a/src/tools/jsondoclint/src/validator.rs +++ b/src/tools/jsondoclint/src/validator.rs @@ -103,9 +103,9 @@ impl<'a> Validator<'a> { fn check_import(&mut self, x: &'a Import) { if x.glob { - self.add_mod_id(x.id.as_ref().unwrap()); + self.add_glob_import_item_id(x.id.as_ref().unwrap()); } else if let Some(id) = &x.id { - self.add_mod_item_id(id); + self.add_import_item_id(id); } } @@ -404,6 +404,15 @@ impl<'a> Validator<'a> { self.add_id_checked(id, Kind::can_appear_in_trait, "Trait inner item"); } + /// Add an Id that can be `use`d + fn add_import_item_id(&mut self, id: &'a Id) { + self.add_id_checked(id, Kind::can_appear_in_import, "Import inner item"); + } + + fn add_glob_import_item_id(&mut self, id: &'a Id) { + self.add_id_checked(id, Kind::can_appear_in_glob_import, "Glob import inner item"); + } + /// Add an Id that appeared in a mod fn add_mod_item_id(&mut self, id: &'a Id) { self.add_id_checked(id, Kind::can_appear_in_mod, "Module inner item")