rustdoc: Pull impl docs out of attributes

This commit is contained in:
Brian Anderson 2012-01-31 17:05:40 -08:00
parent 23042a3566
commit 496205c85f
2 changed files with 67 additions and 5 deletions

View file

@ -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<str>
@ -63,6 +63,11 @@ type iface_attrs = {
desc: option<str>
};
type impl_attrs = {
brief: option<str>,
desc: option<str>
};
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)
}

View file

@ -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<astsrv::srv>,
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");
}