diff options
| author | Kevin Ballard <kevin@sb.org> | 2014-02-11 14:42:23 -0800 |
|---|---|---|
| committer | Kevin Ballard <kevin@sb.org> | 2014-02-14 10:52:18 -0800 |
| commit | 9e6c3f03bc09873eae0c9d1eae9b7a3603fb4f6c (patch) | |
| tree | 9e37935a12dda14189febdcd10360ae5bb3762bb | |
| parent | 52a3d38796c616bbed39cda2dc3538f2cedbd5ac (diff) | |
| download | rust-9e6c3f03bc09873eae0c9d1eae9b7a3603fb4f6c.tar.gz rust-9e6c3f03bc09873eae0c9d1eae9b7a3603fb4f6c.zip | |
rustdoc: Strip impls of traits on #[doc(hidden)] types
In the strip-hidden pass, record all types that were stripped, and make a second pass stripping all impls of traits for these types.
| -rw-r--r-- | src/librustdoc/passes.rs | 70 |
1 files changed, 51 insertions, 19 deletions
diff --git a/src/librustdoc/passes.rs b/src/librustdoc/passes.rs index fce4cab52c9..6ebaf6eece8 100644 --- a/src/librustdoc/passes.rs +++ b/src/librustdoc/passes.rs @@ -22,30 +22,62 @@ use fold::DocFolder; /// Strip items marked `#[doc(hidden)]` pub fn strip_hidden(krate: clean::Crate) -> plugins::PluginResult { - struct Stripper; - impl fold::DocFolder for Stripper { - fn fold_item(&mut self, i: Item) -> Option<Item> { - for attr in i.attrs.iter() { - match attr { - &clean::List(~"doc", ref l) => { - for innerattr in l.iter() { - match innerattr { - &clean::Word(ref s) if "hidden" == *s => { - debug!("found one in strip_hidden; removing"); - return None; - }, - _ => (), + let mut stripped = HashSet::new(); + + // strip all #[doc(hidden)] items + let krate = { + struct Stripper<'a> { + stripped: &'a mut HashSet<ast::NodeId> + }; + impl<'a> fold::DocFolder for Stripper<'a> { + fn fold_item(&mut self, i: Item) -> Option<Item> { + for attr in i.attrs.iter() { + match attr { + &clean::List(~"doc", ref l) => { + for innerattr in l.iter() { + match innerattr { + &clean::Word(ref s) if "hidden" == *s => { + debug!("found one in strip_hidden; removing"); + self.stripped.insert(i.id); + return None; + }, + _ => (), + } } + }, + _ => () + } + } + self.fold_item_recur(i) + } + } + let mut stripper = Stripper{ stripped: &mut stripped }; + stripper.fold_crate(krate) + }; + + // strip any traits implemented on stripped items + let krate = { + struct ImplStripper<'a> { + stripped: &'a mut HashSet<ast::NodeId> + }; + impl<'a> fold::DocFolder for ImplStripper<'a> { + fn fold_item(&mut self, i: Item) -> Option<Item> { + match i.inner { + clean::ImplItem(clean::Impl{ for_: clean::ResolvedPath{ id: for_id, .. }, + .. }) => { + if self.stripped.contains(&for_id) { + return None; } - }, - _ => () + } + _ => {} } + self.fold_item_recur(i) } - self.fold_item_recur(i) } - } - let mut stripper = Stripper; - let krate = stripper.fold_crate(krate); + let mut stripper = ImplStripper{ stripped: &mut stripped }; + stripper.fold_crate(krate) + }; + (krate, None) } |
