Skip to main content

rustdoc/
visit.rs

1use crate::clean::*;
2
3/// Allows a type to traverse the cleaned ast of a crate.
4///
5/// Note that like [`rustc_ast::visit::Visitor`], but
6/// unlike [`rustc_lint::EarlyLintPass`], if you override a
7/// `visit_*` method, you will need to manually recurse into
8/// its contents.
9pub(crate) trait DocVisitor<'a>: Sized {
10    fn visit_item(&mut self, item: &'a Item) {
11        self.visit_item_recur(item)
12    }
13
14    /// Don't override!
15    fn visit_inner_recur(&mut self, kind: &'a ItemKind) {
16        match kind {
17            ItemKind::Stripped(..) => unreachable!(),
18            ItemKind::Module(i) => {
19                self.visit_mod(i);
20            }
21            ItemKind::Struct(i) => i.fields.iter().for_each(|x| self.visit_item(x)),
22            ItemKind::Union(i) => i.fields.iter().for_each(|x| self.visit_item(x)),
23            ItemKind::Enum(i) => i.variants.iter().for_each(|x| self.visit_item(x)),
24            ItemKind::Trait(i) => i.items.iter().for_each(|x| self.visit_item(x)),
25            ItemKind::Impl(i) => i.items.iter().for_each(|x| self.visit_item(x)),
26            ItemKind::Variant(i) => match &i.kind {
27                VariantKind::Struct(j) => j.fields.iter().for_each(|x| self.visit_item(x)),
28                VariantKind::Tuple(fields) => fields.iter().for_each(|x| self.visit_item(x)),
29                VariantKind::CLike => {}
30            },
31            ItemKind::ExternCrate { src: _ }
32            | ItemKind::Import(_)
33            | ItemKind::Function(_)
34            | ItemKind::TypeAlias(_)
35            | ItemKind::Static(_)
36            | ItemKind::Constant(..)
37            | ItemKind::TraitAlias(_)
38            | ItemKind::AssocFunction(..)
39            | ItemKind::StructField(_)
40            | ItemKind::ForeignFunction(..)
41            | ItemKind::ForeignStatic(..)
42            | ItemKind::ForeignType
43            | ItemKind::DeclMacro(..)
44            | ItemKind::ProcMacro(_)
45            | ItemKind::PrimitiveType(_)
46            | ItemKind::AssocConstant(..)
47            | ItemKind::AssocType(..)
48            | ItemKind::Keyword
49            | ItemKind::Attribute
50            | ItemKind::PlaceholderImpl => {}
51        }
52    }
53
54    /// Don't override!
55    fn visit_item_recur(&mut self, item: &'a Item) {
56        self.visit_inner_recur(item.kind.unstripped())
57    }
58
59    fn visit_mod(&mut self, m: &'a Module) {
60        m.items.iter().for_each(|i| self.visit_item(i))
61    }
62
63    /// This is the main entrypoint of [`DocVisitor`].
64    fn visit_crate(&mut self, c: &'a Crate) {
65        self.visit_item(&c.module);
66
67        for trait_ in c.external_traits.values() {
68            trait_.items.iter().for_each(|i| self.visit_item(i));
69        }
70    }
71}