diff options
Diffstat (limited to 'src/rustdoc/prune_private_pass.rs')
| -rw-r--r-- | src/rustdoc/prune_private_pass.rs | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/src/rustdoc/prune_private_pass.rs b/src/rustdoc/prune_private_pass.rs new file mode 100644 index 00000000000..9bb17766366 --- /dev/null +++ b/src/rustdoc/prune_private_pass.rs @@ -0,0 +1,65 @@ +//! Prune things that are private + +export mk_pass; + +fn mk_pass() -> Pass { + { + name: ~"prune_private", + f: run + } +} + +fn run(srv: astsrv::Srv, doc: doc::Doc) -> doc::Doc { + let fold = fold::Fold({ + fold_mod: fold_mod, + .. *fold::default_any_fold(srv) + }); + fold.fold_doc(fold, doc) +} + +fn fold_mod( + fold: fold::Fold<astsrv::Srv>, + doc: doc::ModDoc +) -> doc::ModDoc { + let doc = fold::default_any_fold_mod(fold, doc); + + doc::ModDoc_({ + items: do doc.items.filter |ItemTag| { + is_visible(fold.ctxt, ItemTag.item()) + }, + .. *doc + }) +} + +fn is_visible(srv: astsrv::Srv, doc: doc::ItemDoc) -> bool { + use syntax::ast_map; + use syntax::ast; + + let id = doc.id; + + do astsrv::exec(srv) |ctxt| { + match ctxt.ast_map.get(id) { + ast_map::node_item(item, _) => { + item.vis == ast::public + } + _ => util::unreachable() + } + } +} + +#[test] +fn should_prune_items_without_pub_modifier() { + let doc = test::mk_doc(~"mod a { }"); + assert vec::is_empty(doc.cratemod().mods()); +} + +#[cfg(test)] +mod test { + fn mk_doc(source: ~str) -> doc::Doc { + do astsrv::from_str(source) |srv| { + let doc = extract::from_srv(srv, ~""); + run(srv, doc) + } + } +} + |
