Skip to content

Commit 6da55ef

Browse files
committed
rustdoc: Add argument types to the doc
1 parent f3fa7c1 commit 6da55ef

File tree

3 files changed

+63
-19
lines changed

3 files changed

+63
-19
lines changed

src/rustdoc/doc.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ type fndoc = ~{
2222
};
2323

2424
type argdoc = ~{
25-
name: str
25+
name: str,
26+
ty: option<str>
2627
};
2728

2829
type retdoc = {

src/rustdoc/extract.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,8 @@ fn argdocs_from_args(args: [ast::arg]) -> [doc::argdoc] {
9595

9696
fn argdoc_from_arg(arg: ast::arg) -> doc::argdoc {
9797
~{
98-
name: arg.ident
98+
name: arg.ident,
99+
ty: none
99100
}
100101
}
101102

src/rustdoc/tystr_pass.rs

Lines changed: 59 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -33,43 +33,45 @@ fn fold_fn(
3333
) -> doc::fndoc {
3434

3535
let srv = fold.ctxt;
36-
let ret_ty = get_ret_ty(srv, doc.id);
3736

3837
~{
39-
return: merge_ret_ty(doc.return, ret_ty)
38+
return: merge_ret_ty(srv, doc.id, doc.return),
39+
args: merge_arg_tys(srv, doc.id, doc.args)
4040
with *doc
4141
}
4242
}
4343

44-
fn get_ret_ty(srv: astsrv::srv, id: doc::ast_id) -> str {
45-
astsrv::exec(srv) {|ctxt|
46-
alt ctxt.map.get(id) {
47-
ast_map::node_item(@{
48-
node: ast::item_fn(decl, _, _), _
49-
}) {
50-
pprust::ty_to_str(decl.output)
51-
}
52-
}
53-
}
54-
}
55-
5644
fn merge_ret_ty(
57-
doc: option<doc::retdoc>,
58-
tystr: str
45+
srv: astsrv::srv,
46+
fn_id: doc::ast_id,
47+
doc: option<doc::retdoc>
5948
) -> option<doc::retdoc> {
49+
let ty = get_ret_ty(srv, fn_id);
6050
alt doc {
6151
some(doc) {
6252
fail "unimplemented";
6353
}
6454
none. {
6555
some({
6656
desc: none,
67-
ty: some(tystr)
57+
ty: some(ty)
6858
})
6959
}
7060
}
7161
}
7262

63+
fn get_ret_ty(srv: astsrv::srv, id: doc::ast_id) -> str {
64+
astsrv::exec(srv) {|ctxt|
65+
alt ctxt.map.get(id) {
66+
ast_map::node_item(@{
67+
node: ast::item_fn(decl, _, _), _
68+
}) {
69+
pprust::ty_to_str(decl.output)
70+
}
71+
}
72+
}
73+
}
74+
7375
#[test]
7476
fn should_add_fn_ret_types() {
7577
let source = "fn a() -> int { }";
@@ -79,3 +81,43 @@ fn should_add_fn_ret_types() {
7981
assert option::get(doc.topmod.fns[0].return).ty == some("int");
8082
}
8183

84+
fn merge_arg_tys(
85+
srv: astsrv::srv,
86+
fn_id: doc::ast_id,
87+
args: [doc::argdoc]
88+
) -> [doc::argdoc] {
89+
let tys = get_arg_tys(srv, fn_id);
90+
vec::map2(args, tys) {|arg, ty|
91+
// Sanity check that we're talking about the same args
92+
assert arg.name == tuple::first(ty);
93+
~{
94+
ty: some(tuple::second(ty))
95+
with *arg
96+
}
97+
}
98+
}
99+
100+
fn get_arg_tys(srv: astsrv::srv, fn_id: doc::ast_id) -> [(str, str)] {
101+
astsrv::exec(srv) {|ctxt|
102+
alt ctxt.map.get(fn_id) {
103+
ast_map::node_item(@{
104+
node: ast::item_fn(decl, _, _), _
105+
}) {
106+
vec::map(decl.inputs) {|arg|
107+
(arg.ident, pprust::ty_to_str(arg.ty))
108+
}
109+
}
110+
}
111+
}
112+
}
113+
114+
#[test]
115+
fn should_add_arg_types() {
116+
let source = "fn a(b: int, c: bool) { }";
117+
let srv = astsrv::mk_srv_from_str(source);
118+
let doc = extract::from_srv(srv, "");
119+
let doc = run(srv, doc);
120+
let fn_ = doc.topmod.fns[0];
121+
assert fn_.args[0].ty == some("int");
122+
assert fn_.args[1].ty == some("bool");
123+
}

0 commit comments

Comments
 (0)