@@ -9,8 +9,10 @@ import rustc::syntax::ast;
9
9
import rustc:: front:: attr;
10
10
import core:: tuple;
11
11
12
- export crate_attrs, basic_attrs, variant_attrs;
13
- export parse_crate, parse_basic, parse_variant;
12
+ export crate_attrs, basic_attrs, fn_attrs, arg_attrs,
13
+ variant_attrs, res_attrs, method_attrs;
14
+ export parse_crate, parse_basic, parse_fn,
15
+ parse_variant, parse_res, parse_method;
14
16
export parse_hidden;
15
17
16
18
type crate_attrs = {
@@ -22,10 +24,27 @@ type basic_attrs = {
22
24
desc : option < str >
23
25
} ;
24
26
27
+ type fn_attrs = {
28
+ args : [ arg_attrs ] ,
29
+ return : option < str > ,
30
+ failure : option < str >
31
+ } ;
32
+
33
+ type arg_attrs = {
34
+ name : str ,
35
+ desc : str
36
+ } ;
37
+
25
38
type variant_attrs = {
26
39
desc : option < str >
27
40
} ;
28
41
42
+ type res_attrs = {
43
+ args : [ arg_attrs ]
44
+ } ;
45
+
46
+ type method_attrs = fn_attrs ;
47
+
29
48
#[ cfg( test) ]
30
49
mod test {
31
50
@@ -212,6 +231,72 @@ fn parse_long_doc<T>(
212
231
}
213
232
}
214
233
234
+ fn parse_fn ( attrs : [ ast:: attribute ] ) -> fn_attrs {
235
+ parse_long_doc ( attrs, parse_fn_long_doc)
236
+ }
237
+
238
+ fn parse_fn_long_doc ( items : [ @ast:: meta_item ] ) -> fn_attrs {
239
+ let return = attr:: meta_item_value_from_list ( items, "return" ) ;
240
+ let failure = attr:: meta_item_value_from_list ( items, "failure" ) ;
241
+ let args = parse_args ( items) ;
242
+
243
+ {
244
+ args: args,
245
+ return : return ,
246
+ failure: failure
247
+ }
248
+ }
249
+
250
+ fn parse_args ( items : [ @ast:: meta_item ] ) -> [ arg_attrs ] {
251
+ alt attr:: meta_item_list_from_list ( items, "args" ) {
252
+ some ( items) {
253
+ vec:: filter_map ( items) { |item|
254
+ option:: map ( attr:: name_value_str_pair ( item) ) { |pair|
255
+ {
256
+ name: tuple:: first ( pair) ,
257
+ desc: tuple:: second ( pair)
258
+ }
259
+ }
260
+ }
261
+ }
262
+ none { [ ] }
263
+ }
264
+ }
265
+
266
+ #[ test]
267
+ fn parse_fn_should_handle_undocumented_functions ( ) {
268
+ let source = "" ;
269
+ let attrs = test:: parse_attributes ( source) ;
270
+ let attrs = parse_fn ( attrs) ;
271
+ assert attrs. return == none;
272
+ assert vec:: len ( attrs. args ) == 0 u;
273
+ }
274
+
275
+ #[ test]
276
+ fn parse_fn_should_parse_the_return_value_description ( ) {
277
+ let source = "#[doc(return = \" return value\" )]" ;
278
+ let attrs = test:: parse_attributes ( source) ;
279
+ let attrs = parse_fn ( attrs) ;
280
+ assert attrs. return == some ( "return value" ) ;
281
+ }
282
+
283
+ #[ test]
284
+ fn parse_fn_should_parse_the_argument_descriptions( ) {
285
+ let source = "#[doc(args(a = \" arg a\" , b = \" arg b\" ))]" ;
286
+ let attrs = test:: parse_attributes ( source) ;
287
+ let attrs = parse_fn ( attrs) ;
288
+ assert attrs. args [ 0 ] == { name: "a" , desc: "arg a" } ;
289
+ assert attrs. args [ 1 ] == { name: "b", desc: " arg b"};
290
+ }
291
+
292
+ #[test]
293
+ fn parse_fn_should_parse_failure_conditions() {
294
+ let source = " #[ doc( failure = \"it' s the fail\" ) ] ";
295
+ let attrs = test::parse_attributes(source);
296
+ let attrs = parse_fn(attrs);
297
+ assert attrs.failure == some(" it' s the fail") ;
298
+ }
299
+
215
300
fn parse_variant ( attrs : [ ast:: attribute ] ) -> variant_attrs {
216
301
parse_short_doc_or (
217
302
attrs,
@@ -257,6 +342,29 @@ fn should_parse_variant_long_doc() {
257
342
assert attrs. desc == some ( "a" ) ;
258
343
}
259
344
345
+ fn parse_res ( attrs : [ ast:: attribute ] ) -> res_attrs {
346
+ parse_long_doc ( attrs, parse_res_long_doc)
347
+ }
348
+
349
+ fn parse_res_long_doc ( items : [ @ast:: meta_item ] ) -> res_attrs {
350
+ {
351
+ args: parse_args ( items)
352
+ }
353
+ }
354
+
355
+ #[ test]
356
+ fn shoulde_parse_resource_arg ( ) {
357
+ let source = "#[doc(args(a = \" b\" ))]" ;
358
+ let attrs = test:: parse_attributes ( source) ;
359
+ let attrs = parse_res ( attrs) ;
360
+ assert attrs. args [ 0 ] . name == "a" ;
361
+ assert attrs. args [ 0 ] . desc == "b" ;
362
+ }
363
+
364
+ fn parse_method ( attrs : [ ast:: attribute ] ) -> method_attrs {
365
+ parse_fn ( attrs)
366
+ }
367
+
260
368
fn parse_hidden ( attrs : [ ast:: attribute ] ) -> bool {
261
369
parse_short_doc_or (
262
370
attrs,
0 commit comments