@@ -135,7 +135,7 @@ impl Cfg {
135135
136136 /// Renders the configuration for human display, as a short HTML description.
137137 pub ( crate ) fn render_short_html ( & self ) -> String {
138- let mut msg = Html ( self , true ) . to_string ( ) ;
138+ let mut msg = Display ( self , Format :: ShortHtml ) . to_string ( ) ;
139139 if self . should_capitalize_first_letter ( ) {
140140 if let Some ( i) = msg. find ( |c : char | c. is_ascii_alphanumeric ( ) ) {
141141 msg[ i..i + 1 ] . make_ascii_uppercase ( ) ;
@@ -148,14 +148,29 @@ impl Cfg {
148148 pub ( crate ) fn render_long_html ( & self ) -> String {
149149 let on = if self . should_use_with_in_description ( ) { "with" } else { "on" } ;
150150
151- let mut msg = format ! ( "This is supported {} <strong>{}</strong>" , on, Html ( self , false ) ) ;
151+ let mut msg = format ! (
152+ "This is supported {} <strong>{}</strong>" ,
153+ on,
154+ Display ( self , Format :: LongHtml )
155+ ) ;
152156 if self . should_append_only_to_description ( ) {
153157 msg. push_str ( " only" ) ;
154158 }
155159 msg. push ( '.' ) ;
156160 msg
157161 }
158162
163+ /// Renders the configuration for long display, as a long plain text description.
164+ pub ( crate ) fn render_long_plain ( & self ) -> String {
165+ let on = if self . should_use_with_in_description ( ) { "with" } else { "on" } ;
166+
167+ let mut msg = format ! ( "This is supported {} {}" , on, Display ( self , Format :: LongPlain ) ) ;
168+ if self . should_append_only_to_description ( ) {
169+ msg. push_str ( " only" ) ;
170+ }
171+ msg
172+ }
173+
159174 fn should_capitalize_first_letter ( & self ) -> bool {
160175 match * self {
161176 Cfg :: False | Cfg :: True | Cfg :: Not ( ..) => true ,
@@ -286,9 +301,31 @@ impl ops::BitOr for Cfg {
286301 }
287302}
288303
289- /// Pretty-print wrapper for a `Cfg`. Also indicates whether the "short-form" rendering should be
290- /// used.
291- struct Html < ' a > ( & ' a Cfg , bool ) ;
304+ #[ derive( Clone , Copy ) ]
305+ enum Format {
306+ LongHtml ,
307+ LongPlain ,
308+ ShortHtml ,
309+ }
310+
311+ impl Format {
312+ fn is_long ( self ) -> bool {
313+ match self {
314+ Format :: LongHtml | Format :: LongPlain => true ,
315+ Format :: ShortHtml => false ,
316+ }
317+ }
318+
319+ fn is_html ( self ) -> bool {
320+ match self {
321+ Format :: LongHtml | Format :: ShortHtml => true ,
322+ Format :: LongPlain => false ,
323+ }
324+ }
325+ }
326+
327+ /// Pretty-print wrapper for a `Cfg`. Also indicates what form of rendering should be used.
328+ struct Display < ' a > ( & ' a Cfg , Format ) ;
292329
293330fn write_with_opt_paren < T : fmt:: Display > (
294331 fmt : & mut fmt:: Formatter < ' _ > ,
@@ -305,7 +342,7 @@ fn write_with_opt_paren<T: fmt::Display>(
305342 Ok ( ( ) )
306343}
307344
308- impl < ' a > fmt:: Display for Html < ' a > {
345+ impl < ' a > fmt:: Display for Display < ' a > {
309346 fn fmt ( & self , fmt : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
310347 match * self . 0 {
311348 Cfg :: Not ( ref child) => match * * child {
@@ -314,31 +351,86 @@ impl<'a> fmt::Display for Html<'a> {
314351 if sub_cfgs. iter ( ) . all ( Cfg :: is_simple) { " nor " } else { ", nor " } ;
315352 for ( i, sub_cfg) in sub_cfgs. iter ( ) . enumerate ( ) {
316353 fmt. write_str ( if i == 0 { "neither " } else { separator } ) ?;
317- write_with_opt_paren ( fmt, !sub_cfg. is_all ( ) , Html ( sub_cfg, self . 1 ) ) ?;
354+ write_with_opt_paren ( fmt, !sub_cfg. is_all ( ) , Display ( sub_cfg, self . 1 ) ) ?;
318355 }
319356 Ok ( ( ) )
320357 }
321- ref simple @ Cfg :: Cfg ( ..) => write ! ( fmt, "non-{}" , Html ( simple, self . 1 ) ) ,
322- ref c => write ! ( fmt, "not ({})" , Html ( c, self . 1 ) ) ,
358+ ref simple @ Cfg :: Cfg ( ..) => write ! ( fmt, "non-{}" , Display ( simple, self . 1 ) ) ,
359+ ref c => write ! ( fmt, "not ({})" , Display ( c, self . 1 ) ) ,
323360 } ,
324361
325362 Cfg :: Any ( ref sub_cfgs) => {
326363 let separator = if sub_cfgs. iter ( ) . all ( Cfg :: is_simple) { " or " } else { ", or " } ;
364+
365+ let short_longhand = self . 1 . is_long ( ) && {
366+ let all_crate_features = sub_cfgs
367+ . iter ( )
368+ . all ( |sub_cfg| matches ! ( sub_cfg, Cfg :: Cfg ( sym:: feature, Some ( _) ) ) ) ;
369+ let all_target_features = sub_cfgs
370+ . iter ( )
371+ . all ( |sub_cfg| matches ! ( sub_cfg, Cfg :: Cfg ( sym:: target_feature, Some ( _) ) ) ) ;
372+
373+ if all_crate_features {
374+ fmt. write_str ( "crate features " ) ?;
375+ true
376+ } else if all_target_features {
377+ fmt. write_str ( "target features " ) ?;
378+ true
379+ } else {
380+ false
381+ }
382+ } ;
383+
327384 for ( i, sub_cfg) in sub_cfgs. iter ( ) . enumerate ( ) {
328385 if i != 0 {
329386 fmt. write_str ( separator) ?;
330387 }
331- write_with_opt_paren ( fmt, !sub_cfg. is_all ( ) , Html ( sub_cfg, self . 1 ) ) ?;
388+ if let ( true , Cfg :: Cfg ( _, Some ( feat) ) ) = ( short_longhand, sub_cfg) {
389+ if self . 1 . is_html ( ) {
390+ write ! ( fmt, "<code>{}</code>" , feat) ?;
391+ } else {
392+ write ! ( fmt, "`{}`" , feat) ?;
393+ }
394+ } else {
395+ write_with_opt_paren ( fmt, !sub_cfg. is_all ( ) , Display ( sub_cfg, self . 1 ) ) ?;
396+ }
332397 }
333398 Ok ( ( ) )
334399 }
335400
336401 Cfg :: All ( ref sub_cfgs) => {
402+ let short_longhand = self . 1 . is_long ( ) && {
403+ let all_crate_features = sub_cfgs
404+ . iter ( )
405+ . all ( |sub_cfg| matches ! ( sub_cfg, Cfg :: Cfg ( sym:: feature, Some ( _) ) ) ) ;
406+ let all_target_features = sub_cfgs
407+ . iter ( )
408+ . all ( |sub_cfg| matches ! ( sub_cfg, Cfg :: Cfg ( sym:: target_feature, Some ( _) ) ) ) ;
409+
410+ if all_crate_features {
411+ fmt. write_str ( "crate features " ) ?;
412+ true
413+ } else if all_target_features {
414+ fmt. write_str ( "target features " ) ?;
415+ true
416+ } else {
417+ false
418+ }
419+ } ;
420+
337421 for ( i, sub_cfg) in sub_cfgs. iter ( ) . enumerate ( ) {
338422 if i != 0 {
339423 fmt. write_str ( " and " ) ?;
340424 }
341- write_with_opt_paren ( fmt, !sub_cfg. is_simple ( ) , Html ( sub_cfg, self . 1 ) ) ?;
425+ if let ( true , Cfg :: Cfg ( _, Some ( feat) ) ) = ( short_longhand, sub_cfg) {
426+ if self . 1 . is_html ( ) {
427+ write ! ( fmt, "<code>{}</code>" , feat) ?;
428+ } else {
429+ write ! ( fmt, "`{}`" , feat) ?;
430+ }
431+ } else {
432+ write_with_opt_paren ( fmt, !sub_cfg. is_simple ( ) , Display ( sub_cfg, self . 1 ) ) ?;
433+ }
342434 }
343435 Ok ( ( ) )
344436 }
@@ -406,26 +498,39 @@ impl<'a> fmt::Display for Html<'a> {
406498 } ,
407499 ( sym:: target_endian, Some ( endian) ) => return write ! ( fmt, "{}-endian" , endian) ,
408500 ( sym:: target_pointer_width, Some ( bits) ) => return write ! ( fmt, "{}-bit" , bits) ,
409- ( sym:: target_feature, Some ( feat) ) => {
410- if self . 1 {
411- return write ! ( fmt, "<code>{}</code>" , feat) ;
412- } else {
501+ ( sym:: target_feature, Some ( feat) ) => match self . 1 {
502+ Format :: LongHtml => {
413503 return write ! ( fmt, "target feature <code>{}</code>" , feat) ;
414504 }
415- }
505+ Format :: LongPlain => return write ! ( fmt, "target feature `{}`" , feat) ,
506+ Format :: ShortHtml => return write ! ( fmt, "<code>{}</code>" , feat) ,
507+ } ,
508+ ( sym:: feature, Some ( feat) ) => match self . 1 {
509+ Format :: LongHtml => {
510+ return write ! ( fmt, "crate feature <code>{}</code>" , feat) ;
511+ }
512+ Format :: LongPlain => return write ! ( fmt, "crate feature `{}`" , feat) ,
513+ Format :: ShortHtml => return write ! ( fmt, "<code>{}</code>" , feat) ,
514+ } ,
416515 _ => "" ,
417516 } ;
418517 if !human_readable. is_empty ( ) {
419518 fmt. write_str ( human_readable)
420519 } else if let Some ( v) = value {
421- write ! (
422- fmt,
423- "<code>{}=\" {}\" </code>" ,
424- Escape ( & name. as_str( ) ) ,
425- Escape ( & v. as_str( ) )
426- )
427- } else {
520+ if self . 1 . is_html ( ) {
521+ write ! (
522+ fmt,
523+ r#"<code>{}="{}"</code>"# ,
524+ Escape ( & name. as_str( ) ) ,
525+ Escape ( & v. as_str( ) )
526+ )
527+ } else {
528+ write ! ( fmt, r#"`{}="{}"`"# , name, v)
529+ }
530+ } else if self . 1 . is_html ( ) {
428531 write ! ( fmt, "<code>{}</code>" , Escape ( & name. as_str( ) ) )
532+ } else {
533+ write ! ( fmt, "`{}`" , name)
429534 }
430535 }
431536 }
0 commit comments