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 + name: option, + desc: option }; 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, 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",