diff options
| author | Brian Anderson <banderson@mozilla.com> | 2012-01-31 21:52:30 -0800 |
|---|---|---|
| committer | Brian Anderson <banderson@mozilla.com> | 2012-01-31 21:54:16 -0800 |
| commit | f6f3d518e6374307361d982315bfe23055220b0d (patch) | |
| tree | 5b067a55556b2998e2e8281afb029708d7fffed9 /src/rustdoc | |
| parent | e204aa281d093bd7de4214c45375949d197eb2ab (diff) | |
| download | rust-f6f3d518e6374307361d982315bfe23055220b0d.tar.gz rust-f6f3d518e6374307361d982315bfe23055220b0d.zip | |
rustdoc: Split the pruning of undocumented branches into two passes
prune_undoc_details_pass strips arguments and return values that are undocumented. prune_undoc_items_pass prunes entire items.
Diffstat (limited to 'src/rustdoc')
| -rw-r--r-- | src/rustdoc/prune_undoc_details_pass.rs | 162 | ||||
| -rw-r--r-- | src/rustdoc/prune_undoc_items_pass.rs (renamed from src/rustdoc/prune_undoc_pass.rs) | 123 | ||||
| -rw-r--r-- | src/rustdoc/rustdoc.rc | 3 | ||||
| -rwxr-xr-x | src/rustdoc/rustdoc.rs | 3 |
4 files changed, 187 insertions, 104 deletions
diff --git a/src/rustdoc/prune_undoc_details_pass.rs b/src/rustdoc/prune_undoc_details_pass.rs new file mode 100644 index 00000000000..0dd66ffcdd8 --- /dev/null +++ b/src/rustdoc/prune_undoc_details_pass.rs @@ -0,0 +1,162 @@ +#[doc = "Prunes args, retvals of the document tree that \ + contain no documentation"]; + +export mk_pass; + +fn mk_pass() -> pass { + run +} + +fn run( + _srv: astsrv::srv, + doc: doc::cratedoc +) -> doc::cratedoc { + let fold = fold::fold({ + fold_fn: fold_fn, + fold_res: fold_res, + fold_iface: fold_iface, + fold_impl: fold_impl + with *fold::default_seq_fold(()) + }); + fold.fold_crate(fold, doc) +} + +fn fold_fn( + fold: fold::fold<()>, + doc: doc::fndoc +) -> doc::fndoc { + let doc = fold::default_seq_fold_fn(fold, doc); + + { + args: prune_args(doc.args), + return: prune_return(doc.return) + with doc + } +} + +fn prune_args(docs: [doc::argdoc]) -> [doc::argdoc] { + vec::filter_map(docs) {|doc| + if option::is_some(doc.desc) { + some(doc) + } else { + none + } + } +} + +fn prune_return(doc: doc::retdoc) -> doc::retdoc { + { + ty: if option::is_some(doc.desc) { + doc.ty + } else { + none + } + with doc + } +} + +#[test] +fn should_elide_undocumented_arguments() { + let doc = test::mk_doc("#[doc = \"hey\"] fn a(b: int) { }"); + assert vec::is_empty(doc.topmod.fns()[0].args); +} + +#[test] +fn should_elide_undocumented_return_values() { + let source = "#[doc = \"fonz\"] fn a() -> int { }"; + let srv = astsrv::mk_srv_from_str(source); + let doc = extract::from_srv(srv, ""); + let doc = tystr_pass::mk_pass()(srv, doc); + let doc = attr_pass::mk_pass()(srv, doc); + let doc = run(srv, doc); + assert doc.topmod.fns()[0].return.ty == none; +} + +fn fold_res( + fold: fold::fold<()>, + doc: doc::resdoc +) -> doc::resdoc { + let doc = fold::default_seq_fold_res(fold, doc); + + { + args: prune_args(doc.args) + with doc + } +} + +#[test] +fn should_elide_undocumented_resource_args() { + let doc = test::mk_doc("#[doc = \"drunk\"]\ + resource r(a: bool) { }"); + assert vec::is_empty(doc.topmod.resources()[0].args); +} + +fn fold_iface( + fold: fold::fold<()>, + doc: doc::ifacedoc +) -> doc::ifacedoc { + let doc = fold::default_seq_fold_iface(fold, doc); + + { + methods: prune_methods(doc.methods) + with doc + } +} + +fn prune_methods(docs: [doc::methoddoc]) -> [doc::methoddoc] { + vec::map(docs) {|doc| + { + args: prune_args(doc.args), + return: prune_return(doc.return) + with doc + } + } +} + +#[test] +fn should_elide_undocumented_iface_method_args() { + let doc = test::mk_doc("#[doc = \"hey\"] iface i { fn a(); }"); + assert vec::is_empty(doc.topmod.ifaces()[0].methods[0].args); +} + +#[test] +fn should_elide_undocumented_iface_method_return_values() { + let doc = test::mk_doc("#[doc = \"hey\"] iface i { fn a() -> int; }"); + assert doc.topmod.ifaces()[0].methods[0].return.ty == none; +} + +fn fold_impl( + fold: fold::fold<()>, + doc: doc::impldoc +) -> doc::impldoc { + let doc = fold::default_seq_fold_impl(fold, doc); + + { + methods: prune_methods(doc.methods) + with doc + } +} + +#[test] +fn should_elide_undocumented_impl_method_args() { + let doc = test::mk_doc( + "#[doc = \"hey\"] impl i for int { fn a(b: bool) { } }"); + assert vec::is_empty(doc.topmod.impls()[0].methods[0].args); +} + +#[test] +fn should_elide_undocumented_impl_method_return_values() { + let doc = test::mk_doc( + "#[doc = \"hey\"] impl i for int { fn a() -> int { } }"); + assert doc.topmod.impls()[0].methods[0].return.ty == none; +} + +#[cfg(test)] +mod test { + fn mk_doc(source: str) -> doc::cratedoc { + let srv = astsrv::mk_srv_from_str(source); + let doc = extract::from_srv(srv, ""); + let doc = attr_pass::mk_pass()(srv, doc); + run(srv, doc) + } +} diff --git a/src/rustdoc/prune_undoc_pass.rs b/src/rustdoc/prune_undoc_items_pass.rs index 5b197b9859a..3fa3298bdc5 100644 --- a/src/rustdoc/prune_undoc_pass.rs +++ b/src/rustdoc/prune_undoc_items_pass.rs @@ -1,4 +1,4 @@ -#[doc = "Prunes branches of the document tree that contain no documentation"]; +#[doc = "Prunes items of the document tree that contain no documentation"]; export mk_pass; @@ -109,46 +109,27 @@ fn fold_fn( fold: fold::fold<ctxt>, doc: doc::fndoc ) -> doc::fndoc { - let doc = { - args: prune_args(doc.args), - return: prune_return(doc.return) - with doc - }; + let doc = fold::default_seq_fold_fn(fold, doc); fold.ctxt.have_docs = doc.brief != none || doc.desc != none - || vec::is_not_empty(doc.args) + || args_have_docs(doc.args) || doc.return.desc != none || doc.failure != none; ret doc; } -fn prune_args(docs: [doc::argdoc]) -> [doc::argdoc] { - vec::filter_map(docs) {|doc| - if option::is_some(doc.desc) { - some(doc) - } else { - none - } - } -} - -fn prune_return(doc: doc::retdoc) -> doc::retdoc { - { - ty: if option::is_some(doc.desc) { - doc.ty - } else { - none - } - with doc +fn args_have_docs(docs: [doc::argdoc]) -> bool { + vec::foldl(false, docs) {|accum, doc| + accum || doc.desc != none } } #[test] -fn should_elide_undocumented_arguments() { - let doc = test::mk_doc("#[doc = \"hey\"] fn a(b: int) { }"); - assert vec::is_empty(doc.topmod.fns()[0].args); +fn should_elide_fns_with_undocumented_arguments() { + let doc = test::mk_doc("fn a(a: int) { }"); + assert vec::is_empty(doc.topmod.fns()); } #[test] @@ -158,17 +139,6 @@ fn should_not_elide_fns_with_documented_arguments() { } #[test] -fn should_elide_undocumented_return_values() { - let source = "#[doc = \"fonz\"] fn a() -> int { }"; - let srv = astsrv::mk_srv_from_str(source); - let doc = extract::from_srv(srv, ""); - let doc = tystr_pass::mk_pass()(srv, doc); - let doc = attr_pass::mk_pass()(srv, doc); - let doc = run(srv, doc); - assert doc.topmod.fns()[0].return.ty == none; -} - -#[test] fn should_not_elide_fns_with_documented_failure_conditions() { let doc = test::mk_doc("#[doc(failure = \"yup\")] fn a() { }"); assert vec::is_not_empty(doc.topmod.fns()); @@ -252,20 +222,12 @@ fn should_not_elide_enums_with_documented_variants() { } fn fold_res(fold: fold::fold<ctxt>, doc: doc::resdoc) -> doc::resdoc { - let doc = { - args: vec::filter_map(doc.args) {|arg| - if arg.desc != none { - some(arg) - } else { - none - } - } - with fold::default_seq_fold_res(fold, doc) - }; + let doc = fold::default_seq_fold_res(fold, doc); + fold.ctxt.have_docs = doc.brief != none || doc.desc != none - || vec::is_not_empty(doc.args); + || args_have_docs(doc.args); ret doc; } @@ -276,13 +238,6 @@ fn should_elide_undocumented_resources() { } #[test] -fn should_elide_undocumented_resource_args() { - let doc = test::mk_doc("#[doc = \"drunk\"]\ - resource r(a: bool) { }"); - assert vec::is_empty(doc.topmod.resources()[0].args); -} - -#[test] fn should_not_elide_resources_with_documented_args() { let doc = test::mk_doc("#[doc(args(a = \"drunk\"))]\ resource r(a: bool) { }"); @@ -294,10 +249,7 @@ fn fold_iface( doc: doc::ifacedoc ) -> doc::ifacedoc { let doc = fold::default_seq_fold_iface(fold, doc); - let doc = { - methods: prune_methods(doc.methods) - with doc - }; + fold.ctxt.have_docs = doc.brief != none || doc.desc != none @@ -305,22 +257,12 @@ fn fold_iface( ret doc; } -fn prune_methods(docs: [doc::methoddoc]) -> [doc::methoddoc] { - vec::map(docs) {|doc| - { - args: prune_args(doc.args), - return: prune_return(doc.return) - with doc - } - } -} - fn methods_have_docs(docs: [doc::methoddoc]) -> bool { vec::foldl(false, docs) {|accum, doc| accum || doc.brief != none || doc.desc != none - || vec::is_not_empty(doc.args) + || args_have_docs(doc.args) || doc.return.desc != none || doc.failure != none } @@ -339,6 +281,12 @@ fn should_not_elide_documented_ifaces() { } #[test] +fn should_elide_ifaces_with_undocumented_args() { + let doc = test::mk_doc("iface i { fn a(b: bool); }"); + assert vec::is_empty(doc.topmod.ifaces()); +} + +#[test] fn should_not_elide_ifaces_with_documented_methods() { let doc = test::mk_doc("iface i { #[doc = \"hey\"] fn a(); }"); assert vec::is_not_empty(doc.topmod.ifaces()); @@ -350,27 +298,12 @@ fn should_not_elide_undocumented_iface_methods() { assert vec::is_not_empty(doc.topmod.ifaces()[0].methods); } -#[test] -fn should_elide_undocumented_iface_method_args() { - let doc = test::mk_doc("#[doc = \"hey\"] iface i { fn a(); }"); - assert vec::is_empty(doc.topmod.ifaces()[0].methods[0].args); -} - -#[test] -fn should_elide_undocumented_iface_method_return_values() { - let doc = test::mk_doc("#[doc = \"hey\"] iface i { fn a() -> int; }"); - assert doc.topmod.ifaces()[0].methods[0].return.ty == none; -} - fn fold_impl( fold: fold::fold<ctxt>, doc: doc::impldoc ) -> doc::impldoc { let doc = fold::default_seq_fold_impl(fold, doc); - let doc = { - methods: prune_methods(doc.methods) - with doc - }; + fold.ctxt.have_docs = doc.brief != none || doc.desc != none @@ -402,20 +335,6 @@ fn should_not_elide_undocumented_impl_methods() { assert vec::is_not_empty(doc.topmod.impls()[0].methods); } -#[test] -fn should_elide_undocumented_impl_method_args() { - let doc = test::mk_doc( - "#[doc = \"hey\"] impl i for int { fn a(b: bool) { } }"); - assert vec::is_empty(doc.topmod.impls()[0].methods[0].args); -} - -#[test] -fn should_elide_undocumented_impl_method_return_values() { - let doc = test::mk_doc( - "#[doc = \"hey\"] impl i for int { fn a() -> int { } }"); - assert doc.topmod.impls()[0].methods[0].return.ty == none; -} - #[cfg(test)] mod test { fn mk_doc(source: str) -> doc::cratedoc { diff --git a/src/rustdoc/rustdoc.rc b/src/rustdoc/rustdoc.rc index 6987e7516dc..a8669237368 100644 --- a/src/rustdoc/rustdoc.rc +++ b/src/rustdoc/rustdoc.rc @@ -21,7 +21,8 @@ mod fold; mod path_pass; mod attr_pass; mod tystr_pass; -mod prune_undoc_pass; +mod prune_undoc_details_pass; +mod prune_undoc_items_pass; mod prune_unexported_pass; mod desc_to_brief_pass; mod desc_pass; diff --git a/src/rustdoc/rustdoc.rs b/src/rustdoc/rustdoc.rs index d309bf56ab6..e117222aedf 100755 --- a/src/rustdoc/rustdoc.rs +++ b/src/rustdoc/rustdoc.rs @@ -100,8 +100,9 @@ fn run(source_file: str) { tystr_pass::mk_pass(), path_pass::mk_pass(), attr_pass::mk_pass(), + prune_undoc_details_pass::mk_pass(), // FIXME: This pass should be optional - prune_undoc_pass::mk_pass(), + // prune_undoc_items_pass::mk_pass(), desc_to_brief_pass::mk_pass(), trim_pass::mk_pass(), unindent_pass::mk_pass(), |
