diff options
Diffstat (limited to '')
-rw-r--r-- | src/tools/jsondoclint/src/validator.rs | 53 |
1 files changed, 34 insertions, 19 deletions
diff --git a/src/tools/jsondoclint/src/validator.rs b/src/tools/jsondoclint/src/validator.rs index 94af4c5e9..e15f5fe3c 100644 --- a/src/tools/jsondoclint/src/validator.rs +++ b/src/tools/jsondoclint/src/validator.rs @@ -3,9 +3,9 @@ use std::hash::Hash; use rustdoc_json_types::{ Constant, Crate, DynTrait, Enum, FnDecl, Function, FunctionPointer, GenericArg, GenericArgs, - GenericBound, GenericParamDef, Generics, Id, Impl, Import, ItemEnum, Method, Module, OpaqueTy, - Path, Primitive, ProcMacro, Static, Struct, StructKind, Term, Trait, TraitAlias, Type, - TypeBinding, TypeBindingKind, Typedef, Union, Variant, WherePredicate, + GenericBound, GenericParamDef, Generics, Id, Impl, Import, ItemEnum, Module, OpaqueTy, Path, + Primitive, ProcMacro, Static, Struct, StructKind, Term, Trait, TraitAlias, Type, TypeBinding, + TypeBindingKind, Typedef, Union, Variant, WherePredicate, }; use crate::{item_kind::Kind, Error, ErrorKind}; @@ -32,7 +32,10 @@ pub struct Validator<'a> { enum PathKind { Trait, - StructEnumUnion, + /// Structs, Enums, Unions and Typedefs. + /// + /// This doesn't include trait's because traits are not types. + Type, } impl<'a> Validator<'a> { @@ -57,6 +60,8 @@ impl<'a> Validator<'a> { fn check_item(&mut self, id: &'a Id) { if let Some(item) = &self.krate.index.get(id) { + item.links.values().for_each(|id| self.add_any_id(id)); + match &item.inner { ItemEnum::Import(x) => self.check_import(x), ItemEnum::Union(x) => self.check_union(x), @@ -67,7 +72,6 @@ impl<'a> Validator<'a> { ItemEnum::Function(x) => self.check_function(x), ItemEnum::Trait(x) => self.check_trait(x), ItemEnum::TraitAlias(x) => self.check_trait_alias(x), - ItemEnum::Method(x) => self.check_method(x), ItemEnum::Impl(x) => self.check_impl(x), ItemEnum::Typedef(x) => self.check_typedef(x), ItemEnum::OpaqueTy(x) => self.check_opaque_ty(x), @@ -101,9 +105,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); } } @@ -176,11 +180,6 @@ impl<'a> Validator<'a> { x.params.iter().for_each(|i| self.check_generic_bound(i)); } - fn check_method(&mut self, x: &'a Method) { - self.check_fn_decl(&x.decl); - self.check_generics(&x.generics); - } - fn check_impl(&mut self, x: &'a Impl) { self.check_generics(&x.generics); if let Some(path) = &x.trait_ { @@ -230,7 +229,7 @@ impl<'a> Validator<'a> { fn check_type(&mut self, x: &'a Type) { match x { - Type::ResolvedPath(path) => self.check_path(path, PathKind::StructEnumUnion), + Type::ResolvedPath(path) => self.check_path(path, PathKind::Type), Type::DynTrait(dyn_trait) => self.check_dyn_trait(dyn_trait), Type::Generic(_) => {} Type::Primitive(_) => {} @@ -269,8 +268,8 @@ impl<'a> Validator<'a> { fn check_path(&mut self, x: &'a Path, kind: PathKind) { match kind { - PathKind::Trait => self.add_trait_id(&x.id), - PathKind::StructEnumUnion => self.add_struct_enum_union_id(&x.id), + PathKind::Trait => self.add_trait_or_alias_id(&x.id), + PathKind::Type => self.add_type_id(&x.id), } if let Some(args) = &x.args { self.check_generic_args(&**args); @@ -379,6 +378,10 @@ impl<'a> Validator<'a> { } } + fn add_any_id(&mut self, id: &'a Id) { + self.add_id_checked(id, |_| true, "any kind of item"); + } + fn add_field_id(&mut self, id: &'a Id) { self.add_id_checked(id, Kind::is_struct_field, "StructField"); } @@ -394,12 +397,12 @@ impl<'a> Validator<'a> { self.add_id_checked(id, Kind::is_variant, "Variant"); } - fn add_trait_id(&mut self, id: &'a Id) { - self.add_id_checked(id, Kind::is_trait, "Trait"); + fn add_trait_or_alias_id(&mut self, id: &'a Id) { + self.add_id_checked(id, Kind::is_trait_or_alias, "Trait (or TraitAlias)"); } - fn add_struct_enum_union_id(&mut self, id: &'a Id) { - self.add_id_checked(id, Kind::is_struct_enum_union, "Struct or Enum or Union"); + fn add_type_id(&mut self, id: &'a Id) { + self.add_id_checked(id, Kind::is_type, "Type (Struct, Enum, Union or Typedef)"); } /// Add an Id that appeared in a trait @@ -407,6 +410,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") @@ -440,3 +452,6 @@ fn set_remove<T: Hash + Eq + Clone>(set: &mut HashSet<T>) -> Option<T> { None } } + +#[cfg(test)] +mod tests; |