2012-01-15 19:23:19 -06:00
|
|
|
import rustc::syntax::ast;
|
2012-01-15 23:45:13 -06:00
|
|
|
import rustc::syntax::visit;
|
|
|
|
|
|
|
|
export extract;
|
2012-01-15 19:23:19 -06:00
|
|
|
|
|
|
|
#[doc = "Converts the Rust AST to the rustdoc document model"]
|
2012-01-15 23:45:13 -06:00
|
|
|
fn extract(
|
|
|
|
crate: @ast::crate
|
|
|
|
) -> doc::cratedoc {
|
|
|
|
~{
|
|
|
|
topmod: top_moddoc_from_crate(crate),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn top_moddoc_from_crate(
|
|
|
|
crate: @ast::crate
|
|
|
|
) -> doc::moddoc {
|
|
|
|
moddoc_from_mod(crate.node.module, "crate", crate.node.attrs)
|
|
|
|
}
|
|
|
|
|
|
|
|
fn moddoc_from_mod(
|
|
|
|
module: ast::_mod,
|
|
|
|
name: ast::ident,
|
|
|
|
_attrs: [ast::attribute]
|
|
|
|
|
|
|
|
) -> doc::moddoc {
|
|
|
|
~{
|
|
|
|
name: name,
|
|
|
|
mods: doc::modlist(
|
|
|
|
vec::filter_map(module.items) {|item|
|
|
|
|
alt item.node {
|
|
|
|
ast::item_mod(m) {
|
|
|
|
some(moddoc_from_mod(m, item.ident, item.attrs))
|
|
|
|
}
|
|
|
|
_ {
|
|
|
|
none
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}),
|
|
|
|
fns: doc::fnlist(
|
|
|
|
vec::filter_map(module.items) {|item|
|
|
|
|
alt item.node {
|
|
|
|
ast::item_fn(decl, typarams, _) {
|
|
|
|
some(fndoc_from_fn(
|
|
|
|
decl, typarams, item.ident, item.attrs))
|
|
|
|
}
|
|
|
|
_ {
|
|
|
|
none
|
|
|
|
}
|
|
|
|
}
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
fn fndoc_from_fn(
|
|
|
|
_decl: ast::fn_decl,
|
|
|
|
_typarams: [ast::ty_param],
|
|
|
|
name: ast::ident,
|
2012-01-16 00:49:57 -06:00
|
|
|
attrs: [ast::attribute]
|
2012-01-15 23:45:13 -06:00
|
|
|
) -> doc::fndoc {
|
2012-01-16 00:49:57 -06:00
|
|
|
attr_parser::parse_fn(name, attrs)
|
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);
|
|
|
|
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);
|
|
|
|
let doc = extract(ast);
|
|
|
|
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);
|
|
|
|
let doc = extract(ast);
|
|
|
|
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);
|
|
|
|
let doc = extract(ast);
|
|
|
|
assert doc.topmod.fns[0].name == "a";
|
|
|
|
assert doc.topmod.mods[0].fns[0].name == "c";
|
2012-01-15 19:23:19 -06:00
|
|
|
}
|
|
|
|
}
|