]>
Commit | Line | Data |
---|---|---|
9e0c209e SL |
1 | use rustc::util::nodemap::DefIdSet; |
2 | use std::mem; | |
3 | ||
9fa01778 XL |
4 | use crate::clean::{self, AttributesExt, NestedAttributesExt}; |
5 | use crate::clean::Item; | |
6 | use crate::core::DocContext; | |
7 | use crate::fold::{DocFolder, StripItem}; | |
8 | use crate::passes::{ImplStripper, Pass}; | |
b7449926 | 9 | |
532ac7d7 XL |
10 | pub 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 | 17 | pub 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 | ||
33 | struct Stripper<'a> { | |
34 | retained: &'a mut DefIdSet, | |
35 | update_retained: bool, | |
36 | } | |
37 | ||
9fa01778 | 38 | impl<'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 | } |