From 6da55efa4e8dcdcf0277a5bad9df8967d6a175ea Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Wed, 18 Jan 2012 17:05:03 -0800 Subject: [PATCH] rustdoc: Add argument types to the doc --- src/rustdoc/doc.rs | 3 +- src/rustdoc/extract.rs | 3 +- src/rustdoc/tystr_pass.rs | 80 +++++++++++++++++++++++++++++---------- 3 files changed, 65 insertions(+), 21 deletions(-) diff --git a/src/rustdoc/doc.rs b/src/rustdoc/doc.rs index 2b5856e0fac..11a6702a7a6 100644 --- a/src/rustdoc/doc.rs +++ b/src/rustdoc/doc.rs @@ -22,7 +22,8 @@ type fndoc = ~{ }; type argdoc = ~{ - name: str + name: str, + ty: option }; type retdoc = { diff --git a/src/rustdoc/extract.rs b/src/rustdoc/extract.rs index 3b5a2e09127..559c2fc47ab 100644 --- a/src/rustdoc/extract.rs +++ b/src/rustdoc/extract.rs @@ -95,7 +95,8 @@ fn argdocs_from_args(args: [ast::arg]) -> [doc::argdoc] { fn argdoc_from_arg(arg: ast::arg) -> doc::argdoc { ~{ - name: arg.ident + name: arg.ident, + ty: none } } diff --git a/src/rustdoc/tystr_pass.rs b/src/rustdoc/tystr_pass.rs index 6fad1e1e931..7a1f5e1036e 100644 --- a/src/rustdoc/tystr_pass.rs +++ b/src/rustdoc/tystr_pass.rs @@ -33,14 +33,33 @@ fn fold_fn( ) -> doc::fndoc { let srv = fold.ctxt; - let ret_ty = get_ret_ty(srv, doc.id); ~{ - return: merge_ret_ty(doc.return, ret_ty) + return: merge_ret_ty(srv, doc.id, doc.return), + args: merge_arg_tys(srv, doc.id, doc.args) with *doc } } +fn merge_ret_ty( + srv: astsrv::srv, + fn_id: doc::ast_id, + doc: option +) -> option { + let ty = get_ret_ty(srv, fn_id); + alt doc { + some(doc) { + fail "unimplemented"; + } + none. { + some({ + desc: none, + ty: some(ty) + }) + } + } +} + fn get_ret_ty(srv: astsrv::srv, id: doc::ast_id) -> str { astsrv::exec(srv) {|ctxt| alt ctxt.map.get(id) { @@ -53,23 +72,6 @@ fn get_ret_ty(srv: astsrv::srv, id: doc::ast_id) -> str { } } -fn merge_ret_ty( - doc: option, - tystr: str -) -> option { - alt doc { - some(doc) { - fail "unimplemented"; - } - none. { - some({ - desc: none, - ty: some(tystr) - }) - } - } -} - #[test] fn should_add_fn_ret_types() { let source = "fn a() -> int { }"; @@ -79,3 +81,43 @@ fn should_add_fn_ret_types() { assert option::get(doc.topmod.fns[0].return).ty == some("int"); } +fn merge_arg_tys( + srv: astsrv::srv, + fn_id: doc::ast_id, + args: [doc::argdoc] +) -> [doc::argdoc] { + let tys = get_arg_tys(srv, fn_id); + vec::map2(args, tys) {|arg, ty| + // Sanity check that we're talking about the same args + assert arg.name == tuple::first(ty); + ~{ + ty: some(tuple::second(ty)) + with *arg + } + } +} + +fn get_arg_tys(srv: astsrv::srv, fn_id: doc::ast_id) -> [(str, str)] { + astsrv::exec(srv) {|ctxt| + alt ctxt.map.get(fn_id) { + ast_map::node_item(@{ + node: ast::item_fn(decl, _, _), _ + }) { + vec::map(decl.inputs) {|arg| + (arg.ident, pprust::ty_to_str(arg.ty)) + } + } + } + } +} + +#[test] +fn should_add_arg_types() { + let source = "fn a(b: int, c: bool) { }"; + let srv = astsrv::mk_srv_from_str(source); + let doc = extract::from_srv(srv, ""); + let doc = run(srv, doc); + let fn_ = doc.topmod.fns[0]; + assert fn_.args[0].ty == some("int"); + assert fn_.args[1].ty == some("bool"); +} \ No newline at end of file