about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2012-11-19 18:48:46 -0800
committerBrian Anderson <banderson@mozilla.com>2012-11-20 22:13:50 -0800
commit415664181b04574a5dfa553a54efb4df7924c15f (patch)
tree565165e6d69d4c86acbf0461d2ba00462ed7742f /src
parent145e02347e88176e342631033abb748c51db45e8 (diff)
rustdoc: Begin removing legacy modes
Diffstat (limited to 'src')
-rw-r--r--src/librustdoc/astsrv.rs2
-rw-r--r--src/librustdoc/attr_parser.rs10
-rw-r--r--src/librustdoc/attr_pass.rs26
-rw-r--r--src/librustdoc/config.rs36
-rw-r--r--src/librustdoc/desc_to_brief_pass.rs10
-rw-r--r--src/librustdoc/extract.rs34
-rw-r--r--src/librustdoc/fold.rs118
-rw-r--r--src/librustdoc/markdown_index_pass.rs18
-rw-r--r--src/librustdoc/markdown_pass.rs2
-rw-r--r--src/librustdoc/page_pass.rs18
-rw-r--r--src/librustdoc/parse.rs6
-rw-r--r--src/librustdoc/pass.rs10
-rw-r--r--src/librustdoc/path_pass.rs10
-rw-r--r--src/librustdoc/prune_hidden_pass.rs8
-rw-r--r--src/librustdoc/prune_private_pass.rs8
-rw-r--r--src/librustdoc/sectionalize_pass.rs10
-rw-r--r--src/librustdoc/sort_pass.rs10
-rw-r--r--src/librustdoc/text_pass.rs19
-rw-r--r--src/librustdoc/tystr_pass.rs32
19 files changed, 197 insertions, 190 deletions
diff --git a/src/librustdoc/astsrv.rs b/src/librustdoc/astsrv.rs
index 2f78351e545..79e0deb77ce 100644
--- a/src/librustdoc/astsrv.rs
+++ b/src/librustdoc/astsrv.rs
@@ -28,7 +28,7 @@ pub type Ctxt = {
 
 type SrvOwner<T> = fn(srv: Srv) -> T;
 pub type CtxtHandler<T> = fn~(ctxt: Ctxt) -> T;
-type Parser = fn~(Session, ~str) -> @ast::crate;
+type Parser = fn~(Session, +s: ~str) -> @ast::crate;
 
 enum Msg {
     HandleRequest(fn~(Ctxt)),
diff --git a/src/librustdoc/attr_parser.rs b/src/librustdoc/attr_parser.rs
index 5dbf18e8738..0dec45e02c5 100644
--- a/src/librustdoc/attr_parser.rs
+++ b/src/librustdoc/attr_parser.rs
@@ -17,7 +17,7 @@ pub type CrateAttrs = {
 mod test {
     #[legacy_exports];
 
-    fn parse_attributes(source: ~str) -> ~[ast::attribute] {
+    fn parse_attributes(+source: ~str) -> ~[ast::attribute] {
         use syntax::parse;
         use parse::parser;
         use parse::attr::parser_attr;
@@ -33,7 +33,7 @@ mod test {
 }
 
 fn doc_metas(
-    attrs: ~[ast::attribute]
+    +attrs: ~[ast::attribute]
 ) -> ~[@ast::meta_item] {
 
     let doc_attrs = attr::find_attrs_by_name(attrs, ~"doc");
@@ -44,7 +44,7 @@ fn doc_metas(
     return doc_metas;
 }
 
-pub fn parse_crate(attrs: ~[ast::attribute]) -> CrateAttrs {
+pub fn parse_crate(+attrs: ~[ast::attribute]) -> CrateAttrs {
     let link_metas = attr::find_linkage_metas(attrs);
 
     {
@@ -76,7 +76,7 @@ fn should_not_extract_crate_name_if_no_name_value_in_link_attribute() {
     assert attrs.name == None;
 }
 
-pub fn parse_desc(attrs: ~[ast::attribute]) -> Option<~str> {
+pub fn parse_desc(+attrs: ~[ast::attribute]) -> Option<~str> {
     let doc_strs = do doc_metas(attrs).filter_map |meta| {
         attr::get_meta_item_value_str(*meta)
     };
@@ -103,7 +103,7 @@ fn parse_desc_should_parse_simple_doc_attributes() {
     assert attrs == Some(~"basic");
 }
 
-pub fn parse_hidden(attrs: ~[ast::attribute]) -> bool {
+pub fn parse_hidden(+attrs: ~[ast::attribute]) -> bool {
     do doc_metas(attrs).find |meta| {
         match attr::get_meta_item_list(meta) {
           Some(metas) => {
diff --git a/src/librustdoc/attr_pass.rs b/src/librustdoc/attr_pass.rs
index 160836db638..fd68c48a5a7 100644
--- a/src/librustdoc/attr_pass.rs
+++ b/src/librustdoc/attr_pass.rs
@@ -21,7 +21,7 @@ pub fn mk_pass() -> Pass {
 
 fn run(
     srv: astsrv::Srv,
-    doc: doc::Doc
+    +doc: doc::Doc
 ) -> doc::Doc {
     let fold = fold::Fold({
         fold_crate: fold_crate,
@@ -31,12 +31,12 @@ fn run(
         fold_impl: fold_impl,
         .. *fold::default_any_fold(srv)
     });
-    fold.fold_doc(fold, doc)
+    fold.fold_doc(&fold, doc)
 }
 
 fn fold_crate(
-    fold: fold::Fold<astsrv::Srv>,
-    doc: doc::CrateDoc
+    fold: &fold::Fold<astsrv::Srv>,
+    +doc: doc::CrateDoc
 ) -> doc::CrateDoc {
 
     let srv = fold.ctxt;
@@ -65,8 +65,8 @@ fn should_replace_top_module_name_with_crate_name() {
 }
 
 fn fold_item(
-    fold: fold::Fold<astsrv::Srv>,
-    doc: doc::ItemDoc
+    fold: &fold::Fold<astsrv::Srv>,
+    +doc: doc::ItemDoc
 ) -> doc::ItemDoc {
 
     let srv = fold.ctxt;
@@ -90,7 +90,7 @@ fn fold_item(
 fn parse_item_attrs<T:Send>(
     srv: astsrv::Srv,
     id: doc::AstId,
-    +parse_attrs: fn~(~[ast::attribute]) -> T) -> T {
+    +parse_attrs: fn~(+a: ~[ast::attribute]) -> T) -> T {
     do astsrv::exec(srv) |move parse_attrs, ctxt| {
         let attrs = match ctxt.ast_map.get(id) {
           ast_map::node_item(item, _) => item.attrs,
@@ -132,8 +132,8 @@ fn should_extract_fn_attributes() {
 }
 
 fn fold_enum(
-    fold: fold::Fold<astsrv::Srv>,
-    doc: doc::EnumDoc
+    fold: &fold::Fold<astsrv::Srv>,
+    +doc: doc::EnumDoc
 ) -> doc::EnumDoc {
 
     let srv = fold.ctxt;
@@ -183,8 +183,8 @@ fn should_extract_variant_docs() {
 }
 
 fn fold_trait(
-    fold: fold::Fold<astsrv::Srv>,
-    doc: doc::TraitDoc
+    fold: &fold::Fold<astsrv::Srv>,
+    +doc: doc::TraitDoc
 ) -> doc::TraitDoc {
     let srv = fold.ctxt;
     let doc = fold::default_seq_fold_trait(fold, doc);
@@ -259,8 +259,8 @@ fn should_extract_trait_method_docs() {
 
 
 fn fold_impl(
-    fold: fold::Fold<astsrv::Srv>,
-    doc: doc::ImplDoc
+    fold: &fold::Fold<astsrv::Srv>,
+    +doc: doc::ImplDoc
 ) -> doc::ImplDoc {
     let srv = fold.ctxt;
     let doc = fold::default_seq_fold_impl(fold, doc);
diff --git a/src/librustdoc/config.rs b/src/librustdoc/config.rs
index 19f0bf2a9ef..87f601ccc45 100644
--- a/src/librustdoc/config.rs
+++ b/src/librustdoc/config.rs
@@ -1,5 +1,6 @@
 use result::Result;
 use std::getopts;
+use std::cell::Cell;
 
 /// The type of document to output
 pub enum OutputFormat {
@@ -115,13 +116,13 @@ fn mock_program_output(_prog: &str, _args: &[~str]) -> {
     }
 }
 
-fn parse_config(args: ~[~str]) -> Result<Config, ~str> {
+fn parse_config(args: &[~str]) -> Result<Config, ~str> {
     parse_config_(args, run::program_output)
 }
 
 fn parse_config_(
-    args: ~[~str],
-    program_output: ProgramOutput
+    args: &[~str],
+    +program_output: ProgramOutput
 ) -> Result<Config, ~str> {
     let args = vec::tail(args);
     let opts = vec::unzip(opts()).first();
@@ -129,7 +130,7 @@ fn parse_config_(
         result::Ok(matches) => {
             if vec::len(matches.free) == 1u {
                 let input_crate = Path(vec::head(matches.free));
-                config_from_opts(&input_crate, matches, program_output)
+                config_from_opts(&input_crate, matches, move program_output)
             } else if vec::is_empty(matches.free) {
                 result::Err(~"no crates specified")
             } else {
@@ -144,8 +145,8 @@ fn parse_config_(
 
 fn config_from_opts(
     input_crate: &Path,
-    matches: getopts::Matches,
-    program_output: ProgramOutput
+    +matches: getopts::Matches,
+    +program_output: ProgramOutput
 ) -> Result<Config, ~str> {
 
     let config = default_config(input_crate);
@@ -187,10 +188,11 @@ fn config_from_opts(
             }
         }
     };
+    let program_output = Cell(move program_output);
     let result = do result::chain(result) |config| {
         let pandoc_cmd = getopts::opt_maybe_str(matches, opt_pandoc_cmd());
         let pandoc_cmd = maybe_find_pandoc(
-            config, pandoc_cmd, program_output);
+            &config, pandoc_cmd, move program_output.take());
         do result::chain(pandoc_cmd) |pandoc_cmd| {
             result::Ok({
                 pandoc_cmd: pandoc_cmd,
@@ -201,16 +203,16 @@ fn config_from_opts(
     return result;
 }
 
-fn parse_output_format(output_format: ~str) -> Result<OutputFormat, ~str> {
-    match output_format {
+fn parse_output_format(output_format: &str) -> Result<OutputFormat, ~str> {
+    match output_format.to_str() {
       ~"markdown" => result::Ok(Markdown),
       ~"html" => result::Ok(PandocHtml),
       _ => result::Err(fmt!("unknown output format '%s'", output_format))
     }
 }
 
-fn parse_output_style(output_style: ~str) -> Result<OutputStyle, ~str> {
-    match output_style {
+fn parse_output_style(output_style: &str) -> Result<OutputStyle, ~str> {
+    match output_style.to_str() {
       ~"doc-per-crate" => result::Ok(DocPerCrate),
       ~"doc-per-mod" => result::Ok(DocPerMod),
       _ => result::Err(fmt!("unknown output style '%s'", output_style))
@@ -218,9 +220,9 @@ fn parse_output_style(output_style: ~str) -> Result<OutputStyle, ~str> {
 }
 
 fn maybe_find_pandoc(
-    config: Config,
-    maybe_pandoc_cmd: Option<~str>,
-    program_output: ProgramOutput
+    config: &Config,
+    +maybe_pandoc_cmd: Option<~str>,
+    +program_output: ProgramOutput
 ) -> Result<Option<~str>, ~str> {
     if config.output_format != PandocHtml {
         return result::Ok(maybe_pandoc_cmd);
@@ -264,7 +266,7 @@ fn should_find_pandoc() {
             status: 0, out: ~"pandoc 1.8.2.1", err: ~""
         }
     };
-    let result = maybe_find_pandoc(config, None, mock_program_output);
+    let result = maybe_find_pandoc(&config, None, move mock_program_output);
     assert result == result::Ok(Some(~"pandoc"));
 }
 
@@ -281,14 +283,14 @@ fn should_error_with_no_pandoc() {
             status: 1, out: ~"", err: ~""
         }
     };
-    let result = maybe_find_pandoc(config, None, mock_program_output);
+    let result = maybe_find_pandoc(&config, None, move mock_program_output);
     assert result == result::Err(~"couldn't find pandoc");
 }
 
 #[cfg(test)]
 mod test {
     #[legacy_exports];
-    fn parse_config(args: ~[~str]) -> Result<Config, ~str> {
+    fn parse_config(args: &[~str]) -> Result<Config, ~str> {
         parse_config_(args, mock_program_output)
     }
 }
diff --git a/src/librustdoc/desc_to_brief_pass.rs b/src/librustdoc/desc_to_brief_pass.rs
index bdcb3f026ec..0fbdc0f7e5b 100644
--- a/src/librustdoc/desc_to_brief_pass.rs
+++ b/src/librustdoc/desc_to_brief_pass.rs
@@ -16,7 +16,7 @@ pub fn mk_pass() -> Pass {
 
 fn run(
     _srv: astsrv::Srv,
-    doc: doc::Doc
+    +doc: doc::Doc
 ) -> doc::Doc {
     let fold = fold::Fold({
         fold_item: fold_item,
@@ -24,10 +24,10 @@ fn run(
         fold_impl: fold_impl,
         .. *fold::default_any_fold(())
     });
-    fold.fold_doc(fold, doc)
+    fold.fold_doc(&fold, doc)
 }
 
-fn fold_item(fold: fold::Fold<()>, doc: doc::ItemDoc) -> doc::ItemDoc {
+fn fold_item(fold: &fold::Fold<()>, +doc: doc::ItemDoc) -> doc::ItemDoc {
     let doc = fold::default_seq_fold_item(fold, doc);
 
     {
@@ -36,7 +36,7 @@ fn fold_item(fold: fold::Fold<()>, doc: doc::ItemDoc) -> doc::ItemDoc {
     }
 }
 
-fn fold_trait(fold: fold::Fold<()>, doc: doc::TraitDoc) -> doc::TraitDoc {
+fn fold_trait(fold: &fold::Fold<()>, +doc: doc::TraitDoc) -> doc::TraitDoc {
     let doc =fold::default_seq_fold_trait(fold, doc);
 
     {
@@ -48,7 +48,7 @@ fn fold_trait(fold: fold::Fold<()>, doc: doc::TraitDoc) -> doc::TraitDoc {
     }
 }
 
-fn fold_impl(fold: fold::Fold<()>, doc: doc::ImplDoc) -> doc::ImplDoc {
+fn fold_impl(fold: &fold::Fold<()>, +doc: doc::ImplDoc) -> doc::ImplDoc {
     let doc =fold::default_seq_fold_impl(fold, doc);
 
     {
diff --git a/src/librustdoc/extract.rs b/src/librustdoc/extract.rs
index 323c321d0e1..9111c6242c9 100644
--- a/src/librustdoc/extract.rs
+++ b/src/librustdoc/extract.rs
@@ -25,7 +25,7 @@ pub fn interner() -> @syntax::parse::token::ident_interner {
 
 pub fn from_srv(
     srv: astsrv::Srv,
-    default_name: ~str
+    +default_name: ~str
 ) -> doc::Doc {
 
     //! Use the AST service to create a document tree
@@ -37,7 +37,7 @@ pub fn from_srv(
 
 pub fn extract(
     crate: @ast::crate,
-    default_name: ~str
+    +default_name: ~str
 ) -> doc::Doc {
     doc::Doc_({
         pages: ~[
@@ -50,13 +50,13 @@ pub fn extract(
 
 fn top_moddoc_from_crate(
     crate: @ast::crate,
-    default_name: ~str
+    +default_name: ~str
 ) -> doc::ModDoc {
     moddoc_from_mod(mk_itemdoc(ast::crate_node_id, default_name),
                     crate.node.module)
 }
 
-fn mk_itemdoc(id: ast::node_id, name: ~str) -> doc::ItemDoc {
+fn mk_itemdoc(id: ast::node_id, +name: ~str) -> doc::ItemDoc {
     {
         id: id,
         name: name,
@@ -69,7 +69,7 @@ fn mk_itemdoc(id: ast::node_id, name: ~str) -> doc::ItemDoc {
 }
 
 fn moddoc_from_mod(
-    itemdoc: doc::ItemDoc,
+    +itemdoc: doc::ItemDoc,
     module_: ast::_mod
 ) -> doc::ModDoc {
     doc::ModDoc_({
@@ -130,7 +130,7 @@ fn moddoc_from_mod(
 }
 
 fn nmoddoc_from_mod(
-    itemdoc: doc::ItemDoc,
+    +itemdoc: doc::ItemDoc,
     module_: ast::foreign_mod
 ) -> doc::NmodDoc {
     let mut fns = ~[];
@@ -150,14 +150,14 @@ fn nmoddoc_from_mod(
     }
 }
 
-fn fndoc_from_fn(itemdoc: doc::ItemDoc) -> doc::FnDoc {
+fn fndoc_from_fn(+itemdoc: doc::ItemDoc) -> doc::FnDoc {
     {
         item: itemdoc,
         sig: None
     }
 }
 
-fn constdoc_from_const(itemdoc: doc::ItemDoc) -> doc::ConstDoc {
+fn constdoc_from_const(+itemdoc: doc::ItemDoc) -> doc::ConstDoc {
     {
         item: itemdoc,
         sig: None
@@ -172,8 +172,8 @@ fn should_extract_const_name_and_id() {
 }
 
 fn enumdoc_from_enum(
-    itemdoc: doc::ItemDoc,
-    variants: ~[ast::variant]
+    +itemdoc: doc::ItemDoc,
+    +variants: ~[ast::variant]
 ) -> doc::EnumDoc {
     {
         item: itemdoc,
@@ -182,7 +182,7 @@ fn enumdoc_from_enum(
 }
 
 fn variantdocs_from_variants(
-    variants: ~[ast::variant]
+    +variants: ~[ast::variant]
 ) -> ~[doc::VariantDoc] {
     vec::map(variants, variantdoc_from_variant)
 }
@@ -210,8 +210,8 @@ fn should_extract_enum_variants() {
 }
 
 fn traitdoc_from_trait(
-    itemdoc: doc::ItemDoc,
-    methods: ~[ast::trait_method]
+    +itemdoc: doc::ItemDoc,
+    +methods: ~[ast::trait_method]
 ) -> doc::TraitDoc {
     {
         item: itemdoc,
@@ -255,7 +255,7 @@ fn should_extract_trait_methods() {
 }
 
 fn impldoc_from_impl(
-    itemdoc: doc::ItemDoc,
+    +itemdoc: doc::ItemDoc,
     methods: ~[@ast::method]
 ) -> doc::ImplDoc {
     {
@@ -282,7 +282,7 @@ fn should_extract_impl_methods() {
 }
 
 fn tydoc_from_ty(
-    itemdoc: doc::ItemDoc
+    +itemdoc: doc::ItemDoc
 ) -> doc::TyDoc {
     {
         item: itemdoc,
@@ -297,7 +297,7 @@ fn should_extract_tys() {
 }
 
 fn structdoc_from_struct(
-    itemdoc: doc::ItemDoc,
+    +itemdoc: doc::ItemDoc,
     struct_def: @ast::struct_def
 ) -> doc::StructDoc {
     {
@@ -328,7 +328,7 @@ fn should_extract_struct_fields() {
 mod test {
     #[legacy_exports];
 
-    fn mk_doc(source: ~str) -> doc::Doc {
+    fn mk_doc(+source: ~str) -> doc::Doc {
         let ast = parse::from_str(source);
         extract(ast, ~"")
     }
diff --git a/src/librustdoc/fold.rs b/src/librustdoc/fold.rs
index f30baacb1f4..7722379c330 100644
--- a/src/librustdoc/fold.rs
+++ b/src/librustdoc/fold.rs
@@ -1,18 +1,18 @@
 pub enum Fold<T> = Fold_<T>;
 
-type FoldDoc<T> = fn~(fold: Fold<T>, doc: doc::Doc) -> doc::Doc;
-type FoldCrate<T> = fn~(fold: Fold<T>, doc: doc::CrateDoc) -> doc::CrateDoc;
-type FoldItem<T> = fn~(fold: Fold<T>, doc: doc::ItemDoc) -> doc::ItemDoc;
-type FoldMod<T> = fn~(fold: Fold<T>, doc: doc::ModDoc) -> doc::ModDoc;
-type FoldNmod<T> = fn~(fold: Fold<T>, doc: doc::NmodDoc) -> doc::NmodDoc;
-type FoldFn<T> = fn~(fold: Fold<T>, doc: doc::FnDoc) -> doc::FnDoc;
-type FoldConst<T> = fn~(fold: Fold<T>, doc: doc::ConstDoc) -> doc::ConstDoc;
-type FoldEnum<T> = fn~(fold: Fold<T>, doc: doc::EnumDoc) -> doc::EnumDoc;
-type FoldTrait<T> = fn~(fold: Fold<T>, doc: doc::TraitDoc) -> doc::TraitDoc;
-type FoldImpl<T> = fn~(fold: Fold<T>, doc: doc::ImplDoc) -> doc::ImplDoc;
-type FoldType<T> = fn~(fold: Fold<T>, doc: doc::TyDoc) -> doc::TyDoc;
-type FoldStruct<T> = fn~(fold: Fold<T>,
-                         doc: doc::StructDoc) -> doc::StructDoc;
+type FoldDoc<T> = fn~(fold: &Fold<T>, +doc: doc::Doc) -> doc::Doc;
+type FoldCrate<T> = fn~(fold: &Fold<T>, +doc: doc::CrateDoc) -> doc::CrateDoc;
+type FoldItem<T> = fn~(fold: &Fold<T>, +doc: doc::ItemDoc) -> doc::ItemDoc;
+type FoldMod<T> = fn~(fold: &Fold<T>, +doc: doc::ModDoc) -> doc::ModDoc;
+type FoldNmod<T> = fn~(fold: &Fold<T>, +doc: doc::NmodDoc) -> doc::NmodDoc;
+type FoldFn<T> = fn~(fold: &Fold<T>, +doc: doc::FnDoc) -> doc::FnDoc;
+type FoldConst<T> = fn~(fold: &Fold<T>, +doc: doc::ConstDoc) -> doc::ConstDoc;
+type FoldEnum<T> = fn~(fold: &Fold<T>, +doc: doc::EnumDoc) -> doc::EnumDoc;
+type FoldTrait<T> = fn~(fold: &Fold<T>, +doc: doc::TraitDoc) -> doc::TraitDoc;
+type FoldImpl<T> = fn~(fold: &Fold<T>, +doc: doc::ImplDoc) -> doc::ImplDoc;
+type FoldType<T> = fn~(fold: &Fold<T>, +doc: doc::TyDoc) -> doc::TyDoc;
+type FoldStruct<T> = fn~(fold: &Fold<T>,
+                         +doc: doc::StructDoc) -> doc::StructDoc;
 
 type Fold_<T> = {
     ctxt: T,
@@ -119,7 +119,7 @@ pub fn default_par_fold<T:Send Copy>(ctxt: T) -> Fold<T> {
     )
 }
 
-pub fn default_seq_fold_doc<T>(fold: Fold<T>, doc: doc::Doc) -> doc::Doc {
+pub fn default_seq_fold_doc<T>(fold: &Fold<T>, +doc: doc::Doc) -> doc::Doc {
     doc::Doc_({
         pages: do vec::map(doc.pages) |page| {
             match *page {
@@ -136,8 +136,8 @@ pub fn default_seq_fold_doc<T>(fold: Fold<T>, doc: doc::Doc) -> doc::Doc {
 }
 
 pub fn default_seq_fold_crate<T>(
-    fold: Fold<T>,
-    doc: doc::CrateDoc
+    fold: &Fold<T>,
+    +doc: doc::CrateDoc
 ) -> doc::CrateDoc {
     {
         topmod: fold.fold_mod(fold, doc.topmod)
@@ -145,28 +145,29 @@ pub fn default_seq_fold_crate<T>(
 }
 
 pub fn default_seq_fold_item<T>(
-    _fold: Fold<T>,
-    doc: doc::ItemDoc
+    _fold: &Fold<T>,
+    +doc: doc::ItemDoc
 ) -> doc::ItemDoc {
     doc
 }
 
 pub fn default_any_fold_mod<T:Send Copy>(
-    fold: Fold<T>,
-    doc: doc::ModDoc
+    fold: &Fold<T>,
+    +doc: doc::ModDoc
 ) -> doc::ModDoc {
+    let fold_copy = copy *fold;
     doc::ModDoc_({
         item: fold.fold_item(fold, doc.item),
-        items: par::map(doc.items, |ItemTag, copy fold| {
-            fold_ItemTag(fold, *ItemTag)
+        items: par::map(doc.items, |ItemTag, move fold_copy| {
+            fold_ItemTag(&fold_copy, *ItemTag)
         }),
         .. *doc
     })
 }
 
 pub fn default_seq_fold_mod<T>(
-    fold: Fold<T>,
-    doc: doc::ModDoc
+    fold: &Fold<T>,
+    +doc: doc::ModDoc
 ) -> doc::ModDoc {
     doc::ModDoc_({
         item: fold.fold_item(fold, doc.item),
@@ -178,34 +179,36 @@ pub fn default_seq_fold_mod<T>(
 }
 
 pub fn default_par_fold_mod<T:Send Copy>(
-    fold: Fold<T>,
-    doc: doc::ModDoc
+    fold: &Fold<T>,
+    +doc: doc::ModDoc
 ) -> doc::ModDoc {
+    let fold_copy = copy *fold;
     doc::ModDoc_({
         item: fold.fold_item(fold, doc.item),
-        items: par::map(doc.items, |ItemTag, copy fold| {
-            fold_ItemTag(fold, *ItemTag)
+        items: par::map(doc.items, |ItemTag, move fold_copy| {
+            fold_ItemTag(&fold_copy, *ItemTag)
         }),
         .. *doc
     })
 }
 
 pub fn default_any_fold_nmod<T:Send Copy>(
-    fold: Fold<T>,
-    doc: doc::NmodDoc
+    fold: &Fold<T>,
+    +doc: doc::NmodDoc
 ) -> doc::NmodDoc {
+    let fold_copy = copy *fold;
     {
         item: fold.fold_item(fold, doc.item),
-        fns: par::map(doc.fns, |FnDoc, copy fold| {
-            fold.fold_fn(fold, *FnDoc)
+        fns: par::map(doc.fns, |FnDoc, move fold_copy| {
+            fold_copy.fold_fn(&fold_copy, *FnDoc)
         }),
         .. doc
     }
 }
 
 pub fn default_seq_fold_nmod<T>(
-    fold: Fold<T>,
-    doc: doc::NmodDoc
+    fold: &Fold<T>,
+    +doc: doc::NmodDoc
 ) -> doc::NmodDoc {
     {
         item: fold.fold_item(fold, doc.item),
@@ -217,19 +220,20 @@ pub fn default_seq_fold_nmod<T>(
 }
 
 pub fn default_par_fold_nmod<T:Send Copy>(
-    fold: Fold<T>,
-    doc: doc::NmodDoc
+    fold: &Fold<T>,
+    +doc: doc::NmodDoc
 ) -> doc::NmodDoc {
+    let fold_copy = copy *fold;
     {
         item: fold.fold_item(fold, doc.item),
-        fns: par::map(doc.fns, |FnDoc, copy fold| {
-            fold.fold_fn(fold, *FnDoc)
+        fns: par::map(doc.fns, |FnDoc, move fold_copy| {
+            fold_copy.fold_fn(&fold_copy, *FnDoc)
         }),
         .. doc
     }
 }
 
-pub fn fold_ItemTag<T>(fold: Fold<T>, doc: doc::ItemTag) -> doc::ItemTag {
+pub fn fold_ItemTag<T>(fold: &Fold<T>, +doc: doc::ItemTag) -> doc::ItemTag {
     match doc {
       doc::ModTag(ModDoc) => {
         doc::ModTag(fold.fold_mod(fold, ModDoc))
@@ -262,8 +266,8 @@ pub fn fold_ItemTag<T>(fold: Fold<T>, doc: doc::ItemTag) -> doc::ItemTag {
 }
 
 pub fn default_seq_fold_fn<T>(
-    fold: Fold<T>,
-    doc: doc::FnDoc
+    fold: &Fold<T>,
+    +doc: doc::FnDoc
 ) -> doc::FnDoc {
     {
         item: fold.fold_item(fold, doc.item),
@@ -272,8 +276,8 @@ pub fn default_seq_fold_fn<T>(
 }
 
 pub fn default_seq_fold_const<T>(
-    fold: Fold<T>,
-    doc: doc::ConstDoc
+    fold: &Fold<T>,
+    +doc: doc::ConstDoc
 ) -> doc::ConstDoc {
     {
         item: fold.fold_item(fold, doc.item),
@@ -282,8 +286,8 @@ pub fn default_seq_fold_const<T>(
 }
 
 pub fn default_seq_fold_enum<T>(
-    fold: Fold<T>,
-    doc: doc::EnumDoc
+    fold: &Fold<T>,
+    +doc: doc::EnumDoc
 ) -> doc::EnumDoc {
     {
         item: fold.fold_item(fold, doc.item),
@@ -292,8 +296,8 @@ pub fn default_seq_fold_enum<T>(
 }
 
 pub fn default_seq_fold_trait<T>(
-    fold: Fold<T>,
-    doc: doc::TraitDoc
+    fold: &Fold<T>,
+    +doc: doc::TraitDoc
 ) -> doc::TraitDoc {
     {
         item: fold.fold_item(fold, doc.item),
@@ -302,8 +306,8 @@ pub fn default_seq_fold_trait<T>(
 }
 
 pub fn default_seq_fold_impl<T>(
-    fold: Fold<T>,
-    doc: doc::ImplDoc
+    fold: &Fold<T>,
+    +doc: doc::ImplDoc
 ) -> doc::ImplDoc {
     {
         item: fold.fold_item(fold, doc.item),
@@ -312,8 +316,8 @@ pub fn default_seq_fold_impl<T>(
 }
 
 pub fn default_seq_fold_type<T>(
-    fold: Fold<T>,
-    doc: doc::TyDoc
+    fold: &Fold<T>,
+    +doc: doc::TyDoc
 ) -> doc::TyDoc {
     {
         item: fold.fold_item(fold, doc.item),
@@ -322,8 +326,8 @@ pub fn default_seq_fold_type<T>(
 }
 
 pub fn default_seq_fold_struct<T>(
-    fold: Fold<T>,
-    doc: doc::StructDoc
+    fold: &Fold<T>,
+    +doc: doc::StructDoc
 ) -> doc::StructDoc {
     {
         item: fold.fold_item(fold, doc.item),
@@ -337,7 +341,7 @@ fn default_fold_should_produce_same_doc() {
     let ast = parse::from_str(source);
     let doc = extract::extract(ast, ~"");
     let fld = default_seq_fold(());
-    let folded = fld.fold_doc(fld, doc);
+    let folded = fld.fold_doc(&fld, doc);
     assert doc == folded;
 }
 
@@ -347,7 +351,7 @@ fn default_fold_should_produce_same_consts() {
     let ast = parse::from_str(source);
     let doc = extract::extract(ast, ~"");
     let fld = default_seq_fold(());
-    let folded = fld.fold_doc(fld, doc);
+    let folded = fld.fold_doc(&fld, doc);
     assert doc == folded;
 }
 
@@ -357,7 +361,7 @@ fn default_fold_should_produce_same_enums() {
     let ast = parse::from_str(source);
     let doc = extract::extract(ast, ~"");
     let fld = default_seq_fold(());
-    let folded = fld.fold_doc(fld, doc);
+    let folded = fld.fold_doc(&fld, doc);
     assert doc == folded;
 }
 
@@ -367,6 +371,6 @@ fn default_parallel_fold_should_produce_same_doc() {
     let ast = parse::from_str(source);
     let doc = extract::extract(ast, ~"");
     let fld = default_par_fold(());
-    let folded = fld.fold_doc(fld, doc);
+    let folded = fld.fold_doc(&fld, doc);
     assert doc == folded;
 }
diff --git a/src/librustdoc/markdown_index_pass.rs b/src/librustdoc/markdown_index_pass.rs
index d04986ea4de..916393c0ff6 100644
--- a/src/librustdoc/markdown_index_pass.rs
+++ b/src/librustdoc/markdown_index_pass.rs
@@ -2,10 +2,10 @@
 
 use doc::ItemUtils;
 
-pub fn mk_pass(config: config::Config) -> Pass {
+pub fn mk_pass(+config: config::Config) -> Pass {
     {
         name: ~"markdown_index",
-        f: fn~(srv: astsrv::Srv, doc: doc::Doc) -> doc::Doc {
+        f: fn~(srv: astsrv::Srv, +doc: doc::Doc) -> doc::Doc {
             run(srv, doc, config)
         }
     }
@@ -13,20 +13,20 @@ pub fn mk_pass(config: config::Config) -> Pass {
 
 fn run(
     _srv: astsrv::Srv,
-    doc: doc::Doc,
-    config: config::Config
+    +doc: doc::Doc,
+    +config: config::Config
 ) -> doc::Doc {
     let fold = fold::Fold({
         fold_mod: fold_mod,
         fold_nmod: fold_nmod,
         .. *fold::default_any_fold(config)
     });
-    fold.fold_doc(fold, doc)
+    fold.fold_doc(&fold, doc)
 }
 
 fn fold_mod(
-    fold: fold::Fold<config::Config>,
-    doc: doc::ModDoc
+    fold: &fold::Fold<config::Config>,
+    +doc: doc::ModDoc
 ) -> doc::ModDoc {
 
     let doc = fold::default_any_fold_mod(fold, doc);
@@ -38,8 +38,8 @@ fn fold_mod(
 }
 
 fn fold_nmod(
-    fold: fold::Fold<config::Config>,
-    doc: doc::NmodDoc
+    fold: &fold::Fold<config::Config>,
+    +doc: doc::NmodDoc
 ) -> doc::NmodDoc {
 
     let doc = fold::default_any_fold_nmod(fold, doc);
diff --git a/src/librustdoc/markdown_pass.rs b/src/librustdoc/markdown_pass.rs
index 71a38b53258..845bb7f52ce 100644
--- a/src/librustdoc/markdown_pass.rs
+++ b/src/librustdoc/markdown_pass.rs
@@ -7,7 +7,7 @@ use markdown_writer::WriterFactory;
 
 pub fn mk_pass(+writer_factory: WriterFactory) -> Pass {
     let f = fn~(move writer_factory,
-                srv: astsrv::Srv, doc: doc::Doc) -> doc::Doc {
+                srv: astsrv::Srv, +doc: doc::Doc) -> doc::Doc {
         run(srv, doc, copy writer_factory)
     };
 
diff --git a/src/librustdoc/page_pass.rs b/src/librustdoc/page_pass.rs
index 3e690c83463..67323a3d4c3 100644
--- a/src/librustdoc/page_pass.rs
+++ b/src/librustdoc/page_pass.rs
@@ -11,7 +11,7 @@ use syntax::ast;
 pub fn mk_pass(output_style: config::OutputStyle) -> Pass {
     {
         name: ~"page",
-        f: fn~(srv: astsrv::Srv, doc: doc::Doc) -> doc::Doc {
+        f: fn~(srv: astsrv::Srv, +doc: doc::Doc) -> doc::Doc {
             run(srv, doc, output_style)
         }
     }
@@ -19,7 +19,7 @@ pub fn mk_pass(output_style: config::OutputStyle) -> Pass {
 
 fn run(
     _srv: astsrv::Srv,
-    doc: doc::Doc,
+    +doc: doc::Doc,
     output_style: config::OutputStyle
 ) -> doc::Doc {
 
@@ -61,14 +61,14 @@ fn find_pages(doc: doc::Doc, page_chan: PageChan) {
         fold_nmod: fold_nmod,
         .. *fold::default_any_fold(page_chan)
     });
-    fold.fold_doc(fold, doc);
+    fold.fold_doc(&fold, doc);
 
     comm::send(page_chan, None);
 }
 
 fn fold_crate(
-    fold: fold::Fold<PageChan>,
-    doc: doc::CrateDoc
+    fold: &fold::Fold<PageChan>,
+    +doc: doc::CrateDoc
 ) -> doc::CrateDoc {
 
     let doc = fold::default_seq_fold_crate(fold, doc);
@@ -84,8 +84,8 @@ fn fold_crate(
 }
 
 fn fold_mod(
-    fold: fold::Fold<PageChan>,
-    doc: doc::ModDoc
+    fold: &fold::Fold<PageChan>,
+    +doc: doc::ModDoc
 ) -> doc::ModDoc {
 
     let doc = fold::default_any_fold_mod(fold, doc);
@@ -114,8 +114,8 @@ fn strip_mod(doc: doc::ModDoc) -> doc::ModDoc {
 }
 
 fn fold_nmod(
-    fold: fold::Fold<PageChan>,
-    doc: doc::NmodDoc
+    fold: &fold::Fold<PageChan>,
+    +doc: doc::NmodDoc
 ) -> doc::NmodDoc {
     let doc = fold::default_seq_fold_nmod(fold, doc);
     let page = doc::ItemPage(doc::NmodTag(doc));
diff --git a/src/librustdoc/parse.rs b/src/librustdoc/parse.rs
index 0f1d82b3737..768f445de3b 100644
--- a/src/librustdoc/parse.rs
+++ b/src/librustdoc/parse.rs
@@ -13,7 +13,7 @@ pub fn from_file(file: &Path) -> @ast::crate {
         file, ~[], parse::new_parse_sess(None))
 }
 
-pub fn from_str(source: ~str) -> @ast::crate {
+pub fn from_str(+source: ~str) -> @ast::crate {
     parse::parse_crate_from_source_str(
         ~"-", @source, ~[], parse::new_parse_sess(None))
 }
@@ -23,11 +23,11 @@ pub fn from_file_sess(sess: session::Session, file: &Path) -> @ast::crate {
         file, cfg(sess, file_input(*file)), sess.parse_sess)
 }
 
-pub fn from_str_sess(sess: session::Session, source: ~str) -> @ast::crate {
+pub fn from_str_sess(sess: session::Session, +source: ~str) -> @ast::crate {
     parse::parse_crate_from_source_str(
         ~"-", @source, cfg(sess, str_input(source)), sess.parse_sess)
 }
 
-fn cfg(sess: session::Session, input: driver::input) -> ast::crate_cfg {
+fn cfg(sess: session::Session, +input: driver::input) -> ast::crate_cfg {
     driver::default_configuration(sess, ~"rustdoc", input)
 }
diff --git a/src/librustdoc/pass.rs b/src/librustdoc/pass.rs
index 0ceccda209d..68ea4774fb5 100644
--- a/src/librustdoc/pass.rs
+++ b/src/librustdoc/pass.rs
@@ -1,13 +1,13 @@
 /// A single operation on the document model
 pub type Pass = {
     name: ~str,
-    f: fn~(srv: astsrv::Srv, doc: doc::Doc) -> doc::Doc
+    f: fn~(srv: astsrv::Srv, +doc: doc::Doc) -> doc::Doc
 };
 
 pub fn run_passes(
     srv: astsrv::Srv,
-    doc: doc::Doc,
-    passes: ~[Pass]
+    +doc: doc::Doc,
+    +passes: ~[Pass]
 ) -> doc::Doc {
     let mut passno = 0;
     do vec::foldl(doc, passes) |doc, pass| {
@@ -24,7 +24,7 @@ pub fn run_passes(
 fn test_run_passes() {
     fn pass1(
         _srv: astsrv::Srv,
-        doc: doc::Doc
+        +doc: doc::Doc
     ) -> doc::Doc {
         doc::Doc_({
             pages: ~[
@@ -43,7 +43,7 @@ fn test_run_passes() {
     }
     fn pass2(
         _srv: astsrv::Srv,
-        doc: doc::Doc
+        +doc: doc::Doc
     ) -> doc::Doc {
         doc::Doc_({
             pages: ~[
diff --git a/src/librustdoc/path_pass.rs b/src/librustdoc/path_pass.rs
index 11fba49026e..9b76efc756e 100644
--- a/src/librustdoc/path_pass.rs
+++ b/src/librustdoc/path_pass.rs
@@ -16,7 +16,7 @@ type Ctxt = {
 };
 
 #[allow(non_implicitly_copyable_typarams)]
-fn run(srv: astsrv::Srv, doc: doc::Doc) -> doc::Doc {
+fn run(srv: astsrv::Srv, +doc: doc::Doc) -> doc::Doc {
     let ctxt = {
         srv: srv,
         mut path: ~[]
@@ -27,10 +27,10 @@ fn run(srv: astsrv::Srv, doc: doc::Doc) -> doc::Doc {
         fold_nmod: fold_nmod,
         .. *fold::default_any_fold(ctxt)
     });
-    fold.fold_doc(fold, doc)
+    fold.fold_doc(&fold, doc)
 }
 
-fn fold_item(fold: fold::Fold<Ctxt>, doc: doc::ItemDoc) -> doc::ItemDoc {
+fn fold_item(fold: &fold::Fold<Ctxt>, +doc: doc::ItemDoc) -> doc::ItemDoc {
     {
         path: fold.ctxt.path,
         .. doc
@@ -38,7 +38,7 @@ fn fold_item(fold: fold::Fold<Ctxt>, doc: doc::ItemDoc) -> doc::ItemDoc {
 }
 
 #[allow(non_implicitly_copyable_typarams)]
-fn fold_mod(fold: fold::Fold<Ctxt>, doc: doc::ModDoc) -> doc::ModDoc {
+fn fold_mod(fold: &fold::Fold<Ctxt>, +doc: doc::ModDoc) -> doc::ModDoc {
     let is_topmod = doc.id() == ast::crate_node_id;
 
     if !is_topmod { fold.ctxt.path.push(doc.name()); }
@@ -51,7 +51,7 @@ fn fold_mod(fold: fold::Fold<Ctxt>, doc: doc::ModDoc) -> doc::ModDoc {
     })
 }
 
-fn fold_nmod(fold: fold::Fold<Ctxt>, doc: doc::NmodDoc) -> doc::NmodDoc {
+fn fold_nmod(fold: &fold::Fold<Ctxt>, +doc: doc::NmodDoc) -> doc::NmodDoc {
     fold.ctxt.path.push(doc.name());
     let doc = fold::default_seq_fold_nmod(fold, doc);
     fold.ctxt.path.pop();
diff --git a/src/librustdoc/prune_hidden_pass.rs b/src/librustdoc/prune_hidden_pass.rs
index 5a62efa6720..c86dbcba736 100644
--- a/src/librustdoc/prune_hidden_pass.rs
+++ b/src/librustdoc/prune_hidden_pass.rs
@@ -10,17 +10,17 @@ pub fn mk_pass() -> Pass {
     }
 }
 
-fn run(srv: astsrv::Srv, doc: doc::Doc) -> doc::Doc {
+fn run(srv: astsrv::Srv, +doc: doc::Doc) -> doc::Doc {
     let fold = fold::Fold({
         fold_mod: fold_mod,
         .. *fold::default_any_fold(srv)
     });
-    fold.fold_doc(fold, doc)
+    fold.fold_doc(&fold, doc)
 }
 
 fn fold_mod(
-    fold: fold::Fold<astsrv::Srv>,
-    doc: doc::ModDoc
+    fold: &fold::Fold<astsrv::Srv>,
+    +doc: doc::ModDoc
 ) -> doc::ModDoc {
     let doc = fold::default_any_fold_mod(fold, doc);
 
diff --git a/src/librustdoc/prune_private_pass.rs b/src/librustdoc/prune_private_pass.rs
index 0f97dc08137..ee50dfd360b 100644
--- a/src/librustdoc/prune_private_pass.rs
+++ b/src/librustdoc/prune_private_pass.rs
@@ -11,17 +11,17 @@ fn mk_pass() -> Pass {
     }
 }
 
-fn run(srv: astsrv::Srv, doc: doc::Doc) -> doc::Doc {
+fn run(srv: astsrv::Srv, +doc: doc::Doc) -> doc::Doc {
     let fold = fold::Fold({
         fold_mod: fold_mod,
         .. *fold::default_any_fold(srv)
     });
-    fold.fold_doc(fold, doc)
+    fold.fold_doc(&fold, doc)
 }
 
 fn fold_mod(
-    fold: fold::Fold<astsrv::Srv>,
-    doc: doc::ModDoc
+    fold: &fold::Fold<astsrv::Srv>,
+    +doc: doc::ModDoc
 ) -> doc::ModDoc {
     let doc = fold::default_any_fold_mod(fold, doc);
 
diff --git a/src/librustdoc/sectionalize_pass.rs b/src/librustdoc/sectionalize_pass.rs
index a530b4b5c8f..864522f419a 100644
--- a/src/librustdoc/sectionalize_pass.rs
+++ b/src/librustdoc/sectionalize_pass.rs
@@ -9,17 +9,17 @@ pub fn mk_pass() -> Pass {
     }
 }
 
-fn run(_srv: astsrv::Srv, doc: doc::Doc) -> doc::Doc {
+fn run(_srv: astsrv::Srv, +doc: doc::Doc) -> doc::Doc {
     let fold = fold::Fold({
         fold_item: fold_item,
         fold_trait: fold_trait,
         fold_impl: fold_impl,
         .. *fold::default_any_fold(())
     });
-    fold.fold_doc(fold, doc)
+    fold.fold_doc(&fold, doc)
 }
 
-fn fold_item(fold: fold::Fold<()>, doc: doc::ItemDoc) -> doc::ItemDoc {
+fn fold_item(fold: &fold::Fold<()>, +doc: doc::ItemDoc) -> doc::ItemDoc {
     let doc = fold::default_seq_fold_item(fold, doc);
     let (desc, sections) = sectionalize(doc.desc);
 
@@ -30,7 +30,7 @@ fn fold_item(fold: fold::Fold<()>, doc: doc::ItemDoc) -> doc::ItemDoc {
     }
 }
 
-fn fold_trait(fold: fold::Fold<()>, doc: doc::TraitDoc) -> doc::TraitDoc {
+fn fold_trait(fold: &fold::Fold<()>, +doc: doc::TraitDoc) -> doc::TraitDoc {
     let doc = fold::default_seq_fold_trait(fold, doc);
 
     {
@@ -47,7 +47,7 @@ fn fold_trait(fold: fold::Fold<()>, doc: doc::TraitDoc) -> doc::TraitDoc {
     }
 }
 
-fn fold_impl(fold: fold::Fold<()>, doc: doc::ImplDoc) -> doc::ImplDoc {
+fn fold_impl(fold: &fold::Fold<()>, +doc: doc::ImplDoc) -> doc::ImplDoc {
     let doc = fold::default_seq_fold_impl(fold, doc);
 
     {
diff --git a/src/librustdoc/sort_pass.rs b/src/librustdoc/sort_pass.rs
index ea86f4e10c8..53607ba46d0 100644
--- a/src/librustdoc/sort_pass.rs
+++ b/src/librustdoc/sort_pass.rs
@@ -8,7 +8,7 @@ pub type ItemLtEq = pure fn~(v1: &doc::ItemTag, v2:  &doc::ItemTag) -> bool;
 pub fn mk_pass(name: ~str, +lteq: ItemLtEq) -> Pass {
     {
         name: name,
-        f: fn~(move lteq, srv: astsrv::Srv, doc: doc::Doc) -> doc::Doc {
+        f: fn~(move lteq, srv: astsrv::Srv, +doc: doc::Doc) -> doc::Doc {
             run(srv, doc, lteq)
         }
     }
@@ -17,20 +17,20 @@ pub fn mk_pass(name: ~str, +lteq: ItemLtEq) -> Pass {
 #[allow(non_implicitly_copyable_typarams)]
 fn run(
     _srv: astsrv::Srv,
-    doc: doc::Doc,
+    +doc: doc::Doc,
     lteq: ItemLtEq
 ) -> doc::Doc {
     let fold = fold::Fold({
         fold_mod: fold_mod,
         .. *fold::default_any_fold(lteq)
     });
-    fold.fold_doc(fold, doc)
+    fold.fold_doc(&fold, doc)
 }
 
 #[allow(non_implicitly_copyable_typarams)]
 fn fold_mod(
-    fold: fold::Fold<ItemLtEq>,
-    doc: doc::ModDoc
+    fold: &fold::Fold<ItemLtEq>,
+    +doc: doc::ModDoc
 ) -> doc::ModDoc {
     let doc = fold::default_any_fold_mod(fold, doc);
     doc::ModDoc_({
diff --git a/src/librustdoc/text_pass.rs b/src/librustdoc/text_pass.rs
index 9b2eb924ae4..79466c4ec1e 100644
--- a/src/librustdoc/text_pass.rs
+++ b/src/librustdoc/text_pass.rs
@@ -5,7 +5,7 @@ use doc::ItemUtils;
 pub fn mk_pass(name: ~str, +op: fn~(~str) -> ~str) -> Pass {
     {
         name: name,
-        f: fn~(move op, srv: astsrv::Srv, doc: doc::Doc) -> doc::Doc {
+        f: fn~(move op, srv: astsrv::Srv, +doc: doc::Doc) -> doc::Doc {
             run(srv, doc, op)
         }
     }
@@ -16,7 +16,7 @@ type Op = fn~(~str) -> ~str;
 #[allow(non_implicitly_copyable_typarams)]
 fn run(
     _srv: astsrv::Srv,
-    doc: doc::Doc,
+    +doc: doc::Doc,
     op: Op
 ) -> doc::Doc {
     let fold = fold::Fold({
@@ -26,14 +26,14 @@ fn run(
         fold_impl: fold_impl,
         .. *fold::default_any_fold(op)
     });
-    fold.fold_doc(fold, doc)
+    fold.fold_doc(&fold, doc)
 }
 
 fn maybe_apply_op(op: Op, s: Option<~str>) -> Option<~str> {
     s.map(|s| op(*s) )
 }
 
-fn fold_item(fold: fold::Fold<Op>, doc: doc::ItemDoc) -> doc::ItemDoc {
+fn fold_item(fold: &fold::Fold<Op>, +doc: doc::ItemDoc) -> doc::ItemDoc {
     let doc = fold::default_seq_fold_item(fold, doc);
 
     {
@@ -51,13 +51,14 @@ fn apply_to_sections(op: Op, sections: ~[doc::Section]) -> ~[doc::Section] {
     })
 }
 
-fn fold_enum(fold: fold::Fold<Op>, doc: doc::EnumDoc) -> doc::EnumDoc {
+fn fold_enum(fold: &fold::Fold<Op>, +doc: doc::EnumDoc) -> doc::EnumDoc {
     let doc = fold::default_seq_fold_enum(fold, doc);
+    let fold_copy = copy *fold;
 
     {
-        variants: do par::map(doc.variants) |variant, copy fold| {
+        variants: do par::map(doc.variants) |variant, copy fold_copy| {
             {
-                desc: maybe_apply_op(fold.ctxt, variant.desc),
+                desc: maybe_apply_op(fold_copy.ctxt, variant.desc),
                 .. *variant
             }
         },
@@ -65,7 +66,7 @@ fn fold_enum(fold: fold::Fold<Op>, doc: doc::EnumDoc) -> doc::EnumDoc {
     }
 }
 
-fn fold_trait(fold: fold::Fold<Op>, doc: doc::TraitDoc) -> doc::TraitDoc {
+fn fold_trait(fold: &fold::Fold<Op>, +doc: doc::TraitDoc) -> doc::TraitDoc {
     let doc = fold::default_seq_fold_trait(fold, doc);
 
     {
@@ -85,7 +86,7 @@ fn apply_to_methods(op: Op, docs: ~[doc::MethodDoc]) -> ~[doc::MethodDoc] {
     }
 }
 
-fn fold_impl(fold: fold::Fold<Op>, doc: doc::ImplDoc) -> doc::ImplDoc {
+fn fold_impl(fold: &fold::Fold<Op>, +doc: doc::ImplDoc) -> doc::ImplDoc {
     let doc = fold::default_seq_fold_impl(fold, doc);
 
     {
diff --git a/src/librustdoc/tystr_pass.rs b/src/librustdoc/tystr_pass.rs
index c00486cda21..791caa44d81 100644
--- a/src/librustdoc/tystr_pass.rs
+++ b/src/librustdoc/tystr_pass.rs
@@ -16,7 +16,7 @@ pub fn mk_pass() -> Pass {
 
 fn run(
     srv: astsrv::Srv,
-    doc: doc::Doc
+    +doc: doc::Doc
 ) -> doc::Doc {
     let fold = fold::Fold({
         fold_fn: fold_fn,
@@ -28,12 +28,12 @@ fn run(
         fold_struct: fold_struct,
         .. *fold::default_any_fold(srv)
     });
-    fold.fold_doc(fold, doc)
+    fold.fold_doc(&fold, doc)
 }
 
 fn fold_fn(
-    fold: fold::Fold<astsrv::Srv>,
-    doc: doc::FnDoc
+    fold: &fold::Fold<astsrv::Srv>,
+    +doc: doc::FnDoc
 ) -> doc::FnDoc {
 
     let srv = fold.ctxt;
@@ -75,8 +75,8 @@ fn should_add_foreign_fn_sig() {
 }
 
 fn fold_const(
-    fold: fold::Fold<astsrv::Srv>,
-    doc: doc::ConstDoc
+    fold: &fold::Fold<astsrv::Srv>,
+    +doc: doc::ConstDoc
 ) -> doc::ConstDoc {
     let srv = fold.ctxt;
 
@@ -102,8 +102,8 @@ fn should_add_const_types() {
 }
 
 fn fold_enum(
-    fold: fold::Fold<astsrv::Srv>,
-    doc: doc::EnumDoc
+    fold: &fold::Fold<astsrv::Srv>,
+    +doc: doc::EnumDoc
 ) -> doc::EnumDoc {
     let doc_id = doc.id();
     let srv = fold.ctxt;
@@ -143,8 +143,8 @@ fn should_add_variant_sigs() {
 }
 
 fn fold_trait(
-    fold: fold::Fold<astsrv::Srv>,
-    doc: doc::TraitDoc
+    fold: &fold::Fold<astsrv::Srv>,
+    +doc: doc::TraitDoc
 ) -> doc::TraitDoc {
     {
         methods: merge_methods(fold.ctxt, doc.id(), doc.methods),
@@ -234,8 +234,8 @@ fn should_add_trait_method_sigs() {
 }
 
 fn fold_impl(
-    fold: fold::Fold<astsrv::Srv>,
-    doc: doc::ImplDoc
+    fold: &fold::Fold<astsrv::Srv>,
+    +doc: doc::ImplDoc
 ) -> doc::ImplDoc {
 
     let srv = fold.ctxt;
@@ -289,8 +289,8 @@ fn should_add_impl_method_sigs() {
 }
 
 fn fold_type(
-    fold: fold::Fold<astsrv::Srv>,
-    doc: doc::TyDoc
+    fold: &fold::Fold<astsrv::Srv>,
+    +doc: doc::TyDoc
 ) -> doc::TyDoc {
 
     let srv = fold.ctxt;
@@ -323,8 +323,8 @@ fn should_add_type_signatures() {
 }
 
 fn fold_struct(
-    fold: fold::Fold<astsrv::Srv>,
-    doc: doc::StructDoc
+    fold: &fold::Fold<astsrv::Srv>,
+    +doc: doc::StructDoc
 ) -> doc::StructDoc {
     let srv = fold.ctxt;