about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/rustdoc/attr_parser.rs15
-rw-r--r--src/rustdoc/attr_pass.rs23
-rw-r--r--src/rustdoc/rustdoc.rc2
3 files changed, 35 insertions, 5 deletions
diff --git a/src/rustdoc/attr_parser.rs b/src/rustdoc/attr_parser.rs
index f952bb1a92f..bb75270b381 100644
--- a/src/rustdoc/attr_parser.rs
+++ b/src/rustdoc/attr_parser.rs
@@ -13,7 +13,8 @@ export crate_attrs, mod_attrs, fn_attrs, arg_attrs;
 export parse_crate, parse_mod, parse_fn;
 
 type crate_attrs = {
-    name: option<str>
+    name: option<str>,
+    desc: option<str>
 };
 
 type mod_attrs = {
@@ -55,9 +56,11 @@ fn doc_meta(
 
 fn parse_crate(attrs: [ast::attribute]) -> crate_attrs {
     let link_metas = attr::find_linkage_metas(attrs);
+    let attr_metas = attr::attr_metas(attrs);
 
     {
-        name: attr::meta_item_value_from_list(link_metas, "name")
+        name: attr::meta_item_value_from_list(link_metas, "name"),
+        desc: attr::meta_item_value_from_list(attr_metas, "desc")
     }
 }
 
@@ -85,6 +88,14 @@ fn should_not_extract_crate_name_if_no_name_value_in_link_attribute() {
     assert attrs.name == none;
 }
 
+#[test]
+fn should_extract_crate_desc() {
+    let source = "#[desc = \"Teddybears\"]";
+    let attrs = test::parse_attributes(source);
+    let attrs = parse_crate(attrs);
+    assert attrs.desc == some("Teddybears");
+}
+
 fn parse_mod(attrs: [ast::attribute]) -> mod_attrs {
     parse_short_doc_or(
         attrs,
diff --git a/src/rustdoc/attr_pass.rs b/src/rustdoc/attr_pass.rs
index 4c945a7869f..cc60268f0c7 100644
--- a/src/rustdoc/attr_pass.rs
+++ b/src/rustdoc/attr_pass.rs
@@ -36,14 +36,25 @@ fn fold_crate(
     let srv = fold.ctxt;
     let doc = fold::default_seq_fold_crate(fold, doc);
 
+    // Use various crate attributes to set documentation on the top mod
+
     let attrs = astsrv::exec(srv) {|ctxt|
         let attrs = ctxt.ast.node.attrs;
         attr_parser::parse_crate(attrs)
     };
 
+    let brief = option::maybe(doc.topmod.brief, attrs.desc) {|desc|
+        if option::is_some(doc.topmod.brief) {
+            #warn("overriding crate brief doc attribute \
+                   with crate description");
+        }
+        some(desc)
+    };
+
     ~{
         topmod: ~{
-            name: option::from_maybe(doc.topmod.name, attrs.name)
+            name: option::from_maybe(doc.topmod.name, attrs.name),
+            brief: brief
             with *doc.topmod
         }
     }
@@ -59,6 +70,16 @@ fn should_replace_top_module_name_with_crate_name() {
     assert doc.topmod.name == "bond";
 }
 
+#[test]
+fn should_replace_top_module_brief_with_crate_desc() {
+    let source = "#[desc = \"The Rust compiler\"];";
+    let srv = astsrv::mk_srv_from_str(source);
+    let doc = extract::from_srv(srv, "");
+    let fold = fold::default_seq_fold(srv);
+    let doc = fold_crate(fold, doc);
+    assert doc.topmod.brief == some("The Rust compiler");
+}
+
 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 {
diff --git a/src/rustdoc/rustdoc.rc b/src/rustdoc/rustdoc.rc
index 12a8733a9b2..8fa898b5a9d 100644
--- a/src/rustdoc/rustdoc.rc
+++ b/src/rustdoc/rustdoc.rc
@@ -1,5 +1,3 @@
-#[doc = "Rustdoc - The Rust documentation generator"];
-
 #[link(name = "rustdoc",
        vers = "0.1",
        uuid = "f8abd014-b281-484d-a0c3-26e3de8e2412",