about summary refs log tree commit diff
path: root/src/rustdoc
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2012-01-16 14:49:40 -0800
committerBrian Anderson <banderson@mozilla.com>2012-01-16 21:12:34 -0800
commit5457b4d3fbdcedef80176eeb44d2acd575bf5d3f (patch)
tree5bb43834defb0f0149298021fc93c1adc286781e /src/rustdoc
parente77b8db7077bc6eca5955149820f331618977df9 (diff)
downloadrust-5457b4d3fbdcedef80176eeb44d2acd575bf5d3f.tar.gz
rust-5457b4d3fbdcedef80176eeb44d2acd575bf5d3f.zip
rustdoc: Add fold module
Diffstat (limited to 'src/rustdoc')
-rw-r--r--src/rustdoc/fold.rs106
-rw-r--r--src/rustdoc/rustdoc.rc3
2 files changed, 108 insertions, 1 deletions
diff --git a/src/rustdoc/fold.rs b/src/rustdoc/fold.rs
new file mode 100644
index 00000000000..02438f8469a
--- /dev/null
+++ b/src/rustdoc/fold.rs
@@ -0,0 +1,106 @@
+export fold;
+export fold_crate, fold_mod, fold_fn, fold_modlist, fold_fnlist;
+export default_seq_fold;
+
+tag fold = t;
+
+type fold_crate = fn~(fold: fold, doc: doc::cratedoc) -> doc::cratedoc;
+type fold_mod = fn~(fold: fold, doc: doc::moddoc) -> doc::moddoc;
+type fold_fn = fn~(fold: fold, doc: doc::fndoc) -> doc::fndoc;
+type fold_modlist = fn~(fold: fold, list: doc::modlist) -> doc::modlist;
+type fold_fnlist = fn~(fold: fold, list: doc::fnlist) -> doc::fnlist;
+
+type t = {
+    fold_crate: fold_crate,
+    fold_mod: fold_mod,
+    fold_fn: fold_fn,
+    fold_modlist: fold_modlist,
+    fold_fnlist: fold_fnlist
+};
+
+
+// This exists because fn types don't infer correctly as record
+// initializers, but they do as function arguments
+fn mk_fold(
+    fold_crate: fold_crate,
+    fold_mod: fold_mod,
+    fold_fn: fold_fn,
+    fold_modlist: fold_modlist,
+    fold_fnlist: fold_fnlist
+) -> fold {
+    fold({
+        fold_crate: fold_crate,
+        fold_mod: fold_mod,
+        fold_fn: fold_fn,
+        fold_modlist: fold_modlist,
+        fold_fnlist: fold_fnlist
+    })
+}
+
+fn default_seq_fold() -> fold {
+    mk_fold(
+        default_seq_fold_crate,
+        default_seq_fold_mod,
+        default_seq_fold_fn,
+        default_seq_fold_modlist,
+        default_seq_fold_fnlist
+    )
+}
+
+fn default_seq_fold_crate(
+    fold: fold,
+    doc: doc::cratedoc
+) -> doc::cratedoc {
+    ~{
+        topmod: fold.fold_mod(fold, doc.topmod)
+    }
+}
+
+fn default_seq_fold_mod(
+    fold: fold,
+    doc: doc::moddoc
+) -> doc::moddoc {
+    ~{
+        name: doc.name,
+        mods: fold.fold_modlist(fold, doc.mods),
+        fns: fold.fold_fnlist(fold, doc.fns)
+    }
+}
+
+fn default_seq_fold_fn(
+    _fold: fold,
+    doc: doc::fndoc
+) -> doc::fndoc {
+    doc
+}
+
+fn default_seq_fold_modlist(
+    fold: fold,
+    list: doc::modlist
+) -> doc::modlist {
+    doc::modlist(vec::map(*list) {|doc|
+        fold.fold_mod(fold, doc)
+    })
+}
+
+fn default_seq_fold_fnlist(
+    fold: fold,
+    list: doc::fnlist
+) -> doc::fnlist {
+    doc::fnlist(vec::map(*list) {|doc|
+        fold.fold_fn(fold, doc)
+    })
+}
+
+#[cfg(test)]
+mod tests {
+    #[test]
+    fn default_fold_should_produce_same_doc() {
+        let source = "mod a { fn b() { } mod c { fn d() { } } }";
+        let ast = parse::from_str(source);
+        let doc = extract::extract(ast, "");
+        let fld = default_seq_fold();
+        let folded = fld.fold_crate(fld, doc);
+        assert doc == folded;
+    }
+}
\ No newline at end of file
diff --git a/src/rustdoc/rustdoc.rc b/src/rustdoc/rustdoc.rc
index 5b0f47a1e87..8fc39afbd07 100644
--- a/src/rustdoc/rustdoc.rc
+++ b/src/rustdoc/rustdoc.rc
@@ -11,4 +11,5 @@ mod parse;
 mod extract;
 mod attr_parser;
 mod doc;
-mod gen;
\ No newline at end of file
+mod gen;
+mod fold;
\ No newline at end of file