about summary refs log tree commit diff
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2013-01-31 20:24:03 -0800
committerBrian Anderson <banderson@mozilla.com>2013-02-01 00:00:17 -0800
commit63c16e9e79839ba767e2a8c7172d9a330c782600 (patch)
tree5cd74767ca9a1e5f959f968d21ba4f2df24ba347
parente343abd0ed11227425eca16e186367eced39cd82 (diff)
downloadrust-63c16e9e79839ba767e2a8c7172d9a330c782600.tar.gz
rust-63c16e9e79839ba767e2a8c7172d9a330c782600.zip
rustdoc: Convert astsrv to pipes
-rw-r--r--src/librustdoc/astsrv.rs31
-rw-r--r--src/librustdoc/attr_pass.rs19
-rw-r--r--src/librustdoc/desc_to_brief_pass.rs6
-rw-r--r--src/librustdoc/fold.rs20
-rw-r--r--src/librustdoc/markdown_index_pass.rs10
-rw-r--r--src/librustdoc/markdown_pass.rs20
-rw-r--r--src/librustdoc/markdown_writer.rs4
-rw-r--r--src/librustdoc/page_pass.rs4
-rw-r--r--src/librustdoc/pass.rs4
-rw-r--r--src/librustdoc/path_pass.rs24
-rw-r--r--src/librustdoc/prune_hidden_pass.rs7
-rw-r--r--src/librustdoc/prune_private_pass.rs7
-rw-r--r--src/librustdoc/rustdoc.rc4
-rw-r--r--src/librustdoc/sectionalize_pass.rs6
-rw-r--r--src/librustdoc/sort_item_name_pass.rs4
-rw-r--r--src/librustdoc/sort_item_type_pass.rs4
-rw-r--r--src/librustdoc/sort_pass.rs10
-rw-r--r--src/librustdoc/text_pass.rs10
-rw-r--r--src/librustdoc/trim_pass.rs6
-rw-r--r--src/librustdoc/tystr_pass.rs29
20 files changed, 122 insertions, 107 deletions
diff --git a/src/librustdoc/astsrv.rs b/src/librustdoc/astsrv.rs
index cdfc13e4fa7..a9c1630b654 100644
--- a/src/librustdoc/astsrv.rs
+++ b/src/librustdoc/astsrv.rs
@@ -22,9 +22,10 @@ use core::prelude::*;
 use parse;
 use util;
 
-use core::pipes::stream;
+use core::pipes::{stream, Chan, SharedChan, Port};
 use core::oldcomm;
 use core::vec;
+use core::ops::Drop;
 use rustc::back::link;
 use rustc::driver::driver;
 use rustc::driver::session::Session;
@@ -55,11 +56,15 @@ enum Msg {
 }
 
 pub struct Srv {
-    ch: oldcomm::Chan<Msg>
+    ch: SharedChan<Msg>
 }
 
 impl Srv: Clone {
-    fn clone(&self) -> Srv { copy *self }
+    fn clone(&self) -> Srv {
+        Srv {
+            ch: self.ch.clone()
+        }
+    }
 }
 
 pub fn from_str<T>(source: ~str, owner: SrvOwner<T>) -> T {
@@ -72,18 +77,22 @@ pub fn from_file<T>(file: ~str, owner: SrvOwner<T>) -> T {
 
 fn run<T>(owner: SrvOwner<T>, source: ~str, parse: Parser) -> T {
 
+    let (po, ch) = stream();
+
+    do task::spawn {
+        act(&po, copy source, copy parse);
+    }
+
     let srv_ = Srv {
-        ch: do util::spawn_listener |copy source, move parse, po| {
-            act(po, copy source, copy parse);
-        }
+        ch: SharedChan(ch)
     };
 
-    let res = owner(srv_);
-    oldcomm::send(srv_.ch, Exit);
+    let res = owner(srv_.clone());
+    srv_.ch.send(Exit);
     move res
 }
 
-fn act(po: oldcomm::Port<Msg>, source: ~str, parse: Parser) {
+fn act(po: &Port<Msg>, source: ~str, parse: Parser) {
     let sess = build_session();
 
     let ctxt = build_ctxt(
@@ -93,7 +102,7 @@ fn act(po: oldcomm::Port<Msg>, source: ~str, parse: Parser) {
 
     let mut keep_going = true;
     while keep_going {
-        match oldcomm::recv(po) {
+        match po.recv() {
           HandleRequest(f) => {
             f(ctxt);
           }
@@ -112,7 +121,7 @@ pub fn exec<T:Owned>(
     let msg = HandleRequest(fn~(move f, ctxt: Ctxt) {
         ch.send(f(ctxt))
     });
-    oldcomm::send(srv.ch, move msg);
+    srv.ch.send(move msg);
     po.recv()
 }
 
diff --git a/src/librustdoc/attr_pass.rs b/src/librustdoc/attr_pass.rs
index 80cf679ddaa..382695e40f7 100644
--- a/src/librustdoc/attr_pass.rs
+++ b/src/librustdoc/attr_pass.rs
@@ -46,6 +46,7 @@ pub fn run(
     doc: doc::Doc
 ) -> doc::Doc {
     let fold = Fold {
+        ctxt: srv.clone(),
         fold_crate: fold_crate,
         fold_item: fold_item,
         fold_enum: fold_enum,
@@ -61,7 +62,7 @@ fn fold_crate(
     doc: doc::CrateDoc
 ) -> doc::CrateDoc {
 
-    let srv = fold.ctxt;
+    let srv = fold.ctxt.clone();
     let doc = fold::default_seq_fold_crate(fold, doc);
 
     let attrs = do astsrv::exec(srv) |ctxt| {
@@ -92,7 +93,7 @@ fn fold_item(
     doc: doc::ItemDoc
 ) -> doc::ItemDoc {
 
-    let srv = fold.ctxt;
+    let srv = fold.ctxt.clone();
     let doc = fold::default_seq_fold_item(fold, doc);
 
     let desc = if doc.id == ast::crate_node_id {
@@ -159,16 +160,16 @@ fn fold_enum(
     doc: doc::EnumDoc
 ) -> doc::EnumDoc {
 
-    let srv = fold.ctxt;
+    let srv = fold.ctxt.clone();
     let doc_id = doc.id();
     let doc = fold::default_seq_fold_enum(fold, doc);
 
     doc::EnumDoc {
-        variants: do par::map(doc.variants) |variant| {
+        variants: do vec::map(doc.variants) |variant| {
             let variant = copy *variant;
             let desc = {
                 let variant = copy variant;
-                do astsrv::exec(srv) |ctxt| {
+                do astsrv::exec(srv.clone()) |ctxt| {
                     match ctxt.ast_map.get(doc_id) {
                         ast_map::node_item(@ast::item {
                             node: ast::item_enum(ref enum_definition, _), _
@@ -216,7 +217,7 @@ fn fold_trait(
     fold: &fold::Fold<astsrv::Srv>,
     doc: doc::TraitDoc
 ) -> doc::TraitDoc {
-    let srv = fold.ctxt;
+    let srv = fold.ctxt.clone();
     let doc = fold::default_seq_fold_trait(fold, doc);
 
     doc::TraitDoc {
@@ -293,7 +294,7 @@ fn fold_impl(
     fold: &fold::Fold<astsrv::Srv>,
     doc: doc::ImplDoc
 ) -> doc::ImplDoc {
-    let srv = fold.ctxt;
+    let srv = fold.ctxt.clone();
     let doc = fold::default_seq_fold_impl(fold, doc);
 
     doc::ImplDoc {
@@ -328,8 +329,8 @@ mod test {
 
     pub fn mk_doc(source: ~str) -> doc::Doc {
         do astsrv::from_str(copy source) |srv| {
-            let doc = extract::from_srv(srv, ~"");
-            run(srv, doc)
+            let doc = extract::from_srv(srv.clone(), ~"");
+            run(srv.clone(), doc)
         }
     }
 }
diff --git a/src/librustdoc/desc_to_brief_pass.rs b/src/librustdoc/desc_to_brief_pass.rs
index 6b04903601c..225b62f72cb 100644
--- a/src/librustdoc/desc_to_brief_pass.rs
+++ b/src/librustdoc/desc_to_brief_pass.rs
@@ -111,9 +111,9 @@ pub mod test {
 
     pub fn mk_doc(source: ~str) -> doc::Doc {
         do astsrv::from_str(copy source) |srv| {
-            let doc = extract::from_srv(srv, ~"");
-            let doc = (attr_pass::mk_pass().f)(srv, doc);
-            run(srv, doc)
+            let doc = extract::from_srv(srv.clone(), ~"");
+            let doc = (attr_pass::mk_pass().f)(srv.clone(), doc);
+            run(srv.clone(), doc)
         }
     }
 }
diff --git a/src/librustdoc/fold.rs b/src/librustdoc/fold.rs
index e85f8595a5a..c93d9f3d7c1 100644
--- a/src/librustdoc/fold.rs
+++ b/src/librustdoc/fold.rs
@@ -193,11 +193,10 @@ pub fn default_any_fold_mod<T:Owned Clone>(
     fold: &Fold<T>,
     doc: doc::ModDoc
 ) -> doc::ModDoc {
-    let fold_copy = fold.clone();
     doc::ModDoc {
         item: (fold.fold_item)(fold, copy doc.item),
-        items: par::map(doc.items, |ItemTag, move fold_copy| {
-            fold_ItemTag(&fold_copy, copy *ItemTag)
+        items: vec::map(doc.items, |ItemTag| {
+            fold_ItemTag(fold, copy *ItemTag)
         }),
         .. doc
     }
@@ -220,11 +219,10 @@ pub fn default_par_fold_mod<T:Owned Clone>(
     fold: &Fold<T>,
     doc: doc::ModDoc
 ) -> doc::ModDoc {
-    let fold_copy = fold.clone();
     doc::ModDoc {
         item: (fold.fold_item)(fold, copy doc.item),
-        items: par::map(doc.items, |ItemTag, move fold_copy| {
-            fold_ItemTag(&fold_copy, copy *ItemTag)
+        items: vec::map(doc.items, |ItemTag| {
+            fold_ItemTag(fold, copy *ItemTag)
         }),
         .. doc
     }
@@ -234,11 +232,10 @@ pub fn default_any_fold_nmod<T:Owned Clone>(
     fold: &Fold<T>,
     doc: doc::NmodDoc
 ) -> doc::NmodDoc {
-    let fold_copy = fold.clone();
     doc::NmodDoc {
         item: (fold.fold_item)(fold, copy doc.item),
-        fns: par::map(doc.fns, |FnDoc, move fold_copy| {
-            (fold_copy.fold_fn)(&fold_copy, copy *FnDoc)
+        fns: vec::map(doc.fns, |FnDoc| {
+            (fold.fold_fn)(fold, copy *FnDoc)
         }),
         .. doc
     }
@@ -261,11 +258,10 @@ pub fn default_par_fold_nmod<T:Owned Clone>(
     fold: &Fold<T>,
     doc: doc::NmodDoc
 ) -> doc::NmodDoc {
-    let fold_copy = fold.clone();
     doc::NmodDoc {
         item: (fold.fold_item)(fold, copy doc.item),
-        fns: par::map(doc.fns, |FnDoc, move fold_copy| {
-            (fold_copy.fold_fn)(&fold_copy, copy *FnDoc)
+        fns: vec::map(doc.fns, |FnDoc| {
+            (fold.fold_fn)(fold, copy *FnDoc)
         }),
         .. doc
     }
diff --git a/src/librustdoc/markdown_index_pass.rs b/src/librustdoc/markdown_index_pass.rs
index c5db7685080..776d2fe9083 100644
--- a/src/librustdoc/markdown_index_pass.rs
+++ b/src/librustdoc/markdown_index_pass.rs
@@ -274,11 +274,11 @@ mod test {
                 output_style: output_style,
                 .. config::default_config(&Path("whatever"))
             };
-            let doc = extract::from_srv(srv, ~"");
-            let doc = (attr_pass::mk_pass().f)(srv, doc);
-            let doc = (desc_to_brief_pass::mk_pass().f)(srv, doc);
-            let doc = (path_pass::mk_pass().f)(srv, doc);
-            run(srv, doc, config)
+            let doc = extract::from_srv(srv.clone(), ~"");
+            let doc = (attr_pass::mk_pass().f)(srv.clone(), doc);
+            let doc = (desc_to_brief_pass::mk_pass().f)(srv.clone(), doc);
+            let doc = (path_pass::mk_pass().f)(srv.clone(), doc);
+            run(srv.clone(), doc, config)
         }
     }
 }
diff --git a/src/librustdoc/markdown_pass.rs b/src/librustdoc/markdown_pass.rs
index bb8ffe98b9f..b82b9b16125 100644
--- a/src/librustdoc/markdown_pass.rs
+++ b/src/librustdoc/markdown_pass.rs
@@ -867,25 +867,25 @@ mod test {
                 .. config::default_config(&Path("whatever"))
             };
 
-            let doc = extract::from_srv(srv, ~"");
+            let doc = extract::from_srv(srv.clone(), ~"");
             debug!("doc (extract): %?", doc);
-            let doc = (tystr_pass::mk_pass().f)(srv, doc);
+            let doc = (tystr_pass::mk_pass().f)(srv.clone(), doc);
             debug!("doc (tystr): %?", doc);
-            let doc = (path_pass::mk_pass().f)(srv, doc);
+            let doc = (path_pass::mk_pass().f)(srv.clone(), doc);
             debug!("doc (path): %?", doc);
-            let doc = (attr_pass::mk_pass().f)(srv, doc);
+            let doc = (attr_pass::mk_pass().f)(srv.clone(), doc);
             debug!("doc (attr): %?", doc);
-            let doc = (desc_to_brief_pass::mk_pass().f)(srv, doc);
+            let doc = (desc_to_brief_pass::mk_pass().f)(srv.clone(), doc);
             debug!("doc (desc_to_brief): %?", doc);
-            let doc = (unindent_pass::mk_pass().f)(srv, doc);
+            let doc = (unindent_pass::mk_pass().f)(srv.clone(), doc);
             debug!("doc (unindent): %?", doc);
-            let doc = (sectionalize_pass::mk_pass().f)(srv, doc);
+            let doc = (sectionalize_pass::mk_pass().f)(srv.clone(), doc);
             debug!("doc (trim): %?", doc);
-            let doc = (trim_pass::mk_pass().f)(srv, doc);
+            let doc = (trim_pass::mk_pass().f)(srv.clone(), doc);
             debug!("doc (sectionalize): %?", doc);
-            let doc = (markdown_index_pass::mk_pass(config).f)(srv, doc);
+            let doc = (markdown_index_pass::mk_pass(config).f)(srv.clone(), doc);
             debug!("doc (index): %?", doc);
-            (srv, doc)
+            (srv.clone(), doc)
         }
     }
 
diff --git a/src/librustdoc/markdown_writer.rs b/src/librustdoc/markdown_writer.rs
index ad153d59276..3b9f07d6920 100644
--- a/src/librustdoc/markdown_writer.rs
+++ b/src/librustdoc/markdown_writer.rs
@@ -279,8 +279,8 @@ mod test {
 
     pub fn mk_doc(name: ~str, source: ~str) -> doc::Doc {
         do astsrv::from_str(source) |srv| {
-            let doc = extract::from_srv(srv, copy name);
-            let doc = (path_pass::mk_pass().f)(srv, doc);
+            let doc = extract::from_srv(srv.clone(), copy name);
+            let doc = (path_pass::mk_pass().f)(srv.clone(), doc);
             doc
         }
     }
diff --git a/src/librustdoc/page_pass.rs b/src/librustdoc/page_pass.rs
index 1649a7ee823..e2122378351 100644
--- a/src/librustdoc/page_pass.rs
+++ b/src/librustdoc/page_pass.rs
@@ -196,8 +196,8 @@ mod test {
         source: ~str
     ) -> doc::Doc {
         do astsrv::from_str(copy source) |srv| {
-            let doc = extract::from_srv(srv, ~"");
-            run(srv, doc, output_style)
+            let doc = extract::from_srv(srv.clone(), ~"");
+            run(srv.clone(), doc, output_style)
         }
     }
 
diff --git a/src/librustdoc/pass.rs b/src/librustdoc/pass.rs
index afd93175c9b..91e3264db1c 100644
--- a/src/librustdoc/pass.rs
+++ b/src/librustdoc/pass.rs
@@ -33,7 +33,7 @@ pub fn run_passes(
         log(debug, fmt!("pass #%d", passno));
         passno += 1;
         do time(copy pass.name) {
-            (pass.f)(srv, copy doc)
+            (pass.f)(srv.clone(), copy doc)
         }
     }
 }
@@ -90,7 +90,7 @@ fn test_run_passes() {
                 f: pass2
             }
         ];
-        let doc = extract::from_srv(srv, ~"one");
+        let doc = extract::from_srv(srv.clone(), ~"one");
         let doc = run_passes(srv, doc, passes);
         assert doc.cratemod().name() == ~"onetwothree";
     }
diff --git a/src/librustdoc/path_pass.rs b/src/librustdoc/path_pass.rs
index 9c781c30dbc..165ab989a2f 100644
--- a/src/librustdoc/path_pass.rs
+++ b/src/librustdoc/path_pass.rs
@@ -35,7 +35,12 @@ struct Ctxt {
 }
 
 impl Ctxt: Clone {
-    fn clone(&self) -> Ctxt { copy *self }
+    fn clone(&self) -> Ctxt {
+        Ctxt {
+            srv: self.srv.clone(),
+            path: copy self.path
+        }
+    }
 }
 
 #[allow(non_implicitly_copyable_typarams)]
@@ -45,6 +50,7 @@ fn run(srv: astsrv::Srv, doc: doc::Doc) -> doc::Doc {
         mut path: ~[]
     };
     let fold = Fold {
+        ctxt: ctxt.clone(),
         fold_item: fold_item,
         fold_mod: fold_mod,
         fold_nmod: fold_nmod,
@@ -89,8 +95,8 @@ fn fold_nmod(fold: &fold::Fold<Ctxt>, doc: doc::NmodDoc) -> doc::NmodDoc {
 fn should_record_mod_paths() {
     let source = ~"mod a { mod b { mod c { } } mod d { mod e { } } }";
     do astsrv::from_str(source) |srv| {
-        let doc = extract::from_srv(srv, ~"");
-        let doc = run(srv, doc);
+        let doc = extract::from_srv(srv.clone(), ~"");
+        let doc = run(srv.clone(), doc);
         assert doc.cratemod().mods()[0].mods()[0].mods()[0].path()
             == ~[~"a", ~"b"];
         assert doc.cratemod().mods()[0].mods()[1].mods()[0].path()
@@ -102,8 +108,8 @@ fn should_record_mod_paths() {
 fn should_record_fn_paths() {
     let source = ~"mod a { fn b() { } }";
     do astsrv::from_str(source) |srv| {
-        let doc = extract::from_srv(srv, ~"");
-        let doc = run(srv, doc);
+        let doc = extract::from_srv(srv.clone(), ~"");
+        let doc = run(srv.clone(), doc);
         assert doc.cratemod().mods()[0].fns()[0].path() == ~[~"a"];
     }
 }
@@ -112,8 +118,8 @@ fn should_record_fn_paths() {
 fn should_record_foreign_mod_paths() {
     let source = ~"mod a { extern mod b { } }";
     do astsrv::from_str(source) |srv| {
-        let doc = extract::from_srv(srv, ~"");
-        let doc = run(srv, doc);
+        let doc = extract::from_srv(srv.clone(), ~"");
+        let doc = run(srv.clone(), doc);
         assert doc.cratemod().mods()[0].nmods()[0].path() == ~[~"a"];
     }
 }
@@ -122,8 +128,8 @@ fn should_record_foreign_mod_paths() {
 fn should_record_foreign_fn_paths() {
     let source = ~"extern mod a { fn b(); }";
     do astsrv::from_str(source) |srv| {
-        let doc = extract::from_srv(srv, ~"");
-        let doc = run(srv, doc);
+        let doc = extract::from_srv(srv.clone(), ~"");
+        let doc = run(srv.clone(), doc);
         assert doc.cratemod().nmods()[0].fns[0].path() == ~[~"a"];
     }
 }
diff --git a/src/librustdoc/prune_hidden_pass.rs b/src/librustdoc/prune_hidden_pass.rs
index 9a9ec19b7db..6ca59b629ee 100644
--- a/src/librustdoc/prune_hidden_pass.rs
+++ b/src/librustdoc/prune_hidden_pass.rs
@@ -30,6 +30,7 @@ pub fn mk_pass() -> Pass {
 
 pub fn run(srv: astsrv::Srv, doc: doc::Doc) -> doc::Doc {
     let fold = Fold {
+        ctxt: srv.clone(),
         fold_mod: fold_mod,
         .. fold::default_any_fold(srv)
     };
@@ -44,7 +45,7 @@ fn fold_mod(
 
     doc::ModDoc {
         items: do doc.items.filtered |ItemTag| {
-            !is_hidden(fold.ctxt, ItemTag.item())
+            !is_hidden(fold.ctxt.clone(), ItemTag.item())
         },
         .. doc
     }
@@ -78,8 +79,8 @@ pub mod test {
 
     pub fn mk_doc(source: ~str) -> doc::Doc {
         do astsrv::from_str(copy source) |srv| {
-            let doc = extract::from_srv(srv, ~"");
-            run(srv, doc)
+            let doc = extract::from_srv(srv.clone(), ~"");
+            run(srv.clone(), doc)
         }
     }
 }
diff --git a/src/librustdoc/prune_private_pass.rs b/src/librustdoc/prune_private_pass.rs
index 94098e4df86..4b47b71449a 100644
--- a/src/librustdoc/prune_private_pass.rs
+++ b/src/librustdoc/prune_private_pass.rs
@@ -31,6 +31,7 @@ pub fn mk_pass() -> Pass {
 
 pub fn run(srv: astsrv::Srv, doc: doc::Doc) -> doc::Doc {
     let fold = Fold {
+        ctxt: srv.clone(),
         fold_mod: fold_mod,
         .. fold::default_any_fold(srv)
     };
@@ -45,7 +46,7 @@ fn fold_mod(
 
     doc::ModDoc {
         items: doc.items.filtered(|ItemTag| {
-            is_visible(fold.ctxt, ItemTag.item())
+            is_visible(fold.ctxt.clone(), ItemTag.item())
         }),
         .. doc
     }
@@ -82,8 +83,8 @@ pub mod test {
 
     pub fn mk_doc(source: ~str) -> doc::Doc {
         do astsrv::from_str(copy source) |srv| {
-            let doc = extract::from_srv(srv, ~"");
-            run(srv, doc)
+            let doc = extract::from_srv(srv.clone(), ~"");
+            run(srv.clone(), doc)
         }
     }
 }
diff --git a/src/librustdoc/rustdoc.rc b/src/librustdoc/rustdoc.rc
index ab17d829c69..b3e9c43e87a 100644
--- a/src/librustdoc/rustdoc.rc
+++ b/src/librustdoc/rustdoc.rc
@@ -94,14 +94,14 @@ fn run(config: Config) {
 
         // Just time how long it takes for the AST to become available
         do time(~"wait_ast") {
-            do astsrv::exec(srv) |_ctxt| { }
+            do astsrv::exec(srv.clone()) |_ctxt| { }
         };
 
         // Extract the initial doc tree from the AST. This contains
         // just names and node ids.
         let doc = time(~"extract", || {
             let default_name = copy source_file;
-            extract::from_srv(srv, default_name.to_str())
+            extract::from_srv(srv.clone(), default_name.to_str())
         });
 
         // Refine and publish the document
diff --git a/src/librustdoc/sectionalize_pass.rs b/src/librustdoc/sectionalize_pass.rs
index 2e04f416176..d6455c4c783 100644
--- a/src/librustdoc/sectionalize_pass.rs
+++ b/src/librustdoc/sectionalize_pass.rs
@@ -261,9 +261,9 @@ pub mod test {
 
     pub fn mk_doc(source: ~str) -> doc::Doc {
         do astsrv::from_str(copy source) |srv| {
-            let doc = extract::from_srv(srv, ~"");
-            let doc = (attr_pass::mk_pass().f)(srv, doc);
-            run(srv, doc)
+            let doc = extract::from_srv(srv.clone(), ~"");
+            let doc = (attr_pass::mk_pass().f)(srv.clone(), doc);
+            run(srv.clone(), doc)
         }
     }
 }
diff --git a/src/librustdoc/sort_item_name_pass.rs b/src/librustdoc/sort_item_name_pass.rs
index 9a777d79345..946be67ee10 100644
--- a/src/librustdoc/sort_item_name_pass.rs
+++ b/src/librustdoc/sort_item_name_pass.rs
@@ -28,8 +28,8 @@ pub fn mk_pass() -> Pass {
 fn test() {
     let source = ~"mod z { } fn y() { }";
     do astsrv::from_str(source) |srv| {
-        let doc = extract::from_srv(srv, ~"");
-        let doc = (mk_pass().f)(srv, doc);
+        let doc = extract::from_srv(srv.clone(), ~"");
+        let doc = (mk_pass().f)(srv.clone(), doc);
         assert doc.cratemod().items[0].name() == ~"y";
         assert doc.cratemod().items[1].name() == ~"z";
     }
diff --git a/src/librustdoc/sort_item_type_pass.rs b/src/librustdoc/sort_item_type_pass.rs
index ad737567d01..646dc12d336 100644
--- a/src/librustdoc/sort_item_type_pass.rs
+++ b/src/librustdoc/sort_item_type_pass.rs
@@ -55,8 +55,8 @@ fn test() {
          type itype = int; \
          struct istruct { f: () }";
     do astsrv::from_str(source) |srv| {
-        let doc = extract::from_srv(srv, ~"");
-        let doc = (mk_pass().f)(srv, doc);
+        let doc = extract::from_srv(srv.clone(), ~"");
+        let doc = (mk_pass().f)(srv.clone(), doc);
         assert doc.cratemod().items[0].name() == ~"iconst";
         assert doc.cratemod().items[1].name() == ~"itype";
         assert doc.cratemod().items[2].name() == ~"ienum";
diff --git a/src/librustdoc/sort_pass.rs b/src/librustdoc/sort_pass.rs
index dcc4902c9b8..2792508483c 100644
--- a/src/librustdoc/sort_pass.rs
+++ b/src/librustdoc/sort_pass.rs
@@ -69,8 +69,8 @@ fn test() {
 
     let source = ~"mod z { mod y { } fn x() { } } mod w { }";
     do astsrv::from_str(source) |srv| {
-        let doc = extract::from_srv(srv, ~"");
-        let doc = (mk_pass(~"", name_lteq).f)(srv, doc);
+        let doc = extract::from_srv(srv.clone(), ~"");
+        let doc = (mk_pass(~"", name_lteq).f)(srv.clone(), doc);
         assert doc.cratemod().mods()[0].name() == ~"w";
         assert doc.cratemod().mods()[1].items[0].name() == ~"x";
         assert doc.cratemod().mods()[1].items[1].name() == ~"y";
@@ -86,11 +86,11 @@ fn should_be_stable() {
 
     let source = ~"mod a { mod b { } } mod c { mod d { } }";
     do astsrv::from_str(source) |srv| {
-        let doc = extract::from_srv(srv, ~"");
-        let doc = (mk_pass(~"", always_eq).f)(srv, doc);
+        let doc = extract::from_srv(srv.clone(), ~"");
+        let doc = (mk_pass(~"", always_eq).f)(srv.clone(), doc);
         assert doc.cratemod().mods()[0].items[0].name() == ~"b";
         assert doc.cratemod().mods()[1].items[0].name() == ~"d";
-        let doc = (mk_pass(~"", always_eq).f)(srv, doc);
+        let doc = (mk_pass(~"", always_eq).f)(srv.clone(), doc);
         assert doc.cratemod().mods()[0].items[0].name() == ~"b";
         assert doc.cratemod().mods()[1].items[0].name() == ~"d";
     }
diff --git a/src/librustdoc/text_pass.rs b/src/librustdoc/text_pass.rs
index d5c4dda6d95..8d88f5aeae2 100644
--- a/src/librustdoc/text_pass.rs
+++ b/src/librustdoc/text_pass.rs
@@ -306,11 +306,11 @@ mod test {
 
     pub fn mk_doc(source: ~str) -> doc::Doc {
         do astsrv::from_str(copy source) |srv| {
-            let doc = extract::from_srv(srv, ~"");
-            let doc = (attr_pass::mk_pass().f)(srv, doc);
-            let doc = (desc_to_brief_pass::mk_pass().f)(srv, doc);
-            let doc = (sectionalize_pass::mk_pass().f)(srv, doc);
-            (mk_pass(~"", |s| str::trim(s) ).f)(srv, doc)
+            let doc = extract::from_srv(srv.clone(), ~"");
+            let doc = (attr_pass::mk_pass().f)(srv.clone(), doc);
+            let doc = (desc_to_brief_pass::mk_pass().f)(srv.clone(), doc);
+            let doc = (sectionalize_pass::mk_pass().f)(srv.clone(), doc);
+            (mk_pass(~"", |s| str::trim(s) ).f)(srv.clone(), doc)
         }
     }
 }
diff --git a/src/librustdoc/trim_pass.rs b/src/librustdoc/trim_pass.rs
index bac69e32848..39557a92e01 100644
--- a/src/librustdoc/trim_pass.rs
+++ b/src/librustdoc/trim_pass.rs
@@ -45,9 +45,9 @@ mod test {
 
     pub fn mk_doc(source: ~str) -> doc::Doc {
         do astsrv::from_str(copy source) |srv| {
-            let doc = extract::from_srv(srv, ~"");
-            let doc = (attr_pass::mk_pass().f)(srv, doc);
-            (mk_pass().f)(srv, doc)
+            let doc = extract::from_srv(srv.clone(), ~"");
+            let doc = (attr_pass::mk_pass().f)(srv.clone(), doc);
+            (mk_pass().f)(srv.clone(), doc)
         }
     }
 }
diff --git a/src/librustdoc/tystr_pass.rs b/src/librustdoc/tystr_pass.rs
index 7ef7cd39007..417171e6773 100644
--- a/src/librustdoc/tystr_pass.rs
+++ b/src/librustdoc/tystr_pass.rs
@@ -40,6 +40,7 @@ pub fn run(
     doc: doc::Doc
 ) -> doc::Doc {
     let fold = Fold {
+        ctxt: srv.clone(),
         fold_fn: fold_fn,
         fold_const: fold_const,
         fold_enum: fold_enum,
@@ -57,7 +58,7 @@ fn fold_fn(
     doc: doc::FnDoc
 ) -> doc::FnDoc {
 
-    let srv = fold.ctxt;
+    let srv = fold.ctxt.clone();
 
     doc::SimpleItemDoc {
         sig: get_fn_sig(srv, doc.id()),
@@ -100,7 +101,7 @@ fn fold_const(
     fold: &fold::Fold<astsrv::Srv>,
     doc: doc::ConstDoc
 ) -> doc::ConstDoc {
-    let srv = fold.ctxt;
+    let srv = fold.ctxt.clone();
 
     doc::SimpleItemDoc {
         sig: Some({
@@ -130,13 +131,13 @@ fn fold_enum(
     doc: doc::EnumDoc
 ) -> doc::EnumDoc {
     let doc_id = doc.id();
-    let srv = fold.ctxt;
+    let srv = fold.ctxt.clone();
 
     doc::EnumDoc {
-        variants: do par::map(doc.variants) |variant| {
+        variants: do vec::map(doc.variants) |variant| {
             let sig = {
                 let variant = copy *variant;
-                do astsrv::exec(srv) |copy variant, ctxt| {
+                do astsrv::exec(srv.clone()) |copy variant, ctxt| {
                     match ctxt.ast_map.get(doc_id) {
                         ast_map::node_item(@ast::item {
                             node: ast::item_enum(ref enum_definition, _), _
@@ -174,7 +175,7 @@ fn fold_trait(
     doc: doc::TraitDoc
 ) -> doc::TraitDoc {
     doc::TraitDoc {
-        methods: merge_methods(fold.ctxt, doc.id(), copy doc.methods),
+        methods: merge_methods(fold.ctxt.clone(), doc.id(), copy doc.methods),
         .. doc
     }
 }
@@ -184,9 +185,9 @@ fn merge_methods(
     item_id: doc::AstId,
     docs: ~[doc::MethodDoc]
 ) -> ~[doc::MethodDoc] {
-    do par::map(docs) |doc| {
+    do vec::map(docs) |doc| {
         doc::MethodDoc {
-            sig: get_method_sig(srv, item_id, copy doc.name),
+            sig: get_method_sig(srv.clone(), item_id, copy doc.name),
             .. copy *doc
         }
     }
@@ -265,7 +266,7 @@ fn fold_impl(
     doc: doc::ImplDoc
 ) -> doc::ImplDoc {
 
-    let srv = fold.ctxt;
+    let srv = fold.ctxt.clone();
 
     let (trait_types, self_ty) = {
         let doc = copy doc;
@@ -289,7 +290,7 @@ fn fold_impl(
     doc::ImplDoc {
         trait_types: trait_types,
         self_ty: self_ty,
-        methods: merge_methods(fold.ctxt, doc.id(), copy doc.methods),
+        methods: merge_methods(fold.ctxt.clone(), doc.id(), copy doc.methods),
         .. doc
     }
 }
@@ -324,7 +325,7 @@ fn fold_type(
     doc: doc::TyDoc
 ) -> doc::TyDoc {
 
-    let srv = fold.ctxt;
+    let srv = fold.ctxt.clone();
 
     doc::SimpleItemDoc {
         sig: {
@@ -362,7 +363,7 @@ fn fold_struct(
     fold: &fold::Fold<astsrv::Srv>,
     doc: doc::StructDoc
 ) -> doc::StructDoc {
-    let srv = fold.ctxt;
+    let srv = fold.ctxt.clone();
 
     doc::StructDoc {
         sig: {
@@ -434,8 +435,8 @@ pub mod test {
 
     pub fn mk_doc(source: ~str) -> doc::Doc {
         do astsrv::from_str(copy source) |srv| {
-            let doc = extract::from_srv(srv, ~"");
-            run(srv, doc)
+            let doc = extract::from_srv(srv.clone(), ~"");
+            run(srv.clone(), doc)
         }
     }
 }