Skip to content

Commit 521e58a

Browse files
committed
rustdoc: Get the crate brief description from the 'desc' attr
1 parent 7857dcb commit 521e58a

File tree

3 files changed

+35
-5
lines changed

3 files changed

+35
-5
lines changed

src/rustdoc/attr_parser.rs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ export crate_attrs, mod_attrs, fn_attrs, arg_attrs;
1313
export parse_crate, parse_mod, parse_fn;
1414

1515
type crate_attrs = {
16-
name: option<str>
16+
name: option<str>,
17+
desc: option<str>
1718
};
1819

1920
type mod_attrs = {
@@ -55,9 +56,11 @@ fn doc_meta(
5556

5657
fn parse_crate(attrs: [ast::attribute]) -> crate_attrs {
5758
let link_metas = attr::find_linkage_metas(attrs);
59+
let attr_metas = attr::attr_metas(attrs);
5860

5961
{
60-
name: attr::meta_item_value_from_list(link_metas, "name")
62+
name: attr::meta_item_value_from_list(link_metas, "name"),
63+
desc: attr::meta_item_value_from_list(attr_metas, "desc")
6164
}
6265
}
6366

@@ -85,6 +88,14 @@ fn should_not_extract_crate_name_if_no_name_value_in_link_attribute() {
8588
assert attrs.name == none;
8689
}
8790

91+
#[test]
92+
fn should_extract_crate_desc() {
93+
let source = "#[desc = \"Teddybears\"]";
94+
let attrs = test::parse_attributes(source);
95+
let attrs = parse_crate(attrs);
96+
assert attrs.desc == some("Teddybears");
97+
}
98+
8899
fn parse_mod(attrs: [ast::attribute]) -> mod_attrs {
89100
parse_short_doc_or(
90101
attrs,

src/rustdoc/attr_pass.rs

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,25 @@ fn fold_crate(
3636
let srv = fold.ctxt;
3737
let doc = fold::default_seq_fold_crate(fold, doc);
3838

39+
// Use various crate attributes to set documentation on the top mod
40+
3941
let attrs = astsrv::exec(srv) {|ctxt|
4042
let attrs = ctxt.ast.node.attrs;
4143
attr_parser::parse_crate(attrs)
4244
};
4345

46+
let brief = option::maybe(doc.topmod.brief, attrs.desc) {|desc|
47+
if option::is_some(doc.topmod.brief) {
48+
#warn("overriding crate brief doc attribute \
49+
with crate description");
50+
}
51+
some(desc)
52+
};
53+
4454
~{
4555
topmod: ~{
46-
name: option::from_maybe(doc.topmod.name, attrs.name)
56+
name: option::from_maybe(doc.topmod.name, attrs.name),
57+
brief: brief
4758
with *doc.topmod
4859
}
4960
}
@@ -59,6 +70,16 @@ fn should_replace_top_module_name_with_crate_name() {
5970
assert doc.topmod.name == "bond";
6071
}
6172

73+
#[test]
74+
fn should_replace_top_module_brief_with_crate_desc() {
75+
let source = "#[desc = \"The Rust compiler\"];";
76+
let srv = astsrv::mk_srv_from_str(source);
77+
let doc = extract::from_srv(srv, "");
78+
let fold = fold::default_seq_fold(srv);
79+
let doc = fold_crate(fold, doc);
80+
assert doc.topmod.brief == some("The Rust compiler");
81+
}
82+
6283
fn fold_mod(fold: fold::fold<astsrv::srv>, doc: doc::moddoc) -> doc::moddoc {
6384
let srv = fold.ctxt;
6485
let attrs = if doc.id == ast::crate_node_id {

src/rustdoc/rustdoc.rc

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
#[doc = "Rustdoc - The Rust documentation generator"];
2-
31
#[link(name = "rustdoc",
42
vers = "0.1",
53
uuid = "f8abd014-b281-484d-a0c3-26e3de8e2412",

0 commit comments

Comments
 (0)