mirror of
https://github.com/rust-lang/rust.git
synced 2025-10-03 02:40:40 +00:00
77 lines
2.6 KiB
Rust
77 lines
2.6 KiB
Rust
use crate::clean::*;
|
|
|
|
/// Allows a type to traverse the cleaned ast of a crate.
|
|
///
|
|
/// Note that like [`rustc_ast::visit::Visitor`], but
|
|
/// unlike [`rustc_lint::EarlyLintPass`], if you override a
|
|
/// `visit_*` method, you will need to manually recurse into
|
|
/// its contents.
|
|
pub(crate) trait DocVisitor<'a>: Sized {
|
|
fn visit_item(&mut self, item: &'a Item) {
|
|
self.visit_item_recur(item)
|
|
}
|
|
|
|
/// Don't override!
|
|
fn visit_inner_recur(&mut self, kind: &'a ItemKind) {
|
|
match kind {
|
|
StrippedItem(..) => unreachable!(),
|
|
ModuleItem(i) => {
|
|
self.visit_mod(i);
|
|
}
|
|
StructItem(i) => i.fields.iter().for_each(|x| self.visit_item(x)),
|
|
UnionItem(i) => i.fields.iter().for_each(|x| self.visit_item(x)),
|
|
EnumItem(i) => i.variants.iter().for_each(|x| self.visit_item(x)),
|
|
TraitItem(i) => i.items.iter().for_each(|x| self.visit_item(x)),
|
|
ImplItem(i) => i.items.iter().for_each(|x| self.visit_item(x)),
|
|
VariantItem(i) => match &i.kind {
|
|
VariantKind::Struct(j) => j.fields.iter().for_each(|x| self.visit_item(x)),
|
|
VariantKind::Tuple(fields) => fields.iter().for_each(|x| self.visit_item(x)),
|
|
VariantKind::CLike => {}
|
|
},
|
|
ExternCrateItem { src: _ }
|
|
| ImportItem(_)
|
|
| FunctionItem(_)
|
|
| TypeAliasItem(_)
|
|
| StaticItem(_)
|
|
| ConstantItem(..)
|
|
| TraitAliasItem(_)
|
|
| RequiredMethodItem(_)
|
|
| MethodItem(_, _)
|
|
| StructFieldItem(_)
|
|
| ForeignFunctionItem(..)
|
|
| ForeignStaticItem(..)
|
|
| ForeignTypeItem
|
|
| MacroItem(_)
|
|
| ProcMacroItem(_)
|
|
| PrimitiveItem(_)
|
|
| RequiredAssocConstItem(..)
|
|
| ProvidedAssocConstItem(..)
|
|
| ImplAssocConstItem(..)
|
|
| RequiredAssocTypeItem(..)
|
|
| AssocTypeItem(..)
|
|
| KeywordItem => {}
|
|
}
|
|
}
|
|
|
|
/// Don't override!
|
|
fn visit_item_recur(&mut self, item: &'a Item) {
|
|
match &item.kind {
|
|
StrippedItem(i) => self.visit_inner_recur(i),
|
|
_ => self.visit_inner_recur(&item.kind),
|
|
}
|
|
}
|
|
|
|
fn visit_mod(&mut self, m: &'a Module) {
|
|
m.items.iter().for_each(|i| self.visit_item(i))
|
|
}
|
|
|
|
/// This is the main entrypoint of [`DocVisitor`].
|
|
fn visit_crate(&mut self, c: &'a Crate) {
|
|
self.visit_item(&c.module);
|
|
|
|
for trait_ in c.external_traits.values() {
|
|
trait_.items.iter().for_each(|i| self.visit_item(i));
|
|
}
|
|
}
|
|
}
|