rustdoc: Eliminate AST usage in gen module

This commit is contained in:
Brian Anderson 2012-01-16 15:38:40 -08:00
parent c4de718f37
commit 6e0bcb5bd0
2 changed files with 28 additions and 34 deletions

View file

@ -1,74 +1,56 @@
import std::io;
import std::io::writer_util;
import rustc::syntax::ast;
import rustc::syntax::print::pprust;
export write_markdown;
type ctxt = {
ps: pprust::ps,
w: io::writer
};
fn write_markdown(
doc: doc::cratedoc,
crate: @ast::crate,
writer: io::writer
) {
let ctxt = {
ps: pprust::rust_printer(writer),
w: writer
};
write_header(ctxt, doc.topmod.name);
write_top_module(ctxt, crate, doc.topmod);
write_top_module(ctxt, doc.topmod);
}
fn write_top_module(
ctxt: ctxt,
crate: @ast::crate,
moddoc: doc::moddoc
) {
write_mod_contents(ctxt, crate, moddoc);
write_mod_contents(ctxt, moddoc);
}
fn write_mod(
ctxt: ctxt,
crate: @ast::crate,
moddoc: doc::moddoc
) {
write_mod_contents(ctxt, crate, moddoc);
write_mod_contents(ctxt, moddoc);
}
fn write_mod_contents(
ctxt: ctxt,
crate: @ast::crate,
moddoc: doc::moddoc
) {
for fndoc in *moddoc.fns {
write_fn(ctxt, crate, fndoc);
write_fn(ctxt, fndoc);
}
for moddoc in *moddoc.mods {
write_mod(ctxt, crate, moddoc);
write_mod(ctxt, moddoc);
}
}
fn write_fn(
ctxt: ctxt,
crate: @ast::crate,
fndoc: doc::fndoc
) {
import rustc::middle::ast_map;
let map = ast_map::map_crate(*crate);
let decl = alt map.get(fndoc.id) {
ast_map::node_item(@{
node: ast::item_fn(decl, _, _), _
}) { decl }
};
write_fndoc(ctxt, fndoc.name, fndoc, decl);
write_fndoc(ctxt, fndoc.name, fndoc);
}
#[doc(
@ -87,7 +69,7 @@ fn write_header(ctxt: ctxt, name: str) {
doc = "Function docs extracted from attributes",
_fn = "AST object representing this function")
)]
fn write_fndoc(ctxt: ctxt, ident: str, doc: doc::fndoc, decl: ast::fn_decl) {
fn write_fndoc(ctxt: ctxt, ident: str, doc: doc::fndoc) {
ctxt.w.write_line("## Function `" + ident + "`");
ctxt.w.write_line(doc.brief);
alt doc.desc {
@ -102,22 +84,33 @@ fn write_fndoc(ctxt: ctxt, ident: str, doc: doc::fndoc, decl: ast::fn_decl) {
ctxt.w.write_str("### Argument `" + arg + "`: ");
ctxt.w.write_str(desc)
}
ctxt.w.write_line("### Returns `" + pprust::ty_to_str(decl.output) + "`");
alt doc.return {
some({desc: some(d), _}) { ctxt.w.write_line(d); }
_ { }
some(doc) {
alt doc.ty {
some(ty) {
ctxt.w.write_line("### Returns `" + ty + "`");
alt doc.desc {
some(d) {
ctxt.w.write_line(d);
}
none. { }
}
}
none. { fail "unimplemented"; }
}
}
none. { }
}
}
#[cfg(test)]
mod tests {
fn write_markdown_str(
doc: doc::cratedoc,
crate: @ast::crate
doc: doc::cratedoc
) -> str {
let buffer = io::mk_mem_buffer();
let writer = io::mem_buffer_writer(buffer);
write_markdown(doc, crate, writer);
write_markdown(doc, writer);
ret io::mem_buffer_str(buffer);
}
@ -126,7 +119,7 @@ mod tests {
let source = "";
let ast = parse::from_str(source);
let doc = extract::extract(ast, "belch");
let markdown = write_markdown_str(doc, ast);
let markdown = write_markdown_str(doc);
assert str::contains(markdown, "# Crate belch\n");
}
@ -135,7 +128,7 @@ mod tests {
let source = "fn func() { }";
let ast = parse::from_str(source);
let doc = extract::extract(ast, "");
let markdown = write_markdown_str(doc, ast);
let markdown = write_markdown_str(doc);
assert str::contains(markdown, "## Function `func`");
}
}

View file

@ -23,5 +23,6 @@ fn main(argv: [str]) {
let default_name = source_file;
let crate = parse::from_file(source_file);
let doc = extract::extract(crate, default_name);
gen::write_markdown(doc, crate, std::io::stdout());
let doc = tystr_pass::run(doc, crate);
gen::write_markdown(doc, std::io::stdout());
}