about summary refs log tree commit diff
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2012-01-23 15:40:01 -0800
committerBrian Anderson <banderson@mozilla.com>2012-01-23 15:40:01 -0800
commite51599932478db1d841912a6e0a10cbc20335e1f (patch)
treebc939045785718b36f73893eeca74bc4a96595c1
parent521e58a3c4f45ffc30a914dd0bb517945d87a503 (diff)
downloadrust-e51599932478db1d841912a6e0a10cbc20335e1f.tar.gz
rust-e51599932478db1d841912a6e0a10cbc20335e1f.zip
rustdoc: Prune undocumented modules
-rw-r--r--src/rustdoc/prune_undoc_pass.rs58
1 files changed, 58 insertions, 0 deletions
diff --git a/src/rustdoc/prune_undoc_pass.rs b/src/rustdoc/prune_undoc_pass.rs
index ba8a5456a27..dd7abf2f0ed 100644
--- a/src/rustdoc/prune_undoc_pass.rs
+++ b/src/rustdoc/prune_undoc_pass.rs
@@ -18,13 +18,28 @@ fn run(
         mutable have_docs: true
     };
     let fold = fold::fold({
+        fold_mod: fold_mod,
         fold_fn: fold_fn,
+        fold_modlist: fold_modlist,
         fold_fnlist: fold_fnlist
         with *fold::default_seq_fold(ctxt)
     });
     fold.fold_crate(fold, doc)
 }
 
+fn fold_mod(
+    fold: fold::fold<ctxt>,
+    doc: doc::moddoc
+) -> doc::moddoc {
+    let doc = fold::default_seq_fold_mod(fold, doc);
+    fold.ctxt.have_docs =
+        doc.brief != none
+        || doc.desc != none
+        || vec::is_not_empty(*doc.mods)
+        || vec::is_not_empty(*doc.fns);
+    ret doc;
+}
+
 fn fold_fn(
     fold: fold::fold<ctxt>,
     doc: doc::fndoc
@@ -36,6 +51,20 @@ fn fold_fn(
     ret doc;
 }
 
+fn fold_modlist(
+    fold: fold::fold<ctxt>,
+    list: doc::modlist
+) -> doc::modlist {
+    doc::modlist(vec::filter_map(*list) {|doc|
+        let doc = fold_mod(fold, doc);
+        if fold.ctxt.have_docs {
+            some(doc)
+        } else {
+            none
+        }
+    })
+}
+
 fn fold_fnlist(
     fold: fold::fold<ctxt>,
     list: doc::fnlist
@@ -53,6 +82,35 @@ fn fold_fnlist(
 #[cfg(test)]
 mod tests {
     #[test]
+    fn should_elide_undocumented_mods() {
+        let source = "mod a { }";
+        let srv = astsrv::mk_srv_from_str(source);
+        let doc = extract::from_srv(srv, "");
+        let doc = run(srv, doc);
+        assert vec::is_empty(*doc.topmod.mods);
+    }
+
+    #[test]
+    fn should_not_elide_undocument_mods_with_documented_mods() {
+        let source = "mod a { #[doc = \"b\"] mod b { } }";
+        let srv = astsrv::mk_srv_from_str(source);
+        let doc = extract::from_srv(srv, "");
+        let doc = attr_pass::mk_pass()(srv, doc);
+        let doc = run(srv, doc);
+        assert vec::is_not_empty(*doc.topmod.mods);
+    }
+
+    #[test]
+    fn should_not_elide_undocument_mods_with_documented_fns() {
+        let source = "mod a { #[doc = \"b\"] fn b() { } }";
+        let srv = astsrv::mk_srv_from_str(source);
+        let doc = extract::from_srv(srv, "");
+        let doc = attr_pass::mk_pass()(srv, doc);
+        let doc = run(srv, doc);
+        assert vec::is_not_empty(*doc.topmod.mods);
+    }
+
+    #[test]
     fn should_elide_undocumented_fns() {
         let source = "fn a() { }";
         let srv = astsrv::mk_srv_from_str(source);