@@ -392,7 +392,8 @@ impl<'a> FmtVisitor<'a> {
392
392
generics : & ast:: Generics ,
393
393
span : Span ,
394
394
) {
395
- self . buffer . push_str ( & format_header ( "enum " , ident, vis) ) ;
395
+ let enum_header = format_header ( "enum " , ident, vis) ;
396
+ self . buffer . push_str ( & enum_header) ;
396
397
397
398
let enum_snippet = self . snippet ( span) ;
398
399
let brace_pos = enum_snippet. find_uncommented ( "{" ) . unwrap ( ) ;
@@ -406,6 +407,7 @@ impl<'a> FmtVisitor<'a> {
406
407
enum_def. variants . is_empty ( ) ,
407
408
self . block_indent ,
408
409
mk_sp ( span. lo , body_start) ,
410
+ last_line_width ( & enum_header) ,
409
411
) . unwrap ( ) ;
410
412
self . buffer . push_str ( & generics_str) ;
411
413
@@ -1071,19 +1073,38 @@ fn format_struct_struct(
1071
1073
fields. is_empty( ) ,
1072
1074
offset,
1073
1075
mk_sp( span. lo, body_lo) ,
1076
+ last_line_width( & result) ,
1074
1077
) )
1075
1078
}
1076
1079
None => {
1077
- if context. config . item_brace_style ( ) == BraceStyle :: AlwaysNextLine &&
1078
- !fields. is_empty ( )
1080
+ // 3 = ` {}`, 2 = ` {`.
1081
+ let overhead = if fields. is_empty ( ) { 3 } else { 2 } ;
1082
+ if ( context. config . item_brace_style ( ) == BraceStyle :: AlwaysNextLine &&
1083
+ !fields. is_empty ( ) ) ||
1084
+ context
1085
+ . config
1086
+ . max_width ( )
1087
+ . checked_sub ( result. len ( ) )
1088
+ . unwrap_or ( 0 ) < overhead
1079
1089
{
1080
1090
format ! ( "\n {}{{" , offset. block_only( ) . to_string( context. config) )
1081
1091
} else {
1082
1092
" {" . to_owned ( )
1083
1093
}
1084
1094
}
1085
1095
} ;
1086
- result. push_str ( & generics_str) ;
1096
+ // 1 = `}`
1097
+ let overhead = if fields. is_empty ( ) { 1 } else { 0 } ;
1098
+ let max_len = context. config . max_width ( ) - offset. width ( ) ;
1099
+ if !generics_str. contains ( '\n' ) && result. len ( ) + generics_str. len ( ) + overhead > max_len {
1100
+ result. push ( '\n' ) ;
1101
+ result. push_str ( & offset
1102
+ . block_indent ( context. config )
1103
+ . to_string ( context. config ) ) ;
1104
+ result. push_str ( & generics_str. trim_left ( ) ) ;
1105
+ } else {
1106
+ result. push_str ( & generics_str) ;
1107
+ }
1087
1108
1088
1109
if fields. is_empty ( ) {
1089
1110
let snippet = context. snippet ( mk_sp ( body_lo, span. hi - BytePos ( 1 ) ) ) ;
@@ -1147,16 +1168,13 @@ fn format_tuple_struct(
1147
1168
1148
1169
let where_clause_str = match generics {
1149
1170
Some ( generics) => {
1150
- let shape = Shape :: indented ( offset + last_line_width ( & header_str) , context. config ) ;
1171
+ let budget = context. budget ( last_line_width ( & header_str) ) ;
1172
+ let shape = Shape :: legacy ( budget, offset) ;
1151
1173
let g_span = mk_sp ( span. lo , body_lo) ;
1152
1174
let generics_str = try_opt ! ( rewrite_generics( context, generics, shape, g_span) ) ;
1153
1175
result. push_str ( & generics_str) ;
1154
1176
1155
- let where_budget = context
1156
- . config
1157
- . max_width ( )
1158
- . checked_sub ( last_line_width ( & result) )
1159
- . unwrap_or ( 0 ) ;
1177
+ let where_budget = context. budget ( last_line_width ( & result) ) ;
1160
1178
try_opt ! ( rewrite_where_clause(
1161
1179
context,
1162
1180
& generics. where_clause,
@@ -1173,6 +1191,18 @@ fn format_tuple_struct(
1173
1191
} ;
1174
1192
1175
1193
if fields. is_empty ( ) {
1194
+ // 3 = `();`
1195
+ let used_width = if result. contains ( '\n' ) {
1196
+ last_line_width ( & result) + 3
1197
+ } else {
1198
+ offset. width ( ) + result. len ( ) + 3
1199
+ } ;
1200
+ if used_width > context. config . max_width ( ) {
1201
+ result. push ( '\n' ) ;
1202
+ result. push_str ( & offset
1203
+ . block_indent ( context. config )
1204
+ . to_string ( context. config ) )
1205
+ }
1176
1206
result. push ( '(' ) ;
1177
1207
let snippet = context. snippet ( mk_sp ( body_lo, context. codemap . span_before ( span, ")" ) ) ) ;
1178
1208
if snippet. is_empty ( ) {
0 commit comments