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