about summary refs log tree commit diff
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2012-01-30 16:25:39 -0800
committerBrian Anderson <banderson@mozilla.com>2012-01-30 19:37:32 -0800
commit2c495a9bf8c1cf6cf76d41b5aa0dad4998fb6c57 (patch)
treee471af4cd55f4cb4d4702fed215f1eda8f97dddb
parentb8a683415c995bdb3d2e8bdc0d6a2bec7fe6cf1d (diff)
downloadrust-2c495a9bf8c1cf6cf76d41b5aa0dad4998fb6c57.tar.gz
rust-2c495a9bf8c1cf6cf76d41b5aa0dad4998fb6c57.zip
rustdoc: Add iface attribute docs to the doc tree
-rw-r--r--src/rustdoc/attr_pass.rs130
1 files changed, 106 insertions, 24 deletions
diff --git a/src/rustdoc/attr_pass.rs b/src/rustdoc/attr_pass.rs
index de6f36e75ec..0b38b104c61 100644
--- a/src/rustdoc/attr_pass.rs
+++ b/src/rustdoc/attr_pass.rs
@@ -25,7 +25,8 @@ fn run(
         fold_fn: fold_fn,
         fold_const: fold_const,
         fold_enum: fold_enum,
-        fold_res: fold_res
+        fold_res: fold_res,
+        fold_iface: fold_iface
         with *fold::default_seq_fold(srv)
     });
     fold.fold_crate(fold, doc)
@@ -142,35 +143,36 @@ fn fold_fn(
             with doc
         };
     }
+}
 
-    fn merge_arg_attrs(
-        docs: [doc::argdoc],
-        attrs: [attr_parser::arg_attrs]
-    ) -> [doc::argdoc] {
-        vec::map(docs) {|doc|
-            alt vec::find(attrs) {|attr|
-                attr.name == doc.name
-            } {
-                some(attr) {
-                    {
-                        desc: some(attr.desc)
-                        with doc
-                    }
+fn merge_arg_attrs(
+    docs: [doc::argdoc],
+    attrs: [attr_parser::arg_attrs]
+) -> [doc::argdoc] {
+    vec::map(docs) {|doc|
+        alt vec::find(attrs) {|attr|
+            attr.name == doc.name
+        } {
+            some(attr) {
+                {
+                    desc: some(attr.desc)
+                    with doc
                 }
-                none { doc }
             }
+            none { doc }
         }
-        // FIXME: Warning when documenting a non-existent arg
     }
+    // FIXME: Warning when documenting a non-existent arg
+}
 
-    fn merge_ret_attrs(
-        doc: doc::retdoc,
-        attrs: option<str>
-    ) -> doc::retdoc {
-        {
-            desc: attrs
-            with doc
-        }
+
+fn merge_ret_attrs(
+    doc: doc::retdoc,
+    attrs: option<str>
+) -> doc::retdoc {
+    {
+        desc: attrs
+        with doc
     }
 }
 
@@ -359,4 +361,84 @@ fn fold_res_should_extract_arg_docs() {
     let doc = fold_res(fold, doc.topmod.resources()[0]);
     assert doc.args[0].name == "a";
     assert doc.args[0].desc == some("b");
+}
+
+
+fn fold_iface(
+    fold: fold::fold<astsrv::srv>,
+    doc: doc::ifacedoc
+) -> doc::ifacedoc {
+    let srv = fold.ctxt;
+    let doc = fold::default_seq_fold_iface(fold, doc);
+    let attrs = parse_item_attrs(srv, doc.id, attr_parser::parse_iface);
+
+    {
+        brief: attrs.brief,
+        desc: attrs.desc,
+        methods: merge_method_attrs(srv, doc.id, doc.methods)
+        with doc
+    }
+}
+
+fn merge_method_attrs(
+    srv: astsrv::srv,
+    item_id: doc::ast_id,
+    docs: [doc::methoddoc]
+) -> [doc::methoddoc] {
+    // Create an assoc list from method name to attributes
+    let attrs = astsrv::exec(srv) {|ctxt|
+        alt ctxt.ast_map.get(item_id) {
+          ast_map::node_item(@{
+            node: ast::item_iface(_, methods), _
+          }) {
+            vec::map(methods) {|method|
+                (method.ident, attr_parser::parse_method(method.attrs))
+            }
+          }
+        }
+    };
+
+    vec::map2(docs, attrs) {|doc, attrs|
+        assert doc.name == tuple::first(attrs);
+        let attrs = tuple::second(attrs);
+
+        {
+            brief: attrs.brief,
+            desc: attrs.desc,
+            args: merge_arg_attrs(doc.args, attrs.args),
+            return: merge_ret_attrs(doc.return, attrs.return),
+            failure: attrs.failure
+            with doc
+        }
+    }
+}
+
+#[test]
+fn should_extract_iface_docs() {
+    let source = "#[doc = \"whatever\"] iface i { fn a(); }";
+    let srv = astsrv::mk_srv_from_str(source);
+    let doc = extract::from_srv(srv, "");
+    let doc = run(srv, doc);
+    assert doc.topmod.ifaces()[0].desc == some("whatever");
+}
+
+#[test]
+fn should_extract_iface_method_docs() {
+    let source = "iface i {\
+                  #[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.ifaces()[0].methods[0].brief == some("brief");
+    assert doc.topmod.ifaces()[0].methods[0].desc == some("desc");
+    assert doc.topmod.ifaces()[0].methods[0].args[0].desc == some("a");
+    assert doc.topmod.ifaces()[0].methods[0].return.desc == some("return");
+    assert doc.topmod.ifaces()[0].methods[0].failure == some("failure");
 }
\ No newline at end of file