@@ -19,7 +19,7 @@ use crate::config::{Edition, IndentStyle, StyleEdition};
19
19
use crate :: lists:: {
20
20
definitive_tactic, itemize_list, write_list, ListFormatting , ListItem , Separator ,
21
21
} ;
22
- use crate :: rewrite:: { Rewrite , RewriteContext , RewriteErrorExt , RewriteResult } ;
22
+ use crate :: rewrite:: { Rewrite , RewriteContext , RewriteError , RewriteErrorExt , RewriteResult } ;
23
23
use crate :: shape:: Shape ;
24
24
use crate :: source_map:: SpanUtils ;
25
25
use crate :: spanned:: Spanned ;
@@ -1127,12 +1127,13 @@ impl Rewrite for UseTree {
1127
1127
fn rewrite_result ( & self , context : & RewriteContext < ' _ > , mut shape : Shape ) -> RewriteResult {
1128
1128
fn proceed (
1129
1129
context : & RewriteContext < ' _ > ,
1130
+ span : & Span ,
1130
1131
shape : & Shape ,
1131
1132
curr_segment : & UseSegment ,
1132
1133
curr_segment_is_allow_overflow : bool ,
1133
1134
next_segment : Option < & & UseSegment > ,
1134
- ) -> Option < ( String , Shape ) > {
1135
- let mut rewritten_segment = curr_segment. rewrite ( context, shape. clone ( ) ) ?;
1135
+ ) -> Result < ( String , Shape ) , RewriteError > {
1136
+ let mut rewritten_segment = curr_segment. rewrite_result ( context, shape. clone ( ) ) ?;
1136
1137
if next_segment. is_some ( ) {
1137
1138
rewritten_segment. push_str ( "::" ) ;
1138
1139
}
@@ -1157,45 +1158,55 @@ impl Rewrite for UseTree {
1157
1158
s. clone ( )
1158
1159
}
1159
1160
} else {
1160
- let ret = shape. offset_left ( rewritten_segment. len ( ) ) ?;
1161
- // Check that there is a room for the next "{". If not, return null for retry with
1162
- // newline.
1163
- ret. offset_left ( reserved_room_for_brace) ?;
1161
+ let Some ( ret) = shape. offset_left ( rewritten_segment. len ( ) ) else {
1162
+ return Err ( RewriteError :: ExceedsMaxWidth {
1163
+ configured_width : shape. width ,
1164
+ span : span. clone ( ) ,
1165
+ } ) ;
1166
+ } ;
1167
+ // Check that there is a room for the next "{". If not, return an error for retry
1168
+ // with newline.
1169
+ if ret. offset_left ( reserved_room_for_brace) . is_none ( ) {
1170
+ return Err ( RewriteError :: ExceedsMaxWidth {
1171
+ configured_width : shape. width ,
1172
+ span : span. clone ( ) ,
1173
+ } ) ;
1174
+ }
1164
1175
ret
1165
1176
} ;
1166
- Some ( ( rewritten_segment, next_shape) )
1177
+ Ok ( ( rewritten_segment, next_shape) )
1167
1178
}
1168
1179
1169
1180
let shape_top_level = shape. clone ( ) ;
1170
1181
let mut result = String :: with_capacity ( 256 ) ;
1171
1182
let mut is_first = true ;
1172
1183
let mut iter = self . path . iter ( ) . peekable ( ) ;
1184
+ let span = self . span ( ) ;
1173
1185
while let Some ( segment) = iter. next ( ) {
1174
1186
let allow_overflow = is_first;
1175
1187
is_first = false ;
1176
- match proceed ( context, & shape, segment, allow_overflow, iter. peek ( ) ) {
1177
- Some ( ( rewritten_segment, next_shape) ) => {
1188
+ match proceed ( context, & span , & shape, segment, allow_overflow, iter. peek ( ) ) {
1189
+ Ok ( ( rewritten_segment, next_shape) ) => {
1178
1190
result. push_str ( & rewritten_segment) ;
1179
1191
shape = next_shape;
1180
1192
continue ;
1181
1193
}
1182
- None => ( ) ,
1194
+ Err ( RewriteError :: ExceedsMaxWidth { .. } ) => {
1195
+ // If the first `proceed()` failed with no room, retry with newline.
1196
+ }
1197
+ Err ( e) => {
1198
+ // Abort otherwise.
1199
+ return Err ( e) ;
1200
+ }
1183
1201
}
1184
- // If the first `proceed()` failed, retry with newline.
1185
1202
result. push_str ( "\n " ) ;
1186
1203
result. push_str ( & " " . repeat ( shape. indent . block_indent + 4 ) ) ;
1187
1204
shape = shape_top_level. clone ( ) ;
1188
1205
let allow_overflow = true ;
1189
- match proceed ( context, & shape, segment, allow_overflow, iter. peek ( ) ) {
1190
- Some ( ( rewritten_segment, next_shape) ) => {
1191
- result. push_str ( & rewritten_segment) ;
1192
- shape = next_shape;
1193
- }
1194
- // Give up to format.
1195
- None => {
1196
- return Err ( crate :: rewrite:: RewriteError :: Unknown ) ;
1197
- }
1198
- }
1206
+ let ( rewritten_segment, next_shape) =
1207
+ proceed ( context, & span, & shape, segment, allow_overflow, iter. peek ( ) ) ?;
1208
+ result. push_str ( & rewritten_segment) ;
1209
+ shape = next_shape;
1199
1210
}
1200
1211
Ok ( result)
1201
1212
}
0 commit comments