2012-01-17 19:44:32 -06:00
|
|
|
#[doc = "Converts the Rust AST to the rustdoc document model"];
|
|
|
|
|
2012-01-15 19:23:19 -06:00
|
|
|
import rustc::syntax::ast;
|
2012-01-15 23:45:13 -06:00
|
|
|
|
2012-01-16 19:30:57 -06:00
|
|
|
export from_srv, extract;
|
|
|
|
|
|
|
|
fn from_srv(
|
2012-01-17 18:12:31 -06:00
|
|
|
srv: astsrv::srv,
|
2012-01-16 19:30:57 -06:00
|
|
|
default_name: str
|
|
|
|
) -> doc::cratedoc {
|
2012-01-18 16:06:22 -06:00
|
|
|
|
|
|
|
#[doc = "Use the AST service to create a document tree"];
|
|
|
|
|
2012-01-17 18:12:31 -06:00
|
|
|
astsrv::exec(srv) {|ctxt|
|
2012-01-16 19:30:57 -06:00
|
|
|
extract(ctxt.ast, default_name)
|
|
|
|
}
|
|
|
|
}
|
2012-01-15 19:23:19 -06:00
|
|
|
|
2012-01-15 23:45:13 -06:00
|
|
|
fn extract(
|
2012-01-16 02:19:35 -06:00
|
|
|
crate: @ast::crate,
|
|
|
|
default_name: str
|
2012-01-15 23:45:13 -06:00
|
|
|
) -> doc::cratedoc {
|
|
|
|
~{
|
2012-01-16 02:19:35 -06:00
|
|
|
topmod: top_moddoc_from_crate(crate, default_name),
|
2012-01-15 23:45:13 -06:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn top_moddoc_from_crate(
|
2012-01-16 02:19:35 -06:00
|
|
|
crate: @ast::crate,
|
|
|
|
default_name: str
|
2012-01-15 23:45:13 -06:00
|
|
|
) -> doc::moddoc {
|
2012-01-16 18:01:33 -06:00
|
|
|
moddoc_from_mod(crate.node.module, default_name)
|
2012-01-15 23:45:13 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
fn moddoc_from_mod(
|
|
|
|
module: ast::_mod,
|
2012-01-16 18:01:33 -06:00
|
|
|
name: ast::ident
|
2012-01-15 23:45:13 -06:00
|
|
|
) -> doc::moddoc {
|
|
|
|
~{
|
|
|
|
name: name,
|
|
|
|
mods: doc::modlist(
|
|
|
|
vec::filter_map(module.items) {|item|
|
|
|
|
alt item.node {
|
|
|
|
ast::item_mod(m) {
|
2012-01-16 18:01:33 -06:00
|
|
|
some(moddoc_from_mod(m, item.ident))
|
2012-01-15 23:45:13 -06:00
|
|
|
}
|
|
|
|
_ {
|
|
|
|
none
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}),
|
|
|
|
fns: doc::fnlist(
|
|
|
|
vec::filter_map(module.items) {|item|
|
|
|
|
alt item.node {
|
2012-01-16 18:01:33 -06:00
|
|
|
ast::item_fn(decl, _, _) {
|
2012-01-15 23:45:13 -06:00
|
|
|
some(fndoc_from_fn(
|
2012-01-16 18:01:33 -06:00
|
|
|
decl, item.ident, item.id))
|
2012-01-15 23:45:13 -06:00
|
|
|
}
|
|
|
|
_ {
|
|
|
|
none
|
|
|
|
}
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn fndoc_from_fn(
|
2012-01-18 16:43:19 -06:00
|
|
|
decl: ast::fn_decl,
|
2012-01-15 23:45:13 -06:00
|
|
|
name: ast::ident,
|
2012-01-16 18:01:33 -06:00
|
|
|
id: ast::node_id
|
2012-01-15 23:45:13 -06:00
|
|
|
) -> doc::fndoc {
|
2012-01-16 18:01:33 -06:00
|
|
|
~{
|
|
|
|
id: id,
|
|
|
|
name: name,
|
|
|
|
brief: none,
|
|
|
|
desc: none,
|
|
|
|
return: none,
|
2012-01-18 16:43:19 -06:00
|
|
|
args: argdocs_from_args(decl.inputs)
|
2012-01-16 18:01:33 -06:00
|
|
|
}
|
2012-01-15 19:23:19 -06:00
|
|
|
}
|
|
|
|
|
2012-01-18 16:43:19 -06:00
|
|
|
#[test]
|
|
|
|
fn should_extract_fn_args() {
|
|
|
|
let source = "fn a(b: int, c: int) { }";
|
|
|
|
let ast = parse::from_str(source);
|
|
|
|
let doc = extract(ast, "");
|
|
|
|
let fn_ = doc.topmod.fns[0];
|
|
|
|
assert tuple::first(fn_.args[0]) == "b";
|
|
|
|
assert tuple::first(fn_.args[1]) == "c";
|
|
|
|
}
|
|
|
|
|
|
|
|
fn argdocs_from_args(args: [ast::arg]) -> [(str, str)] {
|
|
|
|
vec::map(args, argdoc_from_arg)
|
|
|
|
}
|
|
|
|
|
|
|
|
fn argdoc_from_arg(arg: ast::arg) -> (str, str) {
|
|
|
|
(arg.ident, "")
|
|
|
|
}
|
|
|
|
|
2012-01-15 19:23:19 -06:00
|
|
|
#[cfg(test)]
|
|
|
|
mod tests {
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn extract_empty_crate() {
|
|
|
|
let source = ""; // empty crate
|
|
|
|
let ast = parse::from_str(source);
|
2012-01-16 02:19:35 -06:00
|
|
|
let doc = extract(ast, "");
|
2012-01-15 23:45:13 -06:00
|
|
|
// FIXME #1535: These are boxed to prevent a crash
|
|
|
|
assert ~doc.topmod.mods == ~doc::modlist([]);
|
|
|
|
assert ~doc.topmod.fns == ~doc::fnlist([]);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn extract_mods() {
|
|
|
|
let source = "mod a { mod b { } mod c { } }";
|
|
|
|
let ast = parse::from_str(source);
|
2012-01-16 02:19:35 -06:00
|
|
|
let doc = extract(ast, "");
|
2012-01-15 23:45:13 -06:00
|
|
|
assert doc.topmod.mods[0].name == "a";
|
|
|
|
assert doc.topmod.mods[0].mods[0].name == "b";
|
|
|
|
assert doc.topmod.mods[0].mods[1].name == "c";
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn extract_mods_deep() {
|
|
|
|
let source = "mod a { mod b { mod c { } } }";
|
|
|
|
let ast = parse::from_str(source);
|
2012-01-16 02:19:35 -06:00
|
|
|
let doc = extract(ast, "");
|
2012-01-15 23:45:13 -06:00
|
|
|
assert doc.topmod.mods[0].mods[0].mods[0].name == "c";
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn extract_fns() {
|
|
|
|
let source =
|
|
|
|
"fn a() { } \
|
|
|
|
mod b { fn c() { } }";
|
|
|
|
let ast = parse::from_str(source);
|
2012-01-16 02:19:35 -06:00
|
|
|
let doc = extract(ast, "");
|
2012-01-15 23:45:13 -06:00
|
|
|
assert doc.topmod.fns[0].name == "a";
|
|
|
|
assert doc.topmod.mods[0].fns[0].name == "c";
|
2012-01-15 19:23:19 -06:00
|
|
|
}
|
2012-01-16 02:15:03 -06:00
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn extract_should_set_fn_ast_id() {
|
|
|
|
let source = "fn a() { }";
|
|
|
|
let ast = parse::from_str(source);
|
2012-01-16 02:19:35 -06:00
|
|
|
let doc = extract(ast, "");
|
2012-01-16 02:15:03 -06:00
|
|
|
assert doc.topmod.fns[0].id != 0;
|
|
|
|
}
|
2012-01-16 02:19:35 -06:00
|
|
|
|
|
|
|
#[test]
|
2012-01-16 18:01:33 -06:00
|
|
|
fn extract_should_use_default_crate_name() {
|
2012-01-16 02:19:35 -06:00
|
|
|
let source = "";
|
|
|
|
let ast = parse::from_str(source);
|
|
|
|
let doc = extract(ast, "burp");
|
|
|
|
assert doc.topmod.name == "burp";
|
|
|
|
}
|
2012-01-16 19:30:57 -06:00
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn extract_from_seq_srv() {
|
|
|
|
let source = "";
|
2012-01-17 18:12:31 -06:00
|
|
|
let srv = astsrv::mk_srv_from_str(source);
|
2012-01-16 19:30:57 -06:00
|
|
|
let doc = from_srv(srv, "name");
|
|
|
|
assert doc.topmod.name == "name";
|
|
|
|
}
|
2012-01-15 19:23:19 -06:00
|
|
|
}
|