diff --git a/src/rustdoc/attr_parser.rs b/src/rustdoc/attr_parser.rs index aaabe303b98..bccf57129d6 100644 --- a/src/rustdoc/attr_parser.rs +++ b/src/rustdoc/attr_parser.rs @@ -13,6 +13,7 @@ export crate_attrs, basic_attrs, fn_attrs, arg_attrs, variant_attrs, res_attrs, method_attrs; export parse_crate, parse_basic, parse_fn, parse_variant, parse_res, parse_method; +export parse_hidden; type crate_attrs = { name: option @@ -363,3 +364,28 @@ fn shoulde_parse_resource_arg() { fn parse_method(attrs: [ast::attribute]) -> method_attrs { parse_fn(attrs) } + +fn parse_hidden(attrs: [ast::attribute]) -> bool { + parse_short_doc_or( + attrs, + {|_desc| false }, + {|metas, _brief, _desc| + let hiddens = attr::find_meta_items_by_name(metas, "hidden"); + vec::is_not_empty(hiddens) + } + ) +} + +#[test] +fn shoulde_parse_hidden_attribute() { + let source = "#[doc(hidden)]"; + let attrs = test::parse_attributes(source); + assert parse_hidden(attrs) == true; +} + +#[test] +fn shoulde_not_parse_non_hidden_attribute() { + let source = "#[doc = \"\"]"; + let attrs = test::parse_attributes(source); + assert parse_hidden(attrs) == false; +} diff --git a/src/rustdoc/prune_hidden_pass.rs b/src/rustdoc/prune_hidden_pass.rs new file mode 100644 index 00000000000..862018a9b80 --- /dev/null +++ b/src/rustdoc/prune_hidden_pass.rs @@ -0,0 +1,61 @@ +#[doc = "Prunes things with the #[doc(hidden)] attribute"]; + +export mk_pass; + +fn mk_pass() -> pass { + { + name: "prune_hidden", + f: run + } +} + +fn run(srv: astsrv::srv, doc: doc::doc) -> doc::doc { + let fold = fold::fold({ + fold_mod: fold_mod + with *fold::default_any_fold(srv) + }); + fold.fold_doc(fold, doc) +} + +fn fold_mod( + fold: fold::fold, + doc: doc::moddoc +) -> doc::moddoc { + let doc = fold::default_any_fold_mod(fold, doc); + + { + items: vec::filter(doc.items) {|itemtag| + !is_hidden(fold.ctxt, itemtag.item()) + } + with doc + } +} + +fn is_hidden(srv: astsrv::srv, doc: doc::itemdoc) -> bool { + import rustc::middle::ast_map; + + let id = doc.id; + astsrv::exec(srv) {|ctxt| + let attrs = alt ctxt.ast_map.get(id) { + ast_map::node_item(item, _) { item.attrs } + _ { [] } + }; + attr_parser::parse_hidden(attrs) + } +} + +#[test] +fn should_prune_hidden_items() { + let doc = test::mk_doc("#[doc(hidden)] mod a { }"); + assert vec::is_empty(doc.cratemod().mods()) +} + +#[cfg(test)] +mod test { + fn mk_doc(source: str) -> doc::doc { + astsrv::from_str(source) {|srv| + let doc = extract::from_srv(srv, ""); + run(srv, doc) + } + } +} diff --git a/src/rustdoc/rustdoc.rc b/src/rustdoc/rustdoc.rc index c53b11fa021..903c3abd920 100644 --- a/src/rustdoc/rustdoc.rc +++ b/src/rustdoc/rustdoc.rc @@ -27,6 +27,7 @@ mod tystr_pass; mod prune_undoc_details_pass; mod prune_undoc_items_pass; mod prune_unexported_pass; +mod prune_hidden_pass; mod desc_to_brief_pass; mod desc_pass; mod unindent_pass; diff --git a/src/rustdoc/rustdoc.rs b/src/rustdoc/rustdoc.rs index 3f480940e16..c99a1139e6c 100755 --- a/src/rustdoc/rustdoc.rs +++ b/src/rustdoc/rustdoc.rs @@ -146,6 +146,7 @@ fn run(config: config::config) { prune_undoc_details_pass::mk_pass(), // FIXME: This pass should be optional // prune_undoc_items_pass::mk_pass(), + prune_hidden_pass::mk_pass(), desc_to_brief_pass::mk_pass(), trim_pass::mk_pass(), unindent_pass::mk_pass(),