rustdoc: Pull impl docs out of attributes
This commit is contained in:
parent
23042a3566
commit
496205c85f
2 changed files with 67 additions and 5 deletions
|
@ -11,10 +11,10 @@ import core::tuple;
|
||||||
|
|
||||||
export crate_attrs, mod_attrs, fn_attrs, arg_attrs,
|
export crate_attrs, mod_attrs, fn_attrs, arg_attrs,
|
||||||
const_attrs, enum_attrs, variant_attrs, res_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,
|
export parse_crate, parse_mod, parse_fn, parse_const,
|
||||||
parse_enum, parse_variant, parse_res,
|
parse_enum, parse_variant, parse_res,
|
||||||
parse_iface, parse_method;
|
parse_iface, parse_method, parse_impl;
|
||||||
|
|
||||||
type crate_attrs = {
|
type crate_attrs = {
|
||||||
name: option<str>
|
name: option<str>
|
||||||
|
@ -63,6 +63,11 @@ type iface_attrs = {
|
||||||
desc: option<str>
|
desc: option<str>
|
||||||
};
|
};
|
||||||
|
|
||||||
|
type impl_attrs = {
|
||||||
|
brief: option<str>,
|
||||||
|
desc: option<str>
|
||||||
|
};
|
||||||
|
|
||||||
type method_attrs = fn_attrs;
|
type method_attrs = fn_attrs;
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
|
@ -499,3 +504,7 @@ fn parse_iface(attrs: [ast::attribute]) -> iface_attrs {
|
||||||
fn parse_method(attrs: [ast::attribute]) -> method_attrs {
|
fn parse_method(attrs: [ast::attribute]) -> method_attrs {
|
||||||
parse_fn(attrs)
|
parse_fn(attrs)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn parse_impl(attrs: [ast::attribute]) -> impl_attrs {
|
||||||
|
parse_basic(attrs)
|
||||||
|
}
|
|
@ -26,7 +26,8 @@ fn run(
|
||||||
fold_const: fold_const,
|
fold_const: fold_const,
|
||||||
fold_enum: fold_enum,
|
fold_enum: fold_enum,
|
||||||
fold_res: fold_res,
|
fold_res: fold_res,
|
||||||
fold_iface: fold_iface
|
fold_iface: fold_iface,
|
||||||
|
fold_impl: fold_impl
|
||||||
with *fold::default_seq_fold(srv)
|
with *fold::default_seq_fold(srv)
|
||||||
});
|
});
|
||||||
fold.fold_crate(fold, doc)
|
fold.fold_crate(fold, doc)
|
||||||
|
@ -398,10 +399,15 @@ fn merge_method_attrs(
|
||||||
(method.ident, attr_parser::parse_method(method.attrs))
|
(method.ident, attr_parser::parse_method(method.attrs))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_ {
|
ast_map::node_item(@{
|
||||||
fail "Undocumented invariant in merge_method_attrs";
|
node: ast::item_impl(_, _, _, methods), _
|
||||||
|
}) {
|
||||||
|
vec::map(methods) {|method|
|
||||||
|
(method.ident, attr_parser::parse_method(method.attrs))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
_ { fail "unexpected item" }
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
vec::map2(docs, attrs) {|doc, attrs|
|
vec::map2(docs, attrs) {|doc, attrs|
|
||||||
|
@ -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].return.desc == some("return");
|
||||||
assert doc.topmod.ifaces()[0].methods[0].failure == some("failure");
|
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");
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue