]> git.proxmox.com Git - rustc.git/blame - src/librustdoc/passes/strip_hidden.rs
New upstream version 1.62.1+dfsg1
[rustc.git] / src / librustdoc / passes / strip_hidden.rs
CommitLineData
a2a8927a 1//! Strip all doc(hidden) items from the output.
dfeec247 2use rustc_span::symbol::sym;
9e0c209e
SL
3use std::mem;
4
cdc7bbd5 5use crate::clean;
136023e0 6use crate::clean::{Item, ItemIdSet, NestedAttributesExt};
9fa01778 7use crate::core::DocContext;
17df50a5 8use crate::fold::{strip_item, DocFolder};
9fa01778 9use crate::passes::{ImplStripper, Pass};
b7449926 10
fc512014 11crate 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 18crate 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
32struct Stripper<'a> {
136023e0 33 retained: &'a mut ItemIdSet,
9e0c209e
SL
34 update_retained: bool,
35}
36
9fa01778 37impl<'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}