]>
Commit | Line | Data |
---|---|---|
a2a8927a | 1 | //! Strip all doc(hidden) items from the output. |
dfeec247 | 2 | use rustc_span::symbol::sym; |
9e0c209e SL |
3 | use std::mem; |
4 | ||
cdc7bbd5 | 5 | use crate::clean; |
136023e0 | 6 | use crate::clean::{Item, ItemIdSet, NestedAttributesExt}; |
9fa01778 | 7 | use crate::core::DocContext; |
17df50a5 | 8 | use crate::fold::{strip_item, DocFolder}; |
9fa01778 | 9 | use crate::passes::{ImplStripper, Pass}; |
b7449926 | 10 | |
fc512014 | 11 | crate const STRIP_HIDDEN: Pass = Pass { |
532ac7d7 | 12 | name: "strip-hidden", |
60c5eb7d | 13 | run: strip_hidden, |
5869c6ff | 14 | description: "strips all `#[doc(hidden)]` items from the output", |
532ac7d7 | 15 | }; |
9e0c209e SL |
16 | |
17 | /// Strip items marked `#[doc(hidden)]` | |
5099ac24 | 18 | crate fn strip_hidden(krate: clean::Crate, cx: &mut DocContext<'_>) -> clean::Crate { |
136023e0 | 19 | let mut retained = ItemIdSet::default(); |
9e0c209e SL |
20 | |
21 | // strip all #[doc(hidden)] items | |
22 | let krate = { | |
60c5eb7d | 23 | let mut stripper = Stripper { retained: &mut retained, update_retained: true }; |
9e0c209e SL |
24 | stripper.fold_crate(krate) |
25 | }; | |
26 | ||
27 | // strip all impls referencing stripped items | |
5099ac24 | 28 | let mut stripper = ImplStripper { retained: &retained, cache: &cx.cache }; |
5869c6ff | 29 | stripper.fold_crate(krate) |
9e0c209e SL |
30 | } |
31 | ||
32 | struct Stripper<'a> { | |
136023e0 | 33 | retained: &'a mut ItemIdSet, |
9e0c209e SL |
34 | update_retained: bool, |
35 | } | |
36 | ||
9fa01778 | 37 | impl<'a> DocFolder for Stripper<'a> { |
9e0c209e | 38 | fn fold_item(&mut self, i: Item) -> Option<Item> { |
48663c56 | 39 | if i.attrs.lists(sym::doc).has_word(sym::hidden) { |
e74abb32 | 40 | debug!("strip_hidden: stripping {:?} {:?}", i.type_(), i.name); |
9e0c209e | 41 | // use a dedicated hidden item for given item type if any |
5869c6ff | 42 | match *i.kind { |
9e0c209e SL |
43 | clean::StructFieldItem(..) | clean::ModuleItem(..) => { |
44 | // We need to recurse into stripped modules to | |
45 | // strip things like impl methods but when doing so | |
46 | // we must not add any items to the `retained` set. | |
47 | let old = mem::replace(&mut self.update_retained, false); | |
17df50a5 | 48 | let ret = strip_item(self.fold_item_recur(i)); |
9e0c209e | 49 | self.update_retained = old; |
5869c6ff | 50 | return Some(ret); |
9e0c209e SL |
51 | } |
52 | _ => return None, | |
53 | } | |
54 | } else { | |
55 | if self.update_retained { | |
04454e1e | 56 | self.retained.insert(i.item_id); |
9e0c209e SL |
57 | } |
58 | } | |
fc512014 | 59 | Some(self.fold_item_recur(i)) |
9e0c209e SL |
60 | } |
61 | } |