rustdoc: Time passes
This commit is contained in:
parent
7e9aa6c3c2
commit
98c31aaaff
15 changed files with 113 additions and 47 deletions
|
@ -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");
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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(),
|
||||
|
|
|
@ -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";
|
||||
}
|
||||
|
|
|
@ -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";
|
||||
|
|
|
@ -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";
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
|
@ -8,7 +8,10 @@ import rustc::middle::ast_map;
|
|||
export mk_pass;
|
||||
|
||||
fn mk_pass() -> pass {
|
||||
run
|
||||
{
|
||||
name: "tystr",
|
||||
f: run
|
||||
}
|
||||
}
|
||||
|
||||
fn run(
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue