From 594807951f0a7761ad31642168fd3728b78923dc Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Fri, 10 Jan 2014 14:54:11 -0800 Subject: [PATCH] rustdoc: Don't show private modules --- src/librustdoc/html/render.rs | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/src/librustdoc/html/render.rs b/src/librustdoc/html/render.rs index 35eb9e88a4a..218d162de84 100644 --- a/src/librustdoc/html/render.rs +++ b/src/librustdoc/html/render.rs @@ -157,6 +157,7 @@ pub struct Cache { priv stack: ~[~str], priv parent_stack: ~[ast::NodeId], priv search_index: ~[IndexItem], + priv privmod: bool, } /// Helper struct to render all source code to HTML pages @@ -241,6 +242,7 @@ pub fn run(mut crate: clean::Crate, dst: Path) { parent_stack: ~[], search_index: ~[], extern_locations: HashMap::new(), + privmod: false, }; cache.stack.push(crate.name.clone()); crate = cache.fold_crate(crate); @@ -455,6 +457,16 @@ fn emit_source(&mut self, filename: &str) -> bool { impl DocFolder for Cache { fn fold_item(&mut self, item: clean::Item) -> Option { + // If this is a private module, we don't want it in the search index. + let orig_privmod = match item.inner { + clean::ModuleItem(..) => { + let prev = self.privmod; + self.privmod = prev || item.visibility != Some(ast::public); + prev + } + _ => self.privmod, + }; + // Register any generics to their corresponding string. This is used // when pretty-printing types match item.inner { @@ -530,7 +542,7 @@ fn fold_item(&mut self, item: clean::Item) -> Option { _ => Some((None, self.stack.as_slice())) }; match parent { - Some((parent, path)) => { + Some((parent, path)) if !self.privmod => { self.search_index.push(IndexItem { ty: shortty(&item), name: s.to_owned(), @@ -539,7 +551,7 @@ fn fold_item(&mut self, item: clean::Item) -> Option { parent: parent, }); } - None => {} + Some(..) | None => {} } } None => {} @@ -612,8 +624,12 @@ fn fold_item(&mut self, item: clean::Item) -> Option { // Private modules may survive the strip-private pass if // they contain impls for public types, but those will get // stripped here - clean::Item { inner: clean::ModuleItem(ref m), .. } - if m.items.len() == 0 => None, + clean::Item { inner: clean::ModuleItem(ref m), + visibility, .. } + if (m.items.len() == 0 && + item.doc_value().is_none()) || + visibility != Some(ast::public) => None, + i => Some(i), } } @@ -622,6 +638,7 @@ fn fold_item(&mut self, item: clean::Item) -> Option { if pushed { self.stack.pop(); } if parent_pushed { self.parent_stack.pop(); } + self.privmod = orig_privmod; return ret; } } -- GitLab