diff --git a/src/rustdoc/attr_parser.rs b/src/rustdoc/attr_parser.rs index 9d886b6d4c9..818efe018fe 100644 --- a/src/rustdoc/attr_parser.rs +++ b/src/rustdoc/attr_parser.rs @@ -11,10 +11,10 @@ import core::tuple; export crate_attrs, mod_attrs, fn_attrs, arg_attrs, const_attrs, enum_attrs, variant_attrs, res_attrs, - iface_attrs, method_attrs; + iface_attrs, method_attrs, impl_attrs; export parse_crate, parse_mod, parse_fn, parse_const, parse_enum, parse_variant, parse_res, - parse_iface, parse_method; + parse_iface, parse_method, parse_impl; type crate_attrs = { name: option @@ -63,6 +63,11 @@ type iface_attrs = { desc: option }; +type impl_attrs = { + brief: option, + desc: option +}; + type method_attrs = fn_attrs; #[cfg(test)] @@ -499,3 +504,7 @@ fn parse_iface(attrs: [ast::attribute]) -> iface_attrs { fn parse_method(attrs: [ast::attribute]) -> method_attrs { parse_fn(attrs) } + +fn parse_impl(attrs: [ast::attribute]) -> impl_attrs { + parse_basic(attrs) +} \ No newline at end of file diff --git a/src/rustdoc/attr_pass.rs b/src/rustdoc/attr_pass.rs index 91e065f310b..1c96eea5cda 100644 --- a/src/rustdoc/attr_pass.rs +++ b/src/rustdoc/attr_pass.rs @@ -26,7 +26,8 @@ fn run( fold_const: fold_const, fold_enum: fold_enum, fold_res: fold_res, - fold_iface: fold_iface + fold_iface: fold_iface, + fold_impl: fold_impl with *fold::default_seq_fold(srv) }); fold.fold_crate(fold, doc) @@ -398,9 +399,14 @@ fn merge_method_attrs( (method.ident, attr_parser::parse_method(method.attrs)) } } - _ { - fail "Undocumented invariant in merge_method_attrs"; + ast_map::node_item(@{ + node: ast::item_impl(_, _, _, methods), _ + }) { + vec::map(methods) {|method| + (method.ident, attr_parser::parse_method(method.attrs)) + } } + _ { fail "unexpected item" } } }; @@ -448,3 +454,50 @@ fn should_extract_iface_method_docs() { assert doc.topmod.ifaces()[0].methods[0].return.desc == some("return"); assert doc.topmod.ifaces()[0].methods[0].failure == some("failure"); } + + +fn fold_impl( + fold: fold::fold, + doc: doc::impldoc +) -> doc::impldoc { + let srv = fold.ctxt; + let doc = fold::default_seq_fold_impl(fold, doc); + let attrs = parse_item_attrs(srv, doc.id, attr_parser::parse_impl); + + { + brief: attrs.brief, + desc: attrs.desc, + methods: merge_method_attrs(srv, doc.id, doc.methods) + with doc + } +} + +#[test] +fn should_extract_impl_docs() { + let source = "#[doc = \"whatever\"] impl i for int { fn a() { } }"; + let srv = astsrv::mk_srv_from_str(source); + let doc = extract::from_srv(srv, ""); + let doc = run(srv, doc); + assert doc.topmod.impls()[0].desc == some("whatever"); +} + +#[test] +fn should_extract_impl_method_docs() { + let source = "impl i for int {\ + #[doc(\ + brief = \"brief\",\ + desc = \"desc\",\ + args(a = \"a\"),\ + return = \"return\",\ + failure = \"failure\")]\ + fn f(a: bool) -> bool { }\ + }"; + let srv = astsrv::mk_srv_from_str(source); + let doc = extract::from_srv(srv, ""); + let doc = run(srv, doc); + assert doc.topmod.impls()[0].methods[0].brief == some("brief"); + assert doc.topmod.impls()[0].methods[0].desc == some("desc"); + assert doc.topmod.impls()[0].methods[0].args[0].desc == some("a"); + assert doc.topmod.impls()[0].methods[0].return.desc == some("return"); + assert doc.topmod.impls()[0].methods[0].failure == some("failure"); +}