about summary refs log tree commit diff
path: root/src/rustdoc
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2012-01-18 18:51:04 -0800
committerBrian Anderson <banderson@mozilla.com>2012-01-18 19:59:24 -0800
commit20b8509594a8acd5dd68d7acb6da94029deed7fb (patch)
treea8f8f27b1092b3ff536155ebe70801ad18139392 /src/rustdoc
parente39e34776e97073e3ef6f2ef4c226e73ba701fe7 (diff)
downloadrust-20b8509594a8acd5dd68d7acb6da94029deed7fb.tar.gz
rust-20b8509594a8acd5dd68d7acb6da94029deed7fb.zip
rustdoc: Add mod docs attrs to the doc tree
Diffstat (limited to 'src/rustdoc')
-rw-r--r--src/rustdoc/attr_parser.rs2
-rw-r--r--src/rustdoc/attr_pass.rs56
-rw-r--r--src/rustdoc/fold.rs1
3 files changed, 58 insertions, 1 deletions
diff --git a/src/rustdoc/attr_parser.rs b/src/rustdoc/attr_parser.rs
index e05d6c627bf..3a90669df90 100644
--- a/src/rustdoc/attr_parser.rs
+++ b/src/rustdoc/attr_parser.rs
@@ -9,7 +9,7 @@ import rustc::syntax::ast;
 import rustc::front::attr;
 import core::tuple;
 
-export crate_attrs, fn_attrs, arg_attrs;
+export crate_attrs, mod_attrs, fn_attrs, arg_attrs;
 export parse_crate, parse_mod, parse_fn;
 
 type crate_attrs = {
diff --git a/src/rustdoc/attr_pass.rs b/src/rustdoc/attr_pass.rs
index 40953f7aec7..42abc78b4d3 100644
--- a/src/rustdoc/attr_pass.rs
+++ b/src/rustdoc/attr_pass.rs
@@ -26,6 +26,12 @@ fn run(
         ) -> doc::cratedoc {
             fold_crate(f, d)
         },
+        fold_mod: fn~(
+            f: fold::fold<astsrv::srv>,
+            d: doc::moddoc
+        ) -> doc::moddoc {
+            fold_mod(f, d)
+        },
         fold_fn: fn~(
             f: fold::fold<astsrv::srv>,
             d: doc::fndoc
@@ -68,6 +74,56 @@ fn should_replace_top_module_name_with_crate_name() {
     assert doc.topmod.name == "bond";
 }
 
+fn fold_mod(fold: fold::fold<astsrv::srv>, doc: doc::moddoc) -> doc::moddoc {
+    let srv = fold.ctxt;
+    let attrs = if doc.id == ast::crate_node_id {
+        // This is the top-level mod, use the crate attributes
+        astsrv::exec(srv) {|ctxt|
+            attr_parser::parse_mod(ctxt.ast.node.attrs)
+        }
+    } else {
+        astsrv::exec(srv) {|ctxt|
+            let attrs = alt ctxt.map.get(doc.id) {
+              ast_map::node_item(item) { item.attrs }
+            };
+            attr_parser::parse_mod(attrs)
+        }
+    };
+    let doc = fold::default_seq_fold_mod(fold, doc);
+    ret merge_mod_attrs(doc, attrs);
+
+    fn merge_mod_attrs(
+        doc: doc::moddoc,
+        attrs: attr_parser::mod_attrs
+    ) -> doc::moddoc {
+        ~{
+            brief: attrs.brief,
+            desc: attrs.desc
+            with *doc
+        }
+    }
+}
+
+#[test]
+fn fold_mod_should_extract_mod_attributes() {
+    let source = "#[doc = \"test\"] mod a { }";
+    let srv = astsrv::mk_srv_from_str(source);
+    let doc = extract::from_srv(srv, "");
+    let fold = fold::default_seq_fold(srv);
+    let doc = fold_mod(fold, doc.topmod.mods[0]);
+    assert doc.desc == some("test");
+}
+
+#[test]
+fn fold_mod_should_extract_top_mod_attributes() {
+    let source = "#[doc = \"test\"];";
+    let srv = astsrv::mk_srv_from_str(source);
+    let doc = extract::from_srv(srv, "");
+    let fold = fold::default_seq_fold(srv);
+    let doc = fold_mod(fold, doc.topmod);
+    assert doc.desc == some("test");
+}
+
 fn fold_fn(
     fold: fold::fold<astsrv::srv>,
     doc: doc::fndoc
diff --git a/src/rustdoc/fold.rs b/src/rustdoc/fold.rs
index da6a4d35c3e..7b52881414c 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_crate;
+export default_seq_fold_mod;
 export default_seq_fold_fn;
 export default_seq_fold_fnlist;