]> git.lizzy.rs Git - rust.git/blob - src/librustdoc/passes/strip_hidden.rs
Auto merge of #69421 - flip1995:clippyup, r=Dylan-DPC
[rust.git] / src / librustdoc / passes / strip_hidden.rs
1 use rustc_hir::def_id::DefIdSet;
2 use rustc_span::symbol::sym;
3 use std::mem;
4
5 use crate::clean::Item;
6 use crate::clean::{self, AttributesExt, NestedAttributesExt};
7 use crate::core::DocContext;
8 use crate::fold::{DocFolder, StripItem};
9 use crate::passes::{ImplStripper, Pass};
10
11 pub const STRIP_HIDDEN: Pass = Pass {
12     name: "strip-hidden",
13     run: strip_hidden,
14     description: "strips all doc(hidden) items from the output",
15 };
16
17 /// Strip items marked `#[doc(hidden)]`
18 pub fn strip_hidden(krate: clean::Crate, _: &DocContext<'_>) -> clean::Crate {
19     let mut retained = DefIdSet::default();
20
21     // strip all #[doc(hidden)] items
22     let krate = {
23         let mut stripper = Stripper { retained: &mut retained, update_retained: true };
24         stripper.fold_crate(krate)
25     };
26
27     // strip all impls referencing stripped items
28     let mut stripper = ImplStripper { retained: &retained };
29     let krate = stripper.fold_crate(krate);
30
31     krate
32 }
33
34 struct Stripper<'a> {
35     retained: &'a mut DefIdSet,
36     update_retained: bool,
37 }
38
39 impl<'a> DocFolder for Stripper<'a> {
40     fn fold_item(&mut self, i: Item) -> Option<Item> {
41         if i.attrs.lists(sym::doc).has_word(sym::hidden) {
42             debug!("strip_hidden: stripping {:?} {:?}", i.type_(), i.name);
43             // use a dedicated hidden item for given item type if any
44             match i.inner {
45                 clean::StructFieldItem(..) | clean::ModuleItem(..) => {
46                     // We need to recurse into stripped modules to
47                     // strip things like impl methods but when doing so
48                     // we must not add any items to the `retained` set.
49                     let old = mem::replace(&mut self.update_retained, false);
50                     let ret = StripItem(self.fold_item_recur(i).unwrap()).strip();
51                     self.update_retained = old;
52                     return ret;
53                 }
54                 _ => return None,
55             }
56         } else {
57             if self.update_retained {
58                 self.retained.insert(i.def_id);
59             }
60         }
61         self.fold_item_recur(i)
62     }
63 }