diff --git a/src/rustdoc/attr_parser.rs b/src/rustdoc/attr_parser.rs index e05d6c627bf6..3a90669df907 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 40953f7aec7f..42abc78b4d32 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, + d: doc::moddoc + ) -> doc::moddoc { + fold_mod(f, d) + }, fold_fn: fn~( f: fold::fold, 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, 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, doc: doc::fndoc diff --git a/src/rustdoc/fold.rs b/src/rustdoc/fold.rs index da6a4d35c3e9..7b52881414cb 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;