rustdoc: Time passes

This commit is contained in:
Brian Anderson 2012-02-27 18:07:16 -08:00
parent 7e9aa6c3c2
commit 98c31aaaff
15 changed files with 113 additions and 47 deletions

View File

@ -12,7 +12,10 @@ import rustc::middle::ast_map;
export mk_pass;
fn mk_pass() -> pass {
run
{
name: "attr",
f: run
}
}
fn run(
@ -198,7 +201,7 @@ fn should_extract_fn_return_attributes() {
let source = "#[doc(return = \"what\")] fn a() -> int { }";
astsrv::from_str(source) {|srv|
let doc = extract::from_srv(srv, "");
let doc = tystr_pass::mk_pass()(srv, doc);
let doc = tystr_pass::mk_pass().f(srv, doc);
let fold = fold::default_any_fold(srv);
let doc = fold_fn(fold, doc.topmod.fns()[0]);
assert doc.return.desc == some("what");
@ -210,7 +213,7 @@ fn should_preserve_fn_sig() {
let source = "fn a() -> int { }";
astsrv::from_str(source) {|srv|
let doc = extract::from_srv(srv, "");
let doc = tystr_pass::mk_pass()(srv, doc);
let doc = tystr_pass::mk_pass().f(srv, doc);
let fold = fold::default_any_fold(srv);
let doc = fold_fn(fold, doc.topmod.fns()[0]);
assert doc.sig == some("fn a() -> int");

View File

@ -3,8 +3,11 @@
export mk_pass;
fn mk_pass(op: fn~(str) -> str) -> pass {
fn~(srv: astsrv::srv, doc: doc::cratedoc) -> doc::cratedoc {
run(srv, doc, op)
{
name: "desc",
f: fn~(srv: astsrv::srv, doc: doc::cratedoc) -> doc::cratedoc {
run(srv, doc, op)
}
}
}
@ -284,8 +287,8 @@ mod test {
fn mk_doc(source: str) -> doc::cratedoc {
astsrv::from_str(source) {|srv|
let doc = extract::from_srv(srv, "");
let doc = attr_pass::mk_pass()(srv, doc);
mk_pass({|s| str::trim(s)})(srv, doc)
let doc = attr_pass::mk_pass().f(srv, doc);
mk_pass({|s| str::trim(s)}).f(srv, doc)
}
}
}

View File

@ -10,7 +10,10 @@ is interpreted as the brief description.
export mk_pass;
fn mk_pass() -> pass {
run
{
name: "desc_to_brief",
f: run
}
}
fn run(
@ -149,7 +152,7 @@ mod test {
fn mk_doc(source: str) -> doc::cratedoc {
astsrv::from_str(source) {|srv|
let doc = extract::from_srv(srv, "");
let doc = attr_pass::mk_pass()(srv, doc);
let doc = attr_pass::mk_pass().f(srv, doc);
run(srv, doc)
}
}

View File

@ -11,7 +11,7 @@ export mk_pass;
fn mk_pass(
give_writer: fn~(fn(io::writer))
) -> pass {
fn~(
let f = fn~(
srv: astsrv::srv,
doc: doc::cratedoc
) -> doc::cratedoc {
@ -32,11 +32,18 @@ fn mk_pass(
// Sort the items so mods come last. All mods will be
// output at the same header level so sorting mods last
// makes the headers come out nested correctly.
let sorted_doc = sort_pass::mk_pass(mods_last)(srv, doc);
let sorted_doc = sort_pass::mk_pass(
"mods last", mods_last
).f(srv, doc);
write_markdown(sorted_doc, writer);
}
doc
};
{
name: "markdown",
f: f
}
}
@ -820,11 +827,11 @@ mod test {
astsrv::from_str(source) {|srv|
let doc = extract::from_srv(srv, "");
#debug("doc (extract): %?", doc);
let doc = tystr_pass::mk_pass()(srv, doc);
let doc = tystr_pass::mk_pass().f(srv, doc);
#debug("doc (tystr): %?", doc);
let doc = path_pass::mk_pass()(srv, doc);
let doc = path_pass::mk_pass().f(srv, doc);
#debug("doc (path): %?", doc);
let doc = attr_pass::mk_pass()(srv, doc);
let doc = attr_pass::mk_pass().f(srv, doc);
#debug("doc (attr): %?", doc);
(srv, doc)
}
@ -858,7 +865,7 @@ mod test {
let result = io::mem_buffer_str(buffer);
comm::send(chan, result);
};
pass(srv, doc);
pass.f(srv, doc);
ret comm::recv(port);
}
@ -866,7 +873,7 @@ mod test {
fn write_markdown_should_write_crate_header() {
astsrv::from_str("") {|srv|
let doc = extract::from_srv(srv, "belch");
let doc = attr_pass::mk_pass()(srv, doc);
let doc = attr_pass::mk_pass().f(srv, doc);
let markdown = write_markdown_str(doc);
assert str::contains(markdown, "# Crate belch");
}

View File

@ -2,7 +2,12 @@
export mk_pass;
fn mk_pass() -> pass { run }
fn mk_pass() -> pass {
{
name: "path",
f: run
}
}
type ctxt = {
srv: astsrv::srv,

View File

@ -4,7 +4,10 @@
export mk_pass;
fn mk_pass() -> pass {
run
{
name: "prune_undoc_details",
f: run
}
}
fn run(
@ -66,8 +69,8 @@ fn should_elide_undocumented_return_values() {
let source = "#[doc = \"fonz\"] fn a() -> int { }";
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 = tystr_pass::mk_pass().f(srv, doc);
let doc = attr_pass::mk_pass().f(srv, doc);
let doc = run(srv, doc);
assert doc.topmod.fns()[0].return.ty == none;
}
@ -157,7 +160,7 @@ mod test {
fn mk_doc(source: str) -> doc::cratedoc {
astsrv::from_str(source) {|srv|
let doc = extract::from_srv(srv, "");
let doc = attr_pass::mk_pass()(srv, doc);
let doc = attr_pass::mk_pass().f(srv, doc);
run(srv, doc)
}
}

View File

@ -3,7 +3,10 @@
export mk_pass;
fn mk_pass() -> pass {
run
{
name: "prune_undoc_items",
f: run
}
}
type ctxt = {
@ -367,7 +370,7 @@ mod test {
fn mk_doc(source: str) -> doc::cratedoc {
astsrv::from_str(source) {|srv|
let doc = extract::from_srv(srv, "");
let doc = attr_pass::mk_pass()(srv, doc);
let doc = attr_pass::mk_pass().f(srv, doc);
run(srv, doc)
}
}

View File

@ -7,7 +7,10 @@ import rustc::middle::ast_map;
export mk_pass;
fn mk_pass() -> pass {
run
{
name: "prune_unexperted",
f: run
}
}
fn run(srv: astsrv::srv, doc: doc::cratedoc) -> doc::cratedoc {
@ -232,7 +235,7 @@ fn should_not_prune_reexports() {
fn mk_doc(source: str) -> doc::cratedoc {
astsrv::from_str(source) {|srv|
let doc = extract::from_srv(srv, "");
let doc = reexport_pass::mk_pass()(srv, doc);
let doc = reexport_pass::mk_pass().f(srv, doc);
run(srv, doc)
}
}

View File

@ -8,7 +8,10 @@ import rustc::util::common;
export mk_pass;
fn mk_pass() -> pass {
run
{
name: "reexport",
f: run
}
}
type def_set = map::set<ast::def_id>;
@ -332,10 +335,10 @@ fn should_duplicate_multiple_reexported_items() {
}";
astsrv::from_str(source) {|srv|
let doc = extract::from_srv(srv, "");
let doc = path_pass::mk_pass()(srv, doc);
let doc = path_pass::mk_pass().f(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);
let doc = sort_item_name_pass::mk_pass().f(srv, doc);
assert doc.topmod.mods()[1].fns()[0].name() == "b";
assert doc.topmod.mods()[1].fns()[1].name() == "c";
}
@ -354,7 +357,7 @@ fn should_reexport_in_topmod() {
fn mk_doc(source: str) -> doc::cratedoc {
astsrv::from_str(source) {|srv|
let doc = extract::from_srv(srv, "core");
let doc = path_pass::mk_pass()(srv, doc);
let doc = path_pass::mk_pass().f(srv, doc);
run(srv, doc)
}
}
@ -385,7 +388,7 @@ mod test {
fn mk_doc(source: str) -> doc::cratedoc {
astsrv::from_str(source) {|srv|
let doc = extract::from_srv(srv, "");
let doc = path_pass::mk_pass()(srv, doc);
let doc = path_pass::mk_pass().f(srv, doc);
run(srv, doc)
}
}

View File

@ -7,7 +7,10 @@ import doc::item;
import doc::util;
#[doc = "A single operation on the document model"]
type pass = fn~(srv: astsrv::srv, doc: doc::cratedoc) -> doc::cratedoc;
type pass = {
name: str,
f: fn~(srv: astsrv::srv, doc: doc::cratedoc) -> doc::cratedoc
};
fn run_passes(
srv: astsrv::srv,
@ -36,7 +39,9 @@ fn run_passes(
log(debug, #fmt("pass #%d", passno));
passno += 1;
log(debug, doc);
pass(srv, doc)
time(pass.name) {||
pass.f(srv, doc)
}
}
}
@ -72,7 +77,16 @@ fn test_run_passes() {
}
let source = "";
astsrv::from_str(source) {|srv|
let passes = [pass1, pass2];
let passes = [
{
name: "",
f: pass1
},
{
name: "",
f: pass2
}
];
let doc = extract::from_srv(srv, "one");
let doc = run_passes(srv, doc, passes);
assert doc.topmod.name() == "onetwothree";
@ -90,12 +104,25 @@ fn main(argv: [str]) {
run(source_file);
}
fn time<T>(what: str, f: fn() -> T) -> T {
let start = std::time::precise_time_s();
let rv = f();
let end = std::time::precise_time_s();
#info("time: %3.3f s %s", end - start, what);
ret rv;
}
#[doc = "Runs rustdoc over the given file"]
fn run(source_file: str) {
let default_name = source_file;
astsrv::from_file(source_file) {|srv|
let doc = extract::from_srv(srv, default_name);
time("wait") {||
astsrv::exec(srv) {|_ctxt| () }
};
let doc = time("extract") {||
extract::from_srv(srv, default_name)
};
run_passes(srv, doc, [
reexport_pass::mk_pass(),
prune_unexported_pass::mk_pass(),

View File

@ -3,7 +3,7 @@
export mk_pass;
fn mk_pass() -> pass {
sort_pass::mk_pass { |item1, item2|
sort_pass::mk_pass("sort_item_name") { |item1, item2|
str::le(item1.name(), item2.name())
}
}
@ -13,7 +13,7 @@ fn test() {
let source = "mod z { } fn y() { }";
astsrv::from_str(source) {|srv|
let doc = extract::from_srv(srv, "");
let doc = mk_pass()(srv, doc);
let doc = mk_pass().f(srv, doc);
assert doc.topmod.items[0].name() == "y";
assert doc.topmod.items[1].name() == "z";
}

View File

@ -3,7 +3,7 @@
export mk_pass;
fn mk_pass() -> pass {
sort_pass::mk_pass { |item1, item2|
sort_pass::mk_pass("sort_item_type") { |item1, item2|
fn score(item: doc::itemtag) -> int {
alt item {
doc::consttag(_) { 0 }
@ -36,7 +36,7 @@ fn test() {
type itype = int;";
astsrv::from_str(source) {|srv|
let doc = extract::from_srv(srv, "");
let doc = mk_pass()(srv, doc);
let doc = mk_pass().f(srv, doc);
assert doc.topmod.items[0].name() == "iconst";
assert doc.topmod.items[1].name() == "itype";
assert doc.topmod.items[2].name() == "ienum";

View File

@ -6,9 +6,12 @@ export item_lteq, mk_pass;
type item_lteq = fn~(doc::itemtag, doc::itemtag) -> bool;
fn mk_pass(lteq: item_lteq) -> pass {
fn~(srv: astsrv::srv, doc: doc::cratedoc) -> doc::cratedoc {
run(srv, doc, lteq)
fn mk_pass(name: str, lteq: item_lteq) -> pass {
{
name: name,
f: fn~(srv: astsrv::srv, doc: doc::cratedoc) -> doc::cratedoc {
run(srv, doc, lteq)
}
}
}
@ -44,7 +47,7 @@ fn test() {
let source = "mod z { mod y { } fn x() { } } mod w { }";
astsrv::from_str(source) {|srv|
let doc = extract::from_srv(srv, "");
let doc = mk_pass(name_lteq)(srv, doc);
let doc = mk_pass("", name_lteq).f(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";
@ -61,10 +64,10 @@ fn should_be_stable() {
let source = "mod a { mod b { } } mod c { mod d { } }";
astsrv::from_str(source) {|srv|
let doc = extract::from_srv(srv, "");
let doc = mk_pass(always_eq)(srv, doc);
let doc = mk_pass("", always_eq).f(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);
let doc = mk_pass("", always_eq).f(srv, doc);
assert doc.topmod.mods()[0].items[0].name() == "b";
assert doc.topmod.mods()[1].items[0].name() == "d";
}

View File

@ -63,8 +63,8 @@ mod test {
fn mk_doc(source: str) -> doc::cratedoc {
astsrv::from_str(source) {|srv|
let doc = extract::from_srv(srv, "");
let doc = attr_pass::mk_pass()(srv, doc);
mk_pass()(srv, doc)
let doc = attr_pass::mk_pass().f(srv, doc);
mk_pass().f(srv, doc)
}
}
}

View File

@ -8,7 +8,10 @@ import rustc::middle::ast_map;
export mk_pass;
fn mk_pass() -> pass {
run
{
name: "tystr",
f: run
}
}
fn run(