diff --git a/src/rustdoc/astsrv.rs b/src/rustdoc/astsrv.rs index b34a01e86a5e..7c5d435504ed 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 = fn(srv: srv) -> T; type ctxt_handler = fn~(ctxt: ctxt) -> T; type srv = { ctxt: ctxt }; -fn from_str(source: str) -> srv { +fn from_str(source: str, owner: srv_owner) -> 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(file: str, owner: srv_owner) -> 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( @@ -242,7 +252,8 @@ fn exec( #[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 b2a0b176b79c..f95d32b6cc74 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 9e0cc33ac81a..4e64c29b2957 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 1e8e48bf3e2c..5bf983d43ebf 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 a264e507d27f..004f1b6df17a 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 93d0ca975958..1f82e892c0e5 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 a0ba492a57c9..01d3d6b731dd 100644 --- a/src/rustdoc/path_pass.rs +++ b/src/rustdoc/path_pass.rs @@ -45,18 +45,20 @@ fn fold_mod(fold: fold::fold, 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 f399f36622e3..1a1c55bdf68b 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 956017a43783..3109b2aaf470 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 c48b1176dfc2..228137f35469 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 c8dd45413818..e6f2aeea2343 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 fc07d290d2c7..bc46dab13023 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 466d234c8914..73a5143e6994 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 766c1d545dfd..d2452dfa801b 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 faf91bc288b3..2a486bbdcadd 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 57c2b25a41cc..221ac86a4eda 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 401db0a2c5ac..9b1166fed7a1 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) + } } }