1
Fork 0

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

View file

@ -3,8 +3,11 @@
export mk_pass; export mk_pass;
fn mk_pass(op: fn~(str) -> str) -> 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 { fn mk_doc(source: str) -> doc::cratedoc {
astsrv::from_str(source) {|srv| astsrv::from_str(source) {|srv|
let doc = extract::from_srv(srv, ""); let doc = extract::from_srv(srv, "");
let doc = attr_pass::mk_pass()(srv, doc); let doc = attr_pass::mk_pass().f(srv, doc);
mk_pass({|s| str::trim(s)})(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; export mk_pass;
fn mk_pass() -> pass { fn mk_pass() -> pass {
run {
name: "desc_to_brief",
f: run
}
} }
fn run( fn run(
@ -149,7 +152,7 @@ mod test {
fn mk_doc(source: str) -> doc::cratedoc { fn mk_doc(source: str) -> doc::cratedoc {
astsrv::from_str(source) {|srv| astsrv::from_str(source) {|srv|
let doc = extract::from_srv(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) run(srv, doc)
} }
} }

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -7,7 +7,10 @@ import doc::item;
import doc::util; import doc::util;
#[doc = "A single operation on the document model"] #[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( fn run_passes(
srv: astsrv::srv, srv: astsrv::srv,
@ -36,7 +39,9 @@ fn run_passes(
log(debug, #fmt("pass #%d", passno)); log(debug, #fmt("pass #%d", passno));
passno += 1; passno += 1;
log(debug, doc); log(debug, doc);
pass(srv, doc) time(pass.name) {||
pass.f(srv, doc)
}
} }
} }
@ -72,7 +77,16 @@ fn test_run_passes() {
} }
let source = ""; let source = "";
astsrv::from_str(source) {|srv| 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 = extract::from_srv(srv, "one");
let doc = run_passes(srv, doc, passes); let doc = run_passes(srv, doc, passes);
assert doc.topmod.name() == "onetwothree"; assert doc.topmod.name() == "onetwothree";
@ -90,12 +104,25 @@ fn main(argv: [str]) {
run(source_file); 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"] #[doc = "Runs rustdoc over the given file"]
fn run(source_file: str) { fn run(source_file: str) {
let default_name = source_file; let default_name = source_file;
astsrv::from_file(source_file) {|srv| 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, [ run_passes(srv, doc, [
reexport_pass::mk_pass(), reexport_pass::mk_pass(),
prune_unexported_pass::mk_pass(), prune_unexported_pass::mk_pass(),

View file

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

View file

@ -3,7 +3,7 @@
export mk_pass; export mk_pass;
fn mk_pass() -> 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 { fn score(item: doc::itemtag) -> int {
alt item { alt item {
doc::consttag(_) { 0 } doc::consttag(_) { 0 }
@ -36,7 +36,7 @@ fn test() {
type itype = int;"; type itype = int;";
astsrv::from_str(source) {|srv| astsrv::from_str(source) {|srv|
let doc = extract::from_srv(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[0].name() == "iconst";
assert doc.topmod.items[1].name() == "itype"; assert doc.topmod.items[1].name() == "itype";
assert doc.topmod.items[2].name() == "ienum"; 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; type item_lteq = fn~(doc::itemtag, doc::itemtag) -> bool;
fn mk_pass(lteq: item_lteq) -> pass { fn mk_pass(name: str, lteq: item_lteq) -> pass {
fn~(srv: astsrv::srv, doc: doc::cratedoc) -> doc::cratedoc { {
run(srv, doc, lteq) 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 { }"; let source = "mod z { mod y { } fn x() { } } mod w { }";
astsrv::from_str(source) {|srv| astsrv::from_str(source) {|srv|
let doc = extract::from_srv(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()[0].name() == "w";
assert doc.topmod.mods()[1].items[0].name() == "x"; assert doc.topmod.mods()[1].items[0].name() == "x";
assert doc.topmod.mods()[1].items[1].name() == "y"; 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 { } }"; let source = "mod a { mod b { } } mod c { mod d { } }";
astsrv::from_str(source) {|srv| astsrv::from_str(source) {|srv|
let doc = extract::from_srv(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()[0].items[0].name() == "b";
assert doc.topmod.mods()[1].items[0].name() == "d"; 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()[0].items[0].name() == "b";
assert doc.topmod.mods()[1].items[0].name() == "d"; assert doc.topmod.mods()[1].items[0].name() == "d";
} }

View file

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

View file

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