@@ -33,43 +33,45 @@ fn fold_fn(
33
33
) -> doc:: fndoc {
34
34
35
35
let srv = fold. ctxt ;
36
- let ret_ty = get_ret_ty ( srv, doc. id ) ;
37
36
38
37
~{
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 )
40
40
with * doc
41
41
}
42
42
}
43
43
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
-
56
44
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 >
59
48
) -> option < doc:: retdoc > {
49
+ let ty = get_ret_ty ( srv, fn_id) ;
60
50
alt doc {
61
51
some( doc) {
62
52
fail "unimplemented" ;
63
53
}
64
54
none. {
65
55
some ( {
66
56
desc: none,
67
- ty: some ( tystr )
57
+ ty: some ( ty )
68
58
} )
69
59
}
70
60
}
71
61
}
72
62
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
+
73
75
#[ test]
74
76
fn should_add_fn_ret_types ( ) {
75
77
let source = "fn a() -> int { }" ;
@@ -79,3 +81,43 @@ fn should_add_fn_ret_types() {
79
81
assert option:: get ( doc. topmod . fns [ 0 ] . return ) . ty == some ( "int" ) ;
80
82
}
81
83
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