From b8840cbee603786107aa627eed4edcfc1c644b93 Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Mon, 16 Jan 2012 22:50:00 -0800 Subject: [PATCH] rustdoc: Add a pass to prune undocumented items --- src/rustdoc/fold.rs | 1 + src/rustdoc/prune_undoc_pass.rs | 67 +++++++++++++++++++++++++++++++++ src/rustdoc/rustdoc.rc | 1 + src/rustdoc/rustdoc.rs | 2 + 4 files changed, 71 insertions(+) create mode 100644 src/rustdoc/prune_undoc_pass.rs diff --git a/src/rustdoc/fold.rs b/src/rustdoc/fold.rs index e4fd440d0fd..085d24c9b29 100644 --- a/src/rustdoc/fold.rs +++ b/src/rustdoc/fold.rs @@ -2,6 +2,7 @@ export fold; export fold_crate, fold_mod, fold_fn, fold_modlist, fold_fnlist; export default_seq_fold; export default_seq_fold_fn; +export default_seq_fold_fnlist; tag fold = t; diff --git a/src/rustdoc/prune_undoc_pass.rs b/src/rustdoc/prune_undoc_pass.rs new file mode 100644 index 00000000000..1c1809effec --- /dev/null +++ b/src/rustdoc/prune_undoc_pass.rs @@ -0,0 +1,67 @@ +export run; + +type ctxt = { + mutable have_docs: bool +}; + +fn run( + _srv: astsrv::seq_srv, + doc: doc::cratedoc +) -> doc::cratedoc { + let ctxt = { + mutable have_docs: true + }; + let fold = fold::fold({ + fold_fn: fn~( + f: fold::fold, + d: doc::fndoc + ) -> doc::fndoc { + fold_fn(f, d) + }, + fold_fnlist: fn~( + f: fold::fold, + l: doc::fnlist + ) -> doc::fnlist { + fold_fnlist(f, l) + } + with *fold::default_seq_fold(ctxt) + }); + fold.fold_crate(fold, doc) +} + +fn fold_fn( + fold: fold::fold, + doc: doc::fndoc +) -> doc::fndoc { + fold.ctxt.have_docs = + doc.brief != none + || doc.desc != none + || doc.return != none; + ret doc; +} + +fn fold_fnlist( + fold: fold::fold, + list: doc::fnlist +) -> doc::fnlist { + doc::fnlist(vec::filter_map(*list) {|doc| + let doc = fold_fn(fold, doc); + if fold.ctxt.have_docs { + some(doc) + } else { + none + } + }) +} + +#[cfg(test)] +mod tests { + #[test] + fn should_elide_undocumented_fns() { + let source = "fn a() { }"; + let srv = astsrv::mk_seq_srv_from_str(source); + let doc = extract::from_srv(srv, ""); + let doc = run(srv, doc); + assert vec::is_empty(*doc.topmod.fns); + } +} \ No newline at end of file diff --git a/src/rustdoc/rustdoc.rc b/src/rustdoc/rustdoc.rc index c9d9746df4a..7d6694e1131 100644 --- a/src/rustdoc/rustdoc.rc +++ b/src/rustdoc/rustdoc.rc @@ -15,5 +15,6 @@ mod gen; mod fold; mod attr_pass; mod tystr_pass; +mod prune_undoc_pass; mod astsrv; mod util; \ No newline at end of file diff --git a/src/rustdoc/rustdoc.rs b/src/rustdoc/rustdoc.rs index 3f85f3e0946..cb951069e9a 100755 --- a/src/rustdoc/rustdoc.rs +++ b/src/rustdoc/rustdoc.rs @@ -77,6 +77,8 @@ fn run(source_file: str) { let doc = extract::from_srv(srv, default_name); let doc = run_passes(srv, doc, [ attr_pass::run, + // FIXME: This pass should be optional + prune_undoc_pass::run, tystr_pass::run ]); gen::write_markdown(doc, std::io::stdout());