@@ -25,7 +25,8 @@ fn run(
25
25
fold_fn: fold_fn,
26
26
fold_const: fold_const,
27
27
fold_enum: fold_enum,
28
- fold_res: fold_res
28
+ fold_res: fold_res,
29
+ fold_iface: fold_iface
29
30
with * fold:: default_seq_fold ( srv)
30
31
} ) ;
31
32
fold. fold_crate ( fold, doc)
@@ -142,35 +143,36 @@ fn fold_fn(
142
143
with doc
143
144
} ;
144
145
}
146
+ }
145
147
146
- fn merge_arg_attrs (
147
- docs : [ doc:: argdoc ] ,
148
- attrs : [ attr_parser:: arg_attrs ]
149
- ) -> [ doc:: argdoc ] {
150
- vec:: map ( docs) { |doc|
151
- alt vec:: find ( attrs) { |attr|
152
- attr. name == doc. name
153
- } {
154
- some ( attr) {
155
- {
156
- desc: some ( attr. desc )
157
- with doc
158
- }
148
+ fn merge_arg_attrs (
149
+ docs : [ doc:: argdoc ] ,
150
+ attrs : [ attr_parser:: arg_attrs ]
151
+ ) -> [ doc:: argdoc ] {
152
+ vec:: map ( docs) { |doc|
153
+ alt vec:: find ( attrs) { |attr|
154
+ attr. name == doc. name
155
+ } {
156
+ some ( attr) {
157
+ {
158
+ desc: some ( attr. desc )
159
+ with doc
159
160
}
160
- none { doc }
161
161
}
162
+ none { doc }
162
163
}
163
- // FIXME: Warning when documenting a non-existent arg
164
164
}
165
+ // FIXME: Warning when documenting a non-existent arg
166
+ }
165
167
166
- fn merge_ret_attrs (
167
- doc : doc :: retdoc ,
168
- attrs : option < str >
169
- ) -> doc :: retdoc {
170
- {
171
- desc : attrs
172
- with doc
173
- }
168
+
169
+ fn merge_ret_attrs (
170
+ doc : doc :: retdoc ,
171
+ attrs : option < str >
172
+ ) -> doc :: retdoc {
173
+ {
174
+ desc : attrs
175
+ with doc
174
176
}
175
177
}
176
178
@@ -359,4 +361,84 @@ fn fold_res_should_extract_arg_docs() {
359
361
let doc = fold_res ( fold, doc. topmod . resources ( ) [ 0 ] ) ;
360
362
assert doc. args [ 0 ] . name == "a" ;
361
363
assert doc. args [ 0 ] . desc == some ( "b" ) ;
364
+ }
365
+
366
+
367
+ fn fold_iface (
368
+ fold : fold:: fold < astsrv:: srv > ,
369
+ doc : doc:: ifacedoc
370
+ ) -> doc:: ifacedoc {
371
+ let srv = fold. ctxt ;
372
+ let doc = fold:: default_seq_fold_iface ( fold, doc) ;
373
+ let attrs = parse_item_attrs ( srv, doc. id , attr_parser:: parse_iface) ;
374
+
375
+ {
376
+ brief: attrs. brief ,
377
+ desc: attrs. desc ,
378
+ methods: merge_method_attrs ( srv, doc. id , doc. methods )
379
+ with doc
380
+ }
381
+ }
382
+
383
+ fn merge_method_attrs (
384
+ srv : astsrv:: srv ,
385
+ item_id : doc:: ast_id ,
386
+ docs : [ doc:: methoddoc ]
387
+ ) -> [ doc:: methoddoc ] {
388
+ // Create an assoc list from method name to attributes
389
+ let attrs = astsrv:: exec ( srv) { |ctxt|
390
+ alt ctxt. ast_map . get ( item_id) {
391
+ ast_map:: node_item ( @{
392
+ node: ast:: item_iface ( _, methods) , _
393
+ } ) {
394
+ vec:: map ( methods) { |method|
395
+ ( method. ident , attr_parser:: parse_method ( method. attrs ) )
396
+ }
397
+ }
398
+ }
399
+ } ;
400
+
401
+ vec:: map2 ( docs, attrs) { |doc, attrs|
402
+ assert doc. name == tuple:: first ( attrs) ;
403
+ let attrs = tuple:: second ( attrs) ;
404
+
405
+ {
406
+ brief: attrs. brief ,
407
+ desc: attrs. desc ,
408
+ args: merge_arg_attrs ( doc. args , attrs. args ) ,
409
+ return : merge_ret_attrs ( doc. return , attrs. return ) ,
410
+ failure: attrs. failure
411
+ with doc
412
+ }
413
+ }
414
+ }
415
+
416
+ #[ test]
417
+ fn should_extract_iface_docs ( ) {
418
+ let source = "#[doc = \" whatever\" ] iface i { fn a(); }" ;
419
+ let srv = astsrv:: mk_srv_from_str ( source) ;
420
+ let doc = extract:: from_srv ( srv, "" ) ;
421
+ let doc = run ( srv, doc) ;
422
+ assert doc. topmod . ifaces ( ) [ 0 ] . desc == some ( "whatever" ) ;
423
+ }
424
+
425
+ #[ test]
426
+ fn should_extract_iface_method_docs ( ) {
427
+ let source = "iface i {\
428
+ #[doc(\
429
+ brief = \" brief\" ,\
430
+ desc = \" desc\" ,\
431
+ args(a = \" a\" ),\
432
+ return = \" return\" ,\
433
+ failure = \" failure\" )]\
434
+ fn f(a: bool) -> bool;\
435
+ }";
436
+ let srv = astsrv:: mk_srv_from_str ( source) ;
437
+ let doc = extract:: from_srv ( srv, "" ) ;
438
+ let doc = run ( srv, doc) ;
439
+ assert doc. topmod . ifaces ( ) [ 0 ] . methods [ 0 ] . brief == some ( "brief" ) ;
440
+ assert doc. topmod . ifaces ( ) [ 0 ] . methods [ 0 ] . desc == some ( "desc" ) ;
441
+ assert doc. topmod . ifaces ( ) [ 0 ] . methods [ 0 ] . args [ 0 ] . desc == some ( "a" ) ;
442
+ assert doc. topmod . ifaces ( ) [ 0 ] . methods [ 0 ] . return . desc == some ( "return" ) ;
443
+ assert doc. topmod . ifaces ( ) [ 0 ] . methods [ 0 ] . failure == some ( "failure" ) ;
362
444
}
0 commit comments