about summary refs log tree commit diff
path: root/src/rustdoc
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2012-01-15 21:45:13 -0800
committerBrian Anderson <banderson@mozilla.com>2012-01-16 01:07:42 -0800
commit46a662ecb21eac21bd274bc23e5faf9cf51790be (patch)
tree3cdd7cb5c32fa3e8e3f0d85f7bc23b8367039f64 /src/rustdoc
parentb9cd983f365cdc64d1a904580455794a47676fb6 (diff)
downloadrust-46a662ecb21eac21bd274bc23e5faf9cf51790be.tar.gz
rust-46a662ecb21eac21bd274bc23e5faf9cf51790be.zip
rustdoc: Build mod and fn nodes from the AST
Diffstat (limited to 'src/rustdoc')
-rw-r--r--src/rustdoc/doc.rs17
-rw-r--r--src/rustdoc/extract.rs101
-rwxr-xr-xsrc/rustdoc/rustdoc.rs31
3 files changed, 129 insertions, 20 deletions
diff --git a/src/rustdoc/doc.rs b/src/rustdoc/doc.rs
index cb3fab1299c..f78dd5b54b6 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<str>,
     return: option::t<str>,
     args: map::hashmap<str, str>
 };
+
+// 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 9e95faea231..06450cc2f08 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::<str>()
     }
 }
 
@@ -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 2e53155f06c..ee277b43a91 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 {