Skip to content

Commit 20b8509

Browse files
committed
rustdoc: Add mod docs attrs to the doc tree
1 parent e39e347 commit 20b8509

File tree

3 files changed

+58
-1
lines changed

3 files changed

+58
-1
lines changed

src/rustdoc/attr_parser.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import rustc::syntax::ast;
99
import rustc::front::attr;
1010
import core::tuple;
1111

12-
export crate_attrs, fn_attrs, arg_attrs;
12+
export crate_attrs, mod_attrs, fn_attrs, arg_attrs;
1313
export parse_crate, parse_mod, parse_fn;
1414

1515
type crate_attrs = {

src/rustdoc/attr_pass.rs

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,12 @@ fn run(
2626
) -> doc::cratedoc {
2727
fold_crate(f, d)
2828
},
29+
fold_mod: fn~(
30+
f: fold::fold<astsrv::srv>,
31+
d: doc::moddoc
32+
) -> doc::moddoc {
33+
fold_mod(f, d)
34+
},
2935
fold_fn: fn~(
3036
f: fold::fold<astsrv::srv>,
3137
d: doc::fndoc
@@ -68,6 +74,56 @@ fn should_replace_top_module_name_with_crate_name() {
6874
assert doc.topmod.name == "bond";
6975
}
7076

77+
fn fold_mod(fold: fold::fold<astsrv::srv>, doc: doc::moddoc) -> doc::moddoc {
78+
let srv = fold.ctxt;
79+
let attrs = if doc.id == ast::crate_node_id {
80+
// This is the top-level mod, use the crate attributes
81+
astsrv::exec(srv) {|ctxt|
82+
attr_parser::parse_mod(ctxt.ast.node.attrs)
83+
}
84+
} else {
85+
astsrv::exec(srv) {|ctxt|
86+
let attrs = alt ctxt.map.get(doc.id) {
87+
ast_map::node_item(item) { item.attrs }
88+
};
89+
attr_parser::parse_mod(attrs)
90+
}
91+
};
92+
let doc = fold::default_seq_fold_mod(fold, doc);
93+
ret merge_mod_attrs(doc, attrs);
94+
95+
fn merge_mod_attrs(
96+
doc: doc::moddoc,
97+
attrs: attr_parser::mod_attrs
98+
) -> doc::moddoc {
99+
~{
100+
brief: attrs.brief,
101+
desc: attrs.desc
102+
with *doc
103+
}
104+
}
105+
}
106+
107+
#[test]
108+
fn fold_mod_should_extract_mod_attributes() {
109+
let source = "#[doc = \"test\"] mod a { }";
110+
let srv = astsrv::mk_srv_from_str(source);
111+
let doc = extract::from_srv(srv, "");
112+
let fold = fold::default_seq_fold(srv);
113+
let doc = fold_mod(fold, doc.topmod.mods[0]);
114+
assert doc.desc == some("test");
115+
}
116+
117+
#[test]
118+
fn fold_mod_should_extract_top_mod_attributes() {
119+
let source = "#[doc = \"test\"];";
120+
let srv = astsrv::mk_srv_from_str(source);
121+
let doc = extract::from_srv(srv, "");
122+
let fold = fold::default_seq_fold(srv);
123+
let doc = fold_mod(fold, doc.topmod);
124+
assert doc.desc == some("test");
125+
}
126+
71127
fn fold_fn(
72128
fold: fold::fold<astsrv::srv>,
73129
doc: doc::fndoc

src/rustdoc/fold.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ export fold;
22
export fold_crate, fold_mod, fold_fn, fold_modlist, fold_fnlist;
33
export default_seq_fold;
44
export default_seq_fold_crate;
5+
export default_seq_fold_mod;
56
export default_seq_fold_fn;
67
export default_seq_fold_fnlist;
78

0 commit comments

Comments
 (0)