about summary refs log tree commit diff
path: root/src/rustdoc
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2012-02-20 21:08:19 -0800
committerBrian Anderson <banderson@mozilla.com>2012-02-21 16:14:02 -0800
commit96e3031675aba427c1cff8967f2c1cbbcdb6b5ff (patch)
tree2b6757b7c7733b753b303ada420b37221da072f8 /src/rustdoc
parentd6095dc6b5baa44c8d15db76dee185170b7be4b6 (diff)
downloadrust-96e3031675aba427c1cff8967f2c1cbbcdb6b5ff.tar.gz
rust-96e3031675aba427c1cff8967f2c1cbbcdb6b5ff.zip
rustdoc: Convert the astsrv constructor to a higher order fn
This will allow it to manage the destruction of the astsrv after
I convert it to a task
Diffstat (limited to 'src/rustdoc')
-rw-r--r--src/rustdoc/astsrv.rs61
-rw-r--r--src/rustdoc/attr_pass.rs33
-rw-r--r--src/rustdoc/desc_pass.rs9
-rw-r--r--src/rustdoc/desc_to_brief_pass.rs9
-rw-r--r--src/rustdoc/extract.rs7
-rw-r--r--src/rustdoc/markdown_pass.rs32
-rw-r--r--src/rustdoc/path_pass.rs20
-rw-r--r--src/rustdoc/prune_undoc_details_pass.rs22
-rw-r--r--src/rustdoc/prune_undoc_items_pass.rs9
-rw-r--r--src/rustdoc/prune_unexported_pass.rs7
-rw-r--r--src/rustdoc/reexport_pass.rs26
-rwxr-xr-xsrc/rustdoc/rustdoc.rs48
-rw-r--r--src/rustdoc/sort_item_name_pass.rs11
-rw-r--r--src/rustdoc/sort_item_type_pass.rs23
-rw-r--r--src/rustdoc/sort_pass.rs32
-rw-r--r--src/rustdoc/trim_pass.rs9
-rw-r--r--src/rustdoc/tystr_pass.rs7
17 files changed, 200 insertions, 165 deletions
diff --git a/src/rustdoc/astsrv.rs b/src/rustdoc/astsrv.rs
index b34a01e86a5..7c5d435504e 100644
--- a/src/rustdoc/astsrv.rs
+++ b/src/rustdoc/astsrv.rs
@@ -32,26 +32,33 @@ type ctxt = {
     exp_map: resolve::exp_map
 };
 
+type srv_owner<T> = fn(srv: srv) -> T;
 type ctxt_handler<T> = fn~(ctxt: ctxt) -> T;
 
 type srv = {
     ctxt: ctxt
 };
 
-fn from_str(source: str) -> srv {
+fn from_str<T>(source: str, owner: srv_owner<T>) -> T {
     let (sess, ignore_errors) = build_session();
-    {
+
+    let srv = {
         ctxt: build_ctxt(sess, parse::from_str_sess(sess, source),
                          ignore_errors)
-    }
+    };
+
+    owner(srv)
 }
 
-fn from_file(file: str) -> srv {
+fn from_file<T>(file: str, owner: srv_owner<T>) -> T {
     let (sess, ignore_errors) = build_session();
-    {
+
+    let srv = {
         ctxt: build_ctxt(sess, parse::from_file_sess(sess, file),
                          ignore_errors)
-    }
+    };
+
+    owner(srv)
 }
 
 fn build_ctxt(sess: session::session, ast: @ast::crate,
@@ -172,28 +179,31 @@ fn build_error_handlers(
 #[test]
 fn should_prune_unconfigured_items() {
     let source = "#[cfg(shut_up_and_leave_me_alone)]fn a() { }";
-    let srv = from_str(source);
-    exec(srv) {|ctxt|
-        assert vec::is_empty(ctxt.ast.node.module.items);
+    from_str(source) {|srv|
+        exec(srv) {|ctxt|
+            assert vec::is_empty(ctxt.ast.node.module.items);
+        }
     }
 }
 
 #[test]
 fn srv_should_build_ast_map() {
     let source = "fn a() { }";
-    let srv = from_str(source);
-    exec(srv) {|ctxt|
-        assert ctxt.ast_map.size() != 0u
-    };
+    from_str(source) {|srv|
+        exec(srv) {|ctxt|
+            assert ctxt.ast_map.size() != 0u
+        };
+    }
 }
 
 #[test]
 fn srv_should_build_reexport_map() {
     let source = "import a::b; export b; mod a { mod b { } }";
-    let srv = from_str(source);
-    exec(srv) {|ctxt|
-        assert ctxt.exp_map.size() != 0u
-    };
+    from_str(source) {|srv|
+        exec(srv) {|ctxt|
+            assert ctxt.exp_map.size() != 0u
+        };
+    }
 }
 
 #[test]
@@ -202,14 +212,14 @@ fn srv_should_resolve_external_crates() {
                   fn f() -> std::sha1::sha1 {\
                   std::sha1::mk_sha1() }";
     // Just testing that resolve doesn't crash
-    from_str(source);
+    from_str(source) {|_srv| }
 }
 
 #[test]
 fn srv_should_resolve_core_crate() {
     let source = "fn a() -> option { fail }";
     // Just testing that resolve doesn't crash
-    from_str(source);
+    from_str(source) {|_srv| }
 }
 
 #[test]
@@ -217,19 +227,19 @@ fn srv_should_resolve_non_existant_imports() {
     // We want to ignore things we can't resolve. Shouldn't
     // need to be able to find external crates to create docs.
     let source = "import wooboo; fn a() { }";
-    from_str(source);
+    from_str(source) {|_srv| }
 }
 
 #[test]
 fn srv_should_resolve_non_existant_uses() {
     let source = "use forble; fn a() { }";
-    from_str(source);
+    from_str(source) {|_srv| }
 }
 
 #[test]
 fn should_ignore_external_import_paths_that_dont_exist() {
     let source = "use forble; import forble::bippy;";
-    from_str(source);
+    from_str(source) {|_srv| }
 }
 
 fn exec<T:send>(
@@ -242,7 +252,8 @@ fn exec<T:send>(
 #[test]
 fn srv_should_return_request_result() {
     let source = "fn a() { }";
-    let srv = from_str(source);
-    let result = exec(srv) {|_ctxt| 1000};
-    assert result == 1000;
+    from_str(source) {|srv|
+        let result = exec(srv) {|_ctxt| 1000};
+        assert result == 1000;
+    }
 }
diff --git a/src/rustdoc/attr_pass.rs b/src/rustdoc/attr_pass.rs
index b2a0b176b79..f95d32b6cc7 100644
--- a/src/rustdoc/attr_pass.rs
+++ b/src/rustdoc/attr_pass.rs
@@ -183,23 +183,25 @@ fn should_extract_fn_arg_attributes() {
 #[test]
 fn should_extract_fn_return_attributes() {
     let source = "#[doc(return = \"what\")] fn a() -> int { }";
-    let srv = astsrv::from_str(source);
-    let doc = extract::from_srv(srv, "");
-    let doc = tystr_pass::mk_pass()(srv, doc);
-    let fold = fold::default_seq_fold(srv);
-    let doc = fold_fn(fold, doc.topmod.fns()[0]);
-    assert doc.return.desc == some("what");
+    astsrv::from_str(source) {|srv|
+        let doc = extract::from_srv(srv, "");
+        let doc = tystr_pass::mk_pass()(srv, doc);
+        let fold = fold::default_seq_fold(srv);
+        let doc = fold_fn(fold, doc.topmod.fns()[0]);
+        assert doc.return.desc == some("what");
+    }
 }
 
 #[test]
 fn should_preserve_fn_sig() {
     let source = "fn a() -> int { }";
-    let srv = astsrv::from_str(source);
-    let doc = extract::from_srv(srv, "");
-    let doc = tystr_pass::mk_pass()(srv, doc);
-    let fold = fold::default_seq_fold(srv);
-    let doc = fold_fn(fold, doc.topmod.fns()[0]);
-    assert doc.sig == some("fn a() -> int");
+    astsrv::from_str(source) {|srv|
+        let doc = extract::from_srv(srv, "");
+        let doc = tystr_pass::mk_pass()(srv, doc);
+        let fold = fold::default_seq_fold(srv);
+        let doc = fold_fn(fold, doc.topmod.fns()[0]);
+        assert doc.sig == some("fn a() -> int");
+    }
 }
 
 #[test]
@@ -448,8 +450,9 @@ fn should_extract_type_docs() {
 #[cfg(test)]
 mod test {
     fn mk_doc(source: str) -> doc::cratedoc {
-        let srv = astsrv::from_str(source);
-        let doc = extract::from_srv(srv, "");
-        run(srv, doc)
+        astsrv::from_str(source) {|srv|
+            let doc = extract::from_srv(srv, "");
+            run(srv, doc)
+        }
     }
 }
\ No newline at end of file
diff --git a/src/rustdoc/desc_pass.rs b/src/rustdoc/desc_pass.rs
index 9e0cc33ac81..4e64c29b295 100644
--- a/src/rustdoc/desc_pass.rs
+++ b/src/rustdoc/desc_pass.rs
@@ -279,9 +279,10 @@ fn should_execute_op_on_type_desc() {
 #[cfg(test)]
 mod test {
     fn mk_doc(source: str) -> doc::cratedoc {
-        let srv = astsrv::from_str(source);
-        let doc = extract::from_srv(srv, "");
-        let doc = attr_pass::mk_pass()(srv, doc);
-        mk_pass(str::trim)(srv, doc)
+        astsrv::from_str(source) {|srv|
+            let doc = extract::from_srv(srv, "");
+            let doc = attr_pass::mk_pass()(srv, doc);
+            mk_pass(str::trim)(srv, doc)
+        }
     }
 }
\ No newline at end of file
diff --git a/src/rustdoc/desc_to_brief_pass.rs b/src/rustdoc/desc_to_brief_pass.rs
index 1e8e48bf3e2..5bf983d43eb 100644
--- a/src/rustdoc/desc_to_brief_pass.rs
+++ b/src/rustdoc/desc_to_brief_pass.rs
@@ -147,10 +147,11 @@ fn should_promote_type_desc() {
 #[cfg(test)]
 mod test {
     fn mk_doc(source: str) -> doc::cratedoc {
-        let srv = astsrv::from_str(source);
-        let doc = extract::from_srv(srv, "");
-        let doc = attr_pass::mk_pass()(srv, doc);
-        run(srv, doc)
+        astsrv::from_str(source) {|srv|
+            let doc = extract::from_srv(srv, "");
+            let doc = attr_pass::mk_pass()(srv, doc);
+            run(srv, doc)
+        }
     }
 }
 
diff --git a/src/rustdoc/extract.rs b/src/rustdoc/extract.rs
index a264e507d27..004f1b6df17 100644
--- a/src/rustdoc/extract.rs
+++ b/src/rustdoc/extract.rs
@@ -379,8 +379,9 @@ mod test {
     #[test]
     fn extract_from_seq_srv() {
         let source = "";
-        let srv = astsrv::from_str(source);
-        let doc = from_srv(srv, "name");
-        assert doc.topmod.name() == "name";
+        astsrv::from_str(source) {|srv|
+            let doc = from_srv(srv, "name");
+            assert doc.topmod.name() == "name";
+        }
     }
 }
\ No newline at end of file
diff --git a/src/rustdoc/markdown_pass.rs b/src/rustdoc/markdown_pass.rs
index 93d0ca97595..1f82e892c0e 100644
--- a/src/rustdoc/markdown_pass.rs
+++ b/src/rustdoc/markdown_pass.rs
@@ -790,16 +790,17 @@ mod test {
     }
 
     fn create_doc_srv(source: str) -> (astsrv::srv, doc::cratedoc) {
-        let srv = astsrv::from_str(source);
-        let doc = extract::from_srv(srv, "");
-        #debug("doc (extract): %?", doc);
-        let doc = tystr_pass::mk_pass()(srv, doc);
-        #debug("doc (tystr): %?", doc);
-        let doc = path_pass::mk_pass()(srv, doc);
-        #debug("doc (path): %?", doc);
-        let doc = attr_pass::mk_pass()(srv, doc);
-        #debug("doc (attr): %?", doc);
-        (srv, doc)
+        astsrv::from_str(source) {|srv|
+            let doc = extract::from_srv(srv, "");
+            #debug("doc (extract): %?", doc);
+            let doc = tystr_pass::mk_pass()(srv, doc);
+            #debug("doc (tystr): %?", doc);
+            let doc = path_pass::mk_pass()(srv, doc);
+            #debug("doc (path): %?", doc);
+            let doc = attr_pass::mk_pass()(srv, doc);
+            #debug("doc (attr): %?", doc);
+            (srv, doc)
+        }
     }
 
     fn create_doc(source: str) -> doc::cratedoc {
@@ -836,11 +837,12 @@ mod test {
 
     #[test]
     fn write_markdown_should_write_crate_header() {
-        let srv = astsrv::from_str("");
-        let doc = extract::from_srv(srv, "belch");
-        let doc = attr_pass::mk_pass()(srv, doc);
-        let markdown = write_markdown_str(doc);
-        assert str::contains(markdown, "# Crate belch");
+        astsrv::from_str("") {|srv|
+            let doc = extract::from_srv(srv, "belch");
+            let doc = attr_pass::mk_pass()(srv, doc);
+            let markdown = write_markdown_str(doc);
+            assert str::contains(markdown, "# Crate belch");
+        }
     }
 
     #[test]
diff --git a/src/rustdoc/path_pass.rs b/src/rustdoc/path_pass.rs
index a0ba492a57c..01d3d6b731d 100644
--- a/src/rustdoc/path_pass.rs
+++ b/src/rustdoc/path_pass.rs
@@ -45,18 +45,20 @@ fn fold_mod(fold: fold::fold<ctxt>, doc: doc::moddoc) -> doc::moddoc {
 #[test]
 fn should_record_mod_paths() {
     let source = "mod a { mod b { mod c { } } mod d { mod e { } } }";
-    let srv = astsrv::from_str(source);
-    let doc = extract::from_srv(srv, "");
-    let doc = run(srv, doc);
-    assert doc.topmod.mods()[0].mods()[0].mods()[0].path() == ["a", "b"];
-    assert doc.topmod.mods()[0].mods()[1].mods()[0].path() == ["a", "d"];
+    astsrv::from_str(source) {|srv|
+        let doc = extract::from_srv(srv, "");
+        let doc = run(srv, doc);
+        assert doc.topmod.mods()[0].mods()[0].mods()[0].path() == ["a", "b"];
+        assert doc.topmod.mods()[0].mods()[1].mods()[0].path() == ["a", "d"];
+    }
 }
 
 #[test]
 fn should_record_fn_paths() {
     let source = "mod a { fn b() { } }";
-    let srv = astsrv::from_str(source);
-    let doc = extract::from_srv(srv, "");
-    let doc = run(srv, doc);
-    assert doc.topmod.mods()[0].fns()[0].path() == ["a"];
+    astsrv::from_str(source) {|srv|
+        let doc = extract::from_srv(srv, "");
+        let doc = run(srv, doc);
+        assert doc.topmod.mods()[0].fns()[0].path() == ["a"];
+    }
 }
\ No newline at end of file
diff --git a/src/rustdoc/prune_undoc_details_pass.rs b/src/rustdoc/prune_undoc_details_pass.rs
index f399f36622e..1a1c55bdf68 100644
--- a/src/rustdoc/prune_undoc_details_pass.rs
+++ b/src/rustdoc/prune_undoc_details_pass.rs
@@ -64,12 +64,13 @@ fn should_elide_undocumented_arguments() {
 #[test]
 fn should_elide_undocumented_return_values() {
     let source = "#[doc = \"fonz\"] fn a() -> int { }";
-    let srv = astsrv::from_str(source);
-    let doc = extract::from_srv(srv, "");
-    let doc = tystr_pass::mk_pass()(srv, doc);
-    let doc = attr_pass::mk_pass()(srv, doc);
-    let doc = run(srv, doc);
-    assert doc.topmod.fns()[0].return.ty == none;
+    astsrv::from_str(source) {|srv|
+        let doc = extract::from_srv(srv, "");
+        let doc = tystr_pass::mk_pass()(srv, doc);
+        let doc = attr_pass::mk_pass()(srv, doc);
+        let doc = run(srv, doc);
+        assert doc.topmod.fns()[0].return.ty == none;
+    }
 }
 
 fn fold_res(
@@ -154,9 +155,10 @@ fn should_elide_undocumented_impl_method_return_values() {
 #[cfg(test)]
 mod test {
     fn mk_doc(source: str) -> doc::cratedoc {
-        let srv = astsrv::from_str(source);
-        let doc = extract::from_srv(srv, "");
-        let doc = attr_pass::mk_pass()(srv, doc);
-        run(srv, doc)
+        astsrv::from_str(source) {|srv|
+            let doc = extract::from_srv(srv, "");
+            let doc = attr_pass::mk_pass()(srv, doc);
+            run(srv, doc)
+        }
     }
 }
diff --git a/src/rustdoc/prune_undoc_items_pass.rs b/src/rustdoc/prune_undoc_items_pass.rs
index 956017a4378..3109b2aaf47 100644
--- a/src/rustdoc/prune_undoc_items_pass.rs
+++ b/src/rustdoc/prune_undoc_items_pass.rs
@@ -365,9 +365,10 @@ fn should_elide_undocumented_types() {
 #[cfg(test)]
 mod test {
     fn mk_doc(source: str) -> doc::cratedoc {
-        let srv = astsrv::from_str(source);
-        let doc = extract::from_srv(srv, "");
-        let doc = attr_pass::mk_pass()(srv, doc);
-        run(srv, doc)
+        astsrv::from_str(source) {|srv|
+            let doc = extract::from_srv(srv, "");
+            let doc = attr_pass::mk_pass()(srv, doc);
+            run(srv, doc)
+        }
     }
 }
diff --git a/src/rustdoc/prune_unexported_pass.rs b/src/rustdoc/prune_unexported_pass.rs
index c48b1176dfc..228137f3546 100644
--- a/src/rustdoc/prune_unexported_pass.rs
+++ b/src/rustdoc/prune_unexported_pass.rs
@@ -229,8 +229,9 @@ fn should_prune_unexported_types() {
 #[cfg(test)]
 mod test {
     fn mk_doc(source: str) -> doc::cratedoc {
-        let srv = astsrv::from_str(source);
-        let doc = extract::from_srv(srv, "");
-        run(srv, doc)
+        astsrv::from_str(source) {|srv|
+            let doc = extract::from_srv(srv, "");
+            run(srv, doc)
+        }
     }
 }
\ No newline at end of file
diff --git a/src/rustdoc/reexport_pass.rs b/src/rustdoc/reexport_pass.rs
index c8dd4541381..e6f2aeea234 100644
--- a/src/rustdoc/reexport_pass.rs
+++ b/src/rustdoc/reexport_pass.rs
@@ -289,14 +289,15 @@ fn should_duplicate_multiple_reexported_items() {
                   import a::b; import a::c; \
                   export b; export c; \
                   }";
-    let srv = astsrv::from_str(source);
-    let doc = extract::from_srv(srv, "");
-    let doc = path_pass::mk_pass()(srv, doc);
-    let doc = run(srv, doc);
-    // Reexports may not be in any specific order
-    let doc = sort_item_name_pass::mk_pass()(srv, doc);
-    assert doc.topmod.mods()[1].fns()[0].name() == "b";
-    assert doc.topmod.mods()[1].fns()[1].name() == "c";
+    astsrv::from_str(source) {|srv|
+        let doc = extract::from_srv(srv, "");
+        let doc = path_pass::mk_pass()(srv, doc);
+        let doc = run(srv, doc);
+        // Reexports may not be in any specific order
+        let doc = sort_item_name_pass::mk_pass()(srv, doc);
+        assert doc.topmod.mods()[1].fns()[0].name() == "b";
+        assert doc.topmod.mods()[1].fns()[1].name() == "c";
+    }
 }
 
 #[test]
@@ -310,9 +311,10 @@ fn should_rename_items_reexported_with_different_names() {
 #[cfg(test)]
 mod test {
     fn mk_doc(source: str) -> doc::cratedoc {
-        let srv = astsrv::from_str(source);
-        let doc = extract::from_srv(srv, "");
-        let doc = path_pass::mk_pass()(srv, doc);
-        run(srv, doc)
+        astsrv::from_str(source) {|srv|
+            let doc = extract::from_srv(srv, "");
+            let doc = path_pass::mk_pass()(srv, doc);
+            run(srv, doc)
+        }
     }
 }
diff --git a/src/rustdoc/rustdoc.rs b/src/rustdoc/rustdoc.rs
index fc07d290d2c..bc46dab1302 100755
--- a/src/rustdoc/rustdoc.rs
+++ b/src/rustdoc/rustdoc.rs
@@ -71,11 +71,12 @@ fn test_run_passes() {
         }
     }
     let source = "";
-    let srv = astsrv::from_str(source);
-    let passes = [pass1, pass2];
-    let doc = extract::from_srv(srv, "one");
-    let doc = run_passes(srv, doc, passes);
-    assert doc.topmod.name() == "onetwothree";
+    astsrv::from_str(source) {|srv|
+        let passes = [pass1, pass2];
+        let doc = extract::from_srv(srv, "one");
+        let doc = run_passes(srv, doc, passes);
+        assert doc.topmod.name() == "onetwothree";
+    }
 }
 
 fn main(argv: [str]) {
@@ -93,22 +94,23 @@ fn main(argv: [str]) {
 fn run(source_file: str) {
 
     let default_name = source_file;
-    let srv = astsrv::from_file(source_file);
-    let doc = extract::from_srv(srv, default_name);
-    run_passes(srv, doc, [
-        prune_unexported_pass::mk_pass(),
-        tystr_pass::mk_pass(),
-        path_pass::mk_pass(),
-        attr_pass::mk_pass(),
-        prune_undoc_details_pass::mk_pass(),
-        // FIXME: This pass should be optional
-        // prune_undoc_items_pass::mk_pass(),
-        desc_to_brief_pass::mk_pass(),
-        trim_pass::mk_pass(),
-        unindent_pass::mk_pass(),
-        reexport_pass::mk_pass(),
-        sort_item_name_pass::mk_pass(),
-        sort_item_type_pass::mk_pass(),
-        markdown_pass::mk_pass {|f| f(std::io:: stdout()) }
-    ]);
+    astsrv::from_file(source_file) {|srv|
+        let doc = extract::from_srv(srv, default_name);
+        run_passes(srv, doc, [
+            prune_unexported_pass::mk_pass(),
+            tystr_pass::mk_pass(),
+            path_pass::mk_pass(),
+            attr_pass::mk_pass(),
+            prune_undoc_details_pass::mk_pass(),
+            // FIXME: This pass should be optional
+            // prune_undoc_items_pass::mk_pass(),
+            desc_to_brief_pass::mk_pass(),
+            trim_pass::mk_pass(),
+            unindent_pass::mk_pass(),
+            reexport_pass::mk_pass(),
+            sort_item_name_pass::mk_pass(),
+            sort_item_type_pass::mk_pass(),
+            markdown_pass::mk_pass {|f| f(std::io:: stdout()) }
+        ]);
+    }
 }
\ No newline at end of file
diff --git a/src/rustdoc/sort_item_name_pass.rs b/src/rustdoc/sort_item_name_pass.rs
index 466d234c891..73a5143e699 100644
--- a/src/rustdoc/sort_item_name_pass.rs
+++ b/src/rustdoc/sort_item_name_pass.rs
@@ -11,9 +11,10 @@ fn mk_pass() -> pass {
 #[test]
 fn test() {
     let source = "mod z { } fn y() { }";
-    let srv = astsrv::from_str(source);
-    let doc = extract::from_srv(srv, "");
-    let doc = mk_pass()(srv, doc);
-    assert doc.topmod.items[0].name() == "y";
-    assert doc.topmod.items[1].name() == "z";
+    astsrv::from_str(source) {|srv|
+        let doc = extract::from_srv(srv, "");
+        let doc = mk_pass()(srv, doc);
+        assert doc.topmod.items[0].name() == "y";
+        assert doc.topmod.items[1].name() == "z";
+    }
 }
diff --git a/src/rustdoc/sort_item_type_pass.rs b/src/rustdoc/sort_item_type_pass.rs
index 766c1d545df..d2452dfa801 100644
--- a/src/rustdoc/sort_item_type_pass.rs
+++ b/src/rustdoc/sort_item_type_pass.rs
@@ -33,15 +33,16 @@ fn test() {
          iface iiface { fn a(); } \
          impl iimpl for int { fn a() { } } \
          type itype = int;";
-    let srv = astsrv::from_str(source);
-    let doc = extract::from_srv(srv, "");
-    let doc = mk_pass()(srv, doc);
-    assert doc.topmod.items[0].name() == "iconst";
-    assert doc.topmod.items[1].name() == "itype";
-    assert doc.topmod.items[2].name() == "ienum";
-    assert doc.topmod.items[3].name() == "ires";
-    assert doc.topmod.items[4].name() == "iiface";
-    assert doc.topmod.items[5].name() == "iimpl";
-    assert doc.topmod.items[6].name() == "ifn";
-    assert doc.topmod.items[7].name() == "imod";
+    astsrv::from_str(source) {|srv|
+        let doc = extract::from_srv(srv, "");
+        let doc = mk_pass()(srv, doc);
+        assert doc.topmod.items[0].name() == "iconst";
+        assert doc.topmod.items[1].name() == "itype";
+        assert doc.topmod.items[2].name() == "ienum";
+        assert doc.topmod.items[3].name() == "ires";
+        assert doc.topmod.items[4].name() == "iiface";
+        assert doc.topmod.items[5].name() == "iimpl";
+        assert doc.topmod.items[6].name() == "ifn";
+        assert doc.topmod.items[7].name() == "imod";
+    }
 }
diff --git a/src/rustdoc/sort_pass.rs b/src/rustdoc/sort_pass.rs
index faf91bc288b..2a486bbdcad 100644
--- a/src/rustdoc/sort_pass.rs
+++ b/src/rustdoc/sort_pass.rs
@@ -42,13 +42,14 @@ fn test() {
     }
 
     let source = "mod z { mod y { } fn x() { } } mod w { }";
-    let srv = astsrv::from_str(source);
-    let doc = extract::from_srv(srv, "");
-    let doc = mk_pass(name_lteq)(srv, doc);
-    assert doc.topmod.mods()[0].name() == "w";
-    assert doc.topmod.mods()[1].items[0].name() == "x";
-    assert doc.topmod.mods()[1].items[1].name() == "y";
-    assert doc.topmod.mods()[1].name() == "z";
+    astsrv::from_str(source) {|srv|
+        let doc = extract::from_srv(srv, "");
+        let doc = mk_pass(name_lteq)(srv, doc);
+        assert doc.topmod.mods()[0].name() == "w";
+        assert doc.topmod.mods()[1].items[0].name() == "x";
+        assert doc.topmod.mods()[1].items[1].name() == "y";
+        assert doc.topmod.mods()[1].name() == "z";
+    }
 }
 
 #[test]
@@ -58,12 +59,13 @@ fn should_be_stable() {
     }
 
     let source = "mod a { mod b { } } mod c { mod d { } }";
-    let srv = astsrv::from_str(source);
-    let doc = extract::from_srv(srv, "");
-    let doc = mk_pass(always_eq)(srv, doc);
-    assert doc.topmod.mods()[0].items[0].name() == "b";
-    assert doc.topmod.mods()[1].items[0].name() == "d";
-    let doc = mk_pass(always_eq)(srv, doc);
-    assert doc.topmod.mods()[0].items[0].name() == "b";
-    assert doc.topmod.mods()[1].items[0].name() == "d";
+    astsrv::from_str(source) {|srv|
+        let doc = extract::from_srv(srv, "");
+        let doc = mk_pass(always_eq)(srv, doc);
+        assert doc.topmod.mods()[0].items[0].name() == "b";
+        assert doc.topmod.mods()[1].items[0].name() == "d";
+        let doc = mk_pass(always_eq)(srv, doc);
+        assert doc.topmod.mods()[0].items[0].name() == "b";
+        assert doc.topmod.mods()[1].items[0].name() == "d";
+    }
 }
diff --git a/src/rustdoc/trim_pass.rs b/src/rustdoc/trim_pass.rs
index 57c2b25a41c..221ac86a4ed 100644
--- a/src/rustdoc/trim_pass.rs
+++ b/src/rustdoc/trim_pass.rs
@@ -61,9 +61,10 @@ fn should_trim_failure_conditions() {
 #[cfg(test)]
 mod test {
     fn mk_doc(source: str) -> doc::cratedoc {
-        let srv = astsrv::from_str(source);
-        let doc = extract::from_srv(srv, "");
-        let doc = attr_pass::mk_pass()(srv, doc);
-        mk_pass()(srv, doc)
+        astsrv::from_str(source) {|srv|
+            let doc = extract::from_srv(srv, "");
+            let doc = attr_pass::mk_pass()(srv, doc);
+            mk_pass()(srv, doc)
+        }
     }
 }
\ No newline at end of file
diff --git a/src/rustdoc/tystr_pass.rs b/src/rustdoc/tystr_pass.rs
index 401db0a2c5a..9b1166fed7a 100644
--- a/src/rustdoc/tystr_pass.rs
+++ b/src/rustdoc/tystr_pass.rs
@@ -558,8 +558,9 @@ fn should_add_type_signatures() {
 #[cfg(test)]
 mod test {
     fn mk_doc(source: str) -> doc::cratedoc {
-        let srv = astsrv::from_str(source);
-        let doc = extract::from_srv(srv, "");
-        run(srv, doc)
+        astsrv::from_str(source) {|srv|
+            let doc = extract::from_srv(srv, "");
+            run(srv, doc)
+        }
     }
 }