@@ -22,7 +22,8 @@ fn run(
22
22
fold_fn: fold_fn,
23
23
fold_const: fold_const,
24
24
fold_enum: fold_enum,
25
- fold_res: fold_res
25
+ fold_res: fold_res,
26
+ fold_iface: fold_iface
26
27
with * fold:: default_seq_fold ( ctxt)
27
28
} ) ;
28
29
fold. fold_crate ( fold, doc)
@@ -75,6 +76,14 @@ fn fold_mod(
75
76
none
76
77
}
77
78
}
79
+ doc:: ifacetag ( ifacedoc) {
80
+ let doc = fold. fold_iface ( fold, ifacedoc) ;
81
+ if fold. ctxt . have_docs {
82
+ some ( doc:: ifacetag ( doc) )
83
+ } else {
84
+ none
85
+ }
86
+ }
78
87
_ { some( itemtag) }
79
88
}
80
89
}
@@ -91,36 +100,42 @@ fn fold_fn(
91
100
fold : fold:: fold < ctxt > ,
92
101
doc : doc:: fndoc
93
102
) -> doc:: fndoc {
94
- let have_arg_docs = false ;
95
103
let doc = {
96
- args: vec:: filter_map ( doc. args ) { |doc|
97
- if option:: is_some ( doc. desc ) {
98
- have_arg_docs = true ;
99
- some ( doc)
100
- } else {
101
- none
102
- }
103
- } ,
104
- return : {
105
- ty: if option:: is_some ( doc. return . desc ) {
106
- doc. return . ty
107
- } else {
108
- none
109
- }
110
- with doc. return
111
- }
104
+ args: prune_args ( doc. args ) ,
105
+ return : prune_return ( doc. return )
112
106
with doc
113
107
} ;
114
108
115
109
fold. ctxt . have_docs =
116
110
doc. brief != none
117
111
|| doc. desc != none
118
- || have_arg_docs
112
+ || vec :: is_not_empty ( doc . args )
119
113
|| doc. return . desc != none
120
114
|| doc. failure != none;
121
115
ret doc;
122
116
}
123
117
118
+ fn prune_args ( docs : [ doc:: argdoc ] ) -> [ doc:: argdoc ] {
119
+ vec:: filter_map ( docs) { |doc|
120
+ if option:: is_some ( doc. desc ) {
121
+ some ( doc)
122
+ } else {
123
+ none
124
+ }
125
+ }
126
+ }
127
+
128
+ fn prune_return ( doc : doc:: retdoc ) -> doc:: retdoc {
129
+ {
130
+ ty: if option:: is_some ( doc. desc ) {
131
+ doc. ty
132
+ } else {
133
+ none
134
+ }
135
+ with doc
136
+ }
137
+ }
138
+
124
139
#[ test]
125
140
fn should_elide_undocumented_arguments ( ) {
126
141
let source = "#[doc = \" hey\" ] fn a(b: int) { }" ;
@@ -316,3 +331,93 @@ fn should_not_elide_resources_with_documented_args() {
316
331
let doc = run ( srv, doc) ;
317
332
assert vec:: is_not_empty ( doc. topmod . resources ( ) ) ;
318
333
}
334
+
335
+ fn fold_iface (
336
+ fold : fold:: fold < ctxt > ,
337
+ doc : doc:: ifacedoc
338
+ ) -> doc:: ifacedoc {
339
+ let doc = fold:: default_seq_fold_iface ( fold, doc) ;
340
+ let doc = {
341
+ methods: vec:: map ( doc. methods ) { |doc|
342
+ {
343
+ args: prune_args ( doc. args ) ,
344
+ return : prune_return ( doc. return )
345
+ with doc
346
+ }
347
+ }
348
+ with doc
349
+ } ;
350
+ let methods_have_docs = vec:: foldl ( false , doc. methods ) { |accum, doc|
351
+ accum
352
+ || doc. brief != none
353
+ || doc. desc != none
354
+ || vec:: is_not_empty ( doc. args )
355
+ || doc. return . desc != none
356
+ || doc. failure != none
357
+ } ;
358
+ fold. ctxt . have_docs =
359
+ doc. brief != none
360
+ || doc. desc != none
361
+ || methods_have_docs;
362
+ ret doc;
363
+ }
364
+
365
+ #[ test]
366
+ fn should_elide_undocumented_ifaces ( ) {
367
+ let source = "iface i { fn a(); }" ;
368
+ let srv = astsrv:: mk_srv_from_str ( source) ;
369
+ let doc = extract:: from_srv ( srv, "" ) ;
370
+ let doc = attr_pass:: mk_pass ( ) ( srv, doc) ;
371
+ let doc = run ( srv, doc) ;
372
+ assert vec:: is_empty ( doc. topmod . ifaces ( ) ) ;
373
+ }
374
+
375
+ #[ test]
376
+ fn should_not_elide_documented_ifaces ( ) {
377
+ let source = "#[doc = \" hey\" ] iface i { fn a(); }" ;
378
+ let srv = astsrv:: mk_srv_from_str ( source) ;
379
+ let doc = extract:: from_srv ( srv, "" ) ;
380
+ let doc = attr_pass:: mk_pass ( ) ( srv, doc) ;
381
+ let doc = run ( srv, doc) ;
382
+ assert vec:: is_not_empty ( doc. topmod . ifaces ( ) ) ;
383
+ }
384
+
385
+ #[ test]
386
+ fn should_not_elide_ifaces_with_documented_methods ( ) {
387
+ let source = "iface i { #[doc = \" hey\" ] fn a(); }" ;
388
+ let srv = astsrv:: mk_srv_from_str ( source) ;
389
+ let doc = extract:: from_srv ( srv, "" ) ;
390
+ let doc = attr_pass:: mk_pass ( ) ( srv, doc) ;
391
+ let doc = run ( srv, doc) ;
392
+ assert vec:: is_not_empty ( doc. topmod . ifaces ( ) ) ;
393
+ }
394
+
395
+ #[ test]
396
+ fn should_not_elide_undocumented_methods ( ) {
397
+ let source = "#[doc = \" hey\" ] iface i { fn a(); }" ;
398
+ let srv = astsrv:: mk_srv_from_str ( source) ;
399
+ let doc = extract:: from_srv ( srv, "" ) ;
400
+ let doc = attr_pass:: mk_pass ( ) ( srv, doc) ;
401
+ let doc = run ( srv, doc) ;
402
+ assert vec:: is_not_empty ( doc. topmod . ifaces ( ) [ 0 ] . methods ) ;
403
+ }
404
+
405
+ #[ test]
406
+ fn should_elide_undocumented_method_args ( ) {
407
+ let source = "#[doc = \" hey\" ] iface i { fn a(); }" ;
408
+ let srv = astsrv:: mk_srv_from_str ( source) ;
409
+ let doc = extract:: from_srv ( srv, "" ) ;
410
+ let doc = attr_pass:: mk_pass ( ) ( srv, doc) ;
411
+ let doc = run ( srv, doc) ;
412
+ assert vec:: is_empty ( doc. topmod . ifaces ( ) [ 0 ] . methods [ 0 ] . args ) ;
413
+ }
414
+
415
+ #[ test]
416
+ fn should_elide_undocumented_method_return_values ( ) {
417
+ let source = "#[doc = \" hey\" ] iface i { fn a() -> int; }" ;
418
+ let srv = astsrv:: mk_srv_from_str ( source) ;
419
+ let doc = extract:: from_srv ( srv, "" ) ;
420
+ let doc = attr_pass:: mk_pass ( ) ( srv, doc) ;
421
+ let doc = run ( srv, doc) ;
422
+ assert doc. topmod . ifaces ( ) [ 0 ] . methods [ 0 ] . return . ty == none;
423
+ }
0 commit comments