diff options
| author | bors <bors@rust-lang.org> | 2014-09-25 07:12:37 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2014-09-25 07:12:37 +0000 |
| commit | d299bafb31a7c0528e690e48ec6d5591f1eb0bac (patch) | |
| tree | 0ae9520811c5f80e122d45896ad8a2fe2672a058 /src/librustdoc | |
| parent | 9ff308137afcacb4bc0d47e00d1dbb730229d932 (diff) | |
| parent | 3d8ca595a158dbf4ffbaece479e75b9c811ce815 (diff) | |
| download | rust-d299bafb31a7c0528e690e48ec6d5591f1eb0bac.tar.gz rust-d299bafb31a7c0528e690e48ec6d5591f1eb0bac.zip | |
auto merge of #17492 : alexcrichton/rust/issue-16274, r=aturon
Details in the commits.
Diffstat (limited to 'src/librustdoc')
| -rw-r--r-- | src/librustdoc/visit_ast.rs | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/src/librustdoc/visit_ast.rs b/src/librustdoc/visit_ast.rs index a9e0c9cb260..d4a1a357909 100644 --- a/src/librustdoc/visit_ast.rs +++ b/src/librustdoc/visit_ast.rs @@ -11,6 +11,8 @@ //! Rust AST Visitor. Extracts useful information and massages it into a form //! usable for clean +use std::collections::HashSet; + use syntax::abi; use syntax::ast; use syntax::ast_util; @@ -38,16 +40,21 @@ pub struct RustdocVisitor<'a, 'tcx: 'a> { pub attrs: Vec<ast::Attribute>, pub cx: &'a core::DocContext<'tcx>, pub analysis: Option<&'a core::CrateAnalysis>, + view_item_stack: HashSet<ast::NodeId>, } impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> { pub fn new(cx: &'a core::DocContext<'tcx>, analysis: Option<&'a core::CrateAnalysis>) -> RustdocVisitor<'a, 'tcx> { + // If the root is reexported, terminate all recursion. + let mut stack = HashSet::new(); + stack.insert(ast::CRATE_NODE_ID); RustdocVisitor { module: Module::new(None), attrs: Vec::new(), cx: cx, analysis: analysis, + view_item_stack: stack, } } @@ -228,8 +235,9 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> { if !please_inline && analysis.public_items.contains(&def.node) { return false } + if !self.view_item_stack.insert(def.node) { return false } - match tcx.map.get(def.node) { + let ret = match tcx.map.get(def.node) { ast_map::NodeItem(it) => { if glob { match it.node { @@ -249,7 +257,9 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> { true } _ => false, - } + }; + self.view_item_stack.remove(&id); + return ret; } pub fn visit_item(&mut self, item: &ast::Item, |
