@@ -14,6 +14,7 @@ use rustc_span::Span;
14
14
use rustc_span:: symbol:: { Symbol , sym} ;
15
15
16
16
use crate :: html:: escape:: Escape ;
17
+ use crate :: joined:: Joined as _;
17
18
18
19
#[ cfg( test) ]
19
20
mod tests;
@@ -396,6 +397,8 @@ impl Display<'_> {
396
397
sub_cfgs : & [ Cfg ] ,
397
398
separator : & str ,
398
399
) -> fmt:: Result {
400
+ use fmt:: Display as _;
401
+
399
402
let short_longhand = self . 1 . is_long ( ) && {
400
403
let all_crate_features =
401
404
sub_cfgs. iter ( ) . all ( |sub_cfg| matches ! ( sub_cfg, Cfg :: Cfg ( sym:: feature, Some ( _) ) ) ) ;
@@ -414,20 +417,29 @@ impl Display<'_> {
414
417
}
415
418
} ;
416
419
417
- for ( i, sub_cfg) in sub_cfgs. iter ( ) . enumerate ( ) {
418
- if i != 0 {
419
- fmt. write_str ( separator) ?;
420
- }
421
- if let ( true , Cfg :: Cfg ( _, Some ( feat) ) ) = ( short_longhand, sub_cfg) {
422
- if self . 1 . is_html ( ) {
423
- write ! ( fmt, "<code>{feat}</code>" ) ?;
424
- } else {
425
- write ! ( fmt, "`{feat}`" ) ?;
426
- }
427
- } else {
428
- write_with_opt_paren ( fmt, !sub_cfg. is_all ( ) , Display ( sub_cfg, self . 1 ) ) ?;
429
- }
430
- }
420
+ fmt:: from_fn ( |f| {
421
+ sub_cfgs
422
+ . iter ( )
423
+ . map ( |sub_cfg| {
424
+ fmt:: from_fn ( move |fmt| {
425
+ if let Cfg :: Cfg ( _, Some ( feat) ) = sub_cfg
426
+ && short_longhand
427
+ {
428
+ if self . 1 . is_html ( ) {
429
+ write ! ( fmt, "<code>{feat}</code>" ) ?;
430
+ } else {
431
+ write ! ( fmt, "`{feat}`" ) ?;
432
+ }
433
+ } else {
434
+ write_with_opt_paren ( fmt, !sub_cfg. is_all ( ) , Display ( sub_cfg, self . 1 ) ) ?;
435
+ }
436
+ Ok ( ( ) )
437
+ } )
438
+ } )
439
+ . joined ( separator, f)
440
+ } )
441
+ . fmt ( fmt) ?;
442
+
431
443
Ok ( ( ) )
432
444
}
433
445
}
@@ -439,11 +451,20 @@ impl fmt::Display for Display<'_> {
439
451
Cfg :: Any ( ref sub_cfgs) => {
440
452
let separator =
441
453
if sub_cfgs. iter ( ) . all ( Cfg :: is_simple) { " nor " } else { ", nor " } ;
442
- for ( i, sub_cfg) in sub_cfgs. iter ( ) . enumerate ( ) {
443
- fmt. write_str ( if i == 0 { "neither " } else { separator } ) ?;
444
- write_with_opt_paren ( fmt, !sub_cfg. is_all ( ) , Display ( sub_cfg, self . 1 ) ) ?;
445
- }
446
- Ok ( ( ) )
454
+ fmt. write_str ( "neither " ) ?;
455
+
456
+ sub_cfgs
457
+ . iter ( )
458
+ . map ( |sub_cfg| {
459
+ fmt:: from_fn ( |fmt| {
460
+ write_with_opt_paren (
461
+ fmt,
462
+ !sub_cfg. is_all ( ) ,
463
+ Display ( sub_cfg, self . 1 ) ,
464
+ )
465
+ } )
466
+ } )
467
+ . joined ( separator, fmt)
447
468
}
448
469
ref simple @ Cfg :: Cfg ( ..) => write ! ( fmt, "non-{}" , Display ( simple, self . 1 ) ) ,
449
470
ref c => write ! ( fmt, "not ({})" , Display ( c, self . 1 ) ) ,
0 commit comments