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
This commit is contained in:
Brian Anderson 2012-02-20 21:08:19 -08:00
parent d6095dc6b5
commit 96e3031675
17 changed files with 200 additions and 165 deletions

View file

@ -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;
}
}

View file

@ -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)
}
}
}

View file

@ -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)
}
}
}

View file

@ -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)
}
}
}

View file

@ -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";
}
}
}

View file

@ -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]

View file

@ -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"];
}
}

View file

@ -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)
}
}
}

View file

@ -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)
}
}
}

View file

@ -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)
}
}
}

View file

@ -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)
}
}
}

View file

@ -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()) }
]);
}
}

View file

@ -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";
}
}

View file

@ -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";
}
}

View file

@ -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";
}
}

View file

@ -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)
}
}
}

View file

@ -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)
}
}
}