diff --git a/src/rustdoc/doc.rs b/src/rustdoc/doc.rs index cb3fab1299c6..f78dd5b54b65 100644 --- a/src/rustdoc/doc.rs +++ b/src/rustdoc/doc.rs @@ -1,14 +1,21 @@ -type cratedoc = { - mods: [moddoc] +type cratedoc = ~{ + topmod: moddoc, }; -type moddoc = { - fns: [fndoc] +type moddoc = ~{ + name: str, + mods: modlist, + fns: fnlist }; -type fndoc = { +type fndoc = ~{ + name: str, brief: str, desc: option::t, return: option::t, args: map::hashmap }; + +// Just to break the structural recursive types +tag modlist = [moddoc]; +tag fnlist = [fndoc]; diff --git a/src/rustdoc/extract.rs b/src/rustdoc/extract.rs index 9e95faea231f..06450cc2f085 100644 --- a/src/rustdoc/extract.rs +++ b/src/rustdoc/extract.rs @@ -1,11 +1,69 @@ -#[doc = "Converting the Rust AST to the rustdoc document model"]; - import rustc::syntax::ast; +import rustc::syntax::visit; + +export extract; #[doc = "Converts the Rust AST to the rustdoc document model"] -fn extract(crate: @ast::crate) -> doc::cratedoc { - { - mods: [] +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, + _attrs: [ast::attribute] +) -> doc::fndoc { + ~{ + name: name, + brief: "todo", + desc: none, + return: none, + args: map::new_str_hash::() } } @@ -17,6 +75,37 @@ mod tests { let source = ""; // empty crate let ast = parse::from_str(source); let doc = extract(ast); - assert doc.mods == []; + // 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"; } } \ No newline at end of file diff --git a/src/rustdoc/rustdoc.rs b/src/rustdoc/rustdoc.rs index 2e53155f06c4..ee277b43a916 100755 --- a/src/rustdoc/rustdoc.rs +++ b/src/rustdoc/rustdoc.rs @@ -80,7 +80,12 @@ fn parse_compound_fndoc(items: [@ast::meta_item]) -> doc::fndoc { none. { "_undocumented_" } }; - { brief: _brief, desc: desc, return: return, args: argdocs } + ~{ + name: "todo", + brief: _brief, + desc: desc, + return: return, + args: argdocs } } #[doc( @@ -95,10 +100,13 @@ fn doc_item(rd: rustdoc, item: @ast::item) { alt attr.node.value.node { ast::meta_name_value( "doc", {node: ast::lit_str(value), span: _}) { - _fndoc = some({ brief: value, - desc: none, - return: none, - args: noargdocs }); + _fndoc = some(~{ + name: "todo", + brief: value, + desc: none, + return: none, + args: noargdocs + }); } ast::meta_list("doc", docs) { _fndoc = some(parse_compound_fndoc(docs)); @@ -108,10 +116,15 @@ fn doc_item(rd: rustdoc, item: @ast::item) { let _fndoc0 = alt _fndoc { some(_d) { _d } - none. { { brief: "_undocumented_", - desc: none, - return: none, - args: noargdocs } } + none. { + ~{ + name: "todo", + brief: "_undocumented_", + desc: none, + return: none, + args: noargdocs + } + } }; alt item.node {