@@ -13,7 +13,7 @@ use crate::lists::{
13
13
use crate :: macros:: { rewrite_macro, MacroPosition } ;
14
14
use crate :: overflow;
15
15
use crate :: pairs:: { rewrite_pair, PairParts } ;
16
- use crate :: rewrite:: { Rewrite , RewriteContext , RewriteErrorExt , RewriteResult } ;
16
+ use crate :: rewrite:: { Rewrite , RewriteContext , RewriteError , RewriteErrorExt , RewriteResult } ;
17
17
use crate :: shape:: Shape ;
18
18
use crate :: source_map:: SpanUtils ;
19
19
use crate :: spanned:: Spanned ;
@@ -81,12 +81,16 @@ impl<'a> Rewrite for RangeOperand<'a> {
81
81
82
82
impl Rewrite for Pat {
83
83
fn rewrite ( & self , context : & RewriteContext < ' _ > , shape : Shape ) -> Option < String > {
84
+ self . rewrite_result ( context, shape) . ok ( )
85
+ }
86
+
87
+ fn rewrite_result ( & self , context : & RewriteContext < ' _ > , shape : Shape ) -> RewriteResult {
84
88
match self . kind {
85
89
PatKind :: Or ( ref pats) => {
86
90
let pat_strs = pats
87
91
. iter ( )
88
- . map ( |p| p. rewrite ( context, shape) )
89
- . collect :: < Option < Vec < _ > > > ( ) ?;
92
+ . map ( |p| p. rewrite_result ( context, shape) )
93
+ . collect :: < Result < Vec < _ > , RewriteError > > ( ) ?;
90
94
91
95
let use_mixed_layout = pats
92
96
. iter ( )
@@ -108,7 +112,7 @@ impl Rewrite for Pat {
108
112
. separator ( " |" )
109
113
. separator_place ( context. config . binop_separator ( ) )
110
114
. ends_with_newline ( false ) ;
111
- write_list ( & items, & fmt) . ok ( )
115
+ write_list ( & items, & fmt)
112
116
}
113
117
PatKind :: Box ( ref pat) => rewrite_unary_prefix ( context, "box " , & * * pat, shape) ,
114
118
PatKind :: Ident ( BindingMode ( by_ref, mutability) , ident, ref sub_pat) => {
@@ -122,19 +126,25 @@ impl Rewrite for Pat {
122
126
let sub_pat = match * sub_pat {
123
127
Some ( ref p) => {
124
128
// 2 - `@ `.
125
- let width = shape. width . checked_sub (
126
- mut_prefix. len ( ) + ref_kw. len ( ) + mut_infix. len ( ) + id_str. len ( ) + 2 ,
127
- ) ?;
129
+ let width = shape
130
+ . width
131
+ . checked_sub (
132
+ mut_prefix. len ( )
133
+ + ref_kw. len ( )
134
+ + mut_infix. len ( )
135
+ + id_str. len ( )
136
+ + 2 ,
137
+ )
138
+ . max_width_error ( shape. width , p. span ( ) ) ?;
128
139
let lo = context. snippet_provider . span_after ( self . span , "@" ) ;
129
140
combine_strs_with_missing_comments (
130
141
context,
131
142
"@" ,
132
- & p. rewrite ( context, Shape :: legacy ( width, shape. indent ) ) ?,
143
+ & p. rewrite_result ( context, Shape :: legacy ( width, shape. indent ) ) ?,
133
144
mk_sp ( lo, p. span . lo ( ) ) ,
134
145
shape,
135
146
true ,
136
- )
137
- . ok ( ) ?
147
+ ) ?
138
148
}
139
149
None => "" . to_owned ( ) ,
140
150
} ;
@@ -153,8 +163,7 @@ impl Rewrite for Pat {
153
163
mk_sp ( lo, hi) ,
154
164
shape,
155
165
true ,
156
- )
157
- . ok ( ) ?,
166
+ ) ?,
158
167
)
159
168
}
160
169
( false , true ) => (
@@ -183,8 +192,7 @@ impl Rewrite for Pat {
183
192
mk_sp ( lo, hi) ,
184
193
shape,
185
194
true ,
186
- )
187
- . ok ( ) ?,
195
+ ) ?,
188
196
)
189
197
}
190
198
( false , true ) => ( first_lo, first) ,
@@ -201,8 +209,7 @@ impl Rewrite for Pat {
201
209
mk_sp ( ident. span . hi ( ) , hi) ,
202
210
shape,
203
211
true ,
204
- )
205
- . ok ( ) ?
212
+ ) ?
206
213
} else {
207
214
id_str. to_owned ( )
208
215
} ;
@@ -215,23 +222,28 @@ impl Rewrite for Pat {
215
222
shape,
216
223
true ,
217
224
)
218
- . ok ( )
219
225
}
220
226
PatKind :: Wild => {
221
227
if 1 <= shape. width {
222
- Some ( "_" . to_owned ( ) )
228
+ Ok ( "_" . to_owned ( ) )
223
229
} else {
224
- None
230
+ Err ( RewriteError :: ExceedsMaxWidth {
231
+ configured_width : 1 ,
232
+ span : self . span ,
233
+ } )
225
234
}
226
235
}
227
236
PatKind :: Rest => {
228
237
if 1 <= shape. width {
229
- Some ( ".." . to_owned ( ) )
238
+ Ok ( ".." . to_owned ( ) )
230
239
} else {
231
- None
240
+ Err ( RewriteError :: ExceedsMaxWidth {
241
+ configured_width : 1 ,
242
+ span : self . span ,
243
+ } )
232
244
}
233
245
}
234
- PatKind :: Never => None ,
246
+ PatKind :: Never => Err ( RewriteError :: Unknown ) ,
235
247
PatKind :: Range ( ref lhs, ref rhs, ref end_kind) => {
236
248
let infix = match end_kind. node {
237
249
RangeEnd :: Included ( RangeSyntax :: DotDotDot ) => "..." ,
@@ -267,38 +279,34 @@ impl Rewrite for Pat {
267
279
shape,
268
280
SeparatorPlace :: Front ,
269
281
)
270
- . ok ( )
271
282
}
272
283
PatKind :: Ref ( ref pat, mutability) => {
273
284
let prefix = format ! ( "&{}" , format_mutability( mutability) ) ;
274
285
rewrite_unary_prefix ( context, & prefix, & * * pat, shape)
275
286
}
276
- PatKind :: Tuple ( ref items) => {
277
- rewrite_tuple_pat ( items, None , self . span , context, shape) . ok ( )
278
- }
287
+ PatKind :: Tuple ( ref items) => rewrite_tuple_pat ( items, None , self . span , context, shape) ,
279
288
PatKind :: Path ( ref q_self, ref path) => {
280
- rewrite_path ( context, PathContext :: Expr , q_self, path, shape) . ok ( )
289
+ rewrite_path ( context, PathContext :: Expr , q_self, path, shape)
281
290
}
282
291
PatKind :: TupleStruct ( ref q_self, ref path, ref pat_vec) => {
283
- let path_str =
284
- rewrite_path ( context, PathContext :: Expr , q_self, path, shape) . ok ( ) ?;
285
- rewrite_tuple_pat ( pat_vec, Some ( path_str) , self . span , context, shape) . ok ( )
292
+ let path_str = rewrite_path ( context, PathContext :: Expr , q_self, path, shape) ?;
293
+ rewrite_tuple_pat ( pat_vec, Some ( path_str) , self . span , context, shape)
286
294
}
287
- PatKind :: Lit ( ref expr) => expr. rewrite ( context, shape) ,
295
+ PatKind :: Lit ( ref expr) => expr. rewrite_result ( context, shape) ,
288
296
PatKind :: Slice ( ref slice_pat)
289
297
if context. config . style_edition ( ) <= StyleEdition :: Edition2021 =>
290
298
{
291
299
let rw: Vec < String > = slice_pat
292
300
. iter ( )
293
301
. map ( |p| {
294
- if let Some ( rw) = p. rewrite ( context, shape) {
302
+ if let Ok ( rw) = p. rewrite_result ( context, shape) {
295
303
rw
296
304
} else {
297
305
context. snippet ( p. span ) . to_string ( )
298
306
}
299
307
} )
300
308
. collect ( ) ;
301
- Some ( format ! ( "[{}]" , rw. join( ", " ) ) )
309
+ Ok ( format ! ( "[{}]" , rw. join( ", " ) ) )
302
310
}
303
311
PatKind :: Slice ( ref slice_pat) => overflow:: rewrite_with_square_brackets (
304
312
context,
@@ -308,8 +316,7 @@ impl Rewrite for Pat {
308
316
self . span ,
309
317
None ,
310
318
None ,
311
- )
312
- . ok ( ) ,
319
+ ) ,
313
320
PatKind :: Struct ( ref qself, ref path, ref fields, rest) => rewrite_struct_pat (
314
321
qself,
315
322
path,
@@ -318,16 +325,21 @@ impl Rewrite for Pat {
318
325
self . span ,
319
326
context,
320
327
shape,
321
- )
322
- . ok ( ) ,
328
+ ) ,
323
329
PatKind :: MacCall ( ref mac) => {
324
- rewrite_macro ( mac, None , context, shape, MacroPosition :: Pat )
330
+ rewrite_macro ( mac, None , context, shape, MacroPosition :: Pat ) . unknown_error ( )
325
331
}
326
332
PatKind :: Paren ( ref pat) => pat
327
- . rewrite ( context, shape. offset_left ( 1 ) ?. sub_width ( 1 ) ?)
333
+ . rewrite_result (
334
+ context,
335
+ shape
336
+ . offset_left ( 1 )
337
+ . and_then ( |s| s. sub_width ( 1 ) )
338
+ . max_width_error ( shape. width , self . span ) ?,
339
+ )
328
340
. map ( |inner_pat| format ! ( "({})" , inner_pat) ) ,
329
- PatKind :: Err ( _) => None ,
330
- PatKind :: Deref ( _) => None ,
341
+ PatKind :: Err ( _) => Err ( RewriteError :: Unknown ) ,
342
+ PatKind :: Deref ( _) => Err ( RewriteError :: Unknown ) ,
331
343
}
332
344
}
333
345
}
@@ -473,9 +485,13 @@ pub(crate) enum TuplePatField<'a> {
473
485
474
486
impl < ' a > Rewrite for TuplePatField < ' a > {
475
487
fn rewrite ( & self , context : & RewriteContext < ' _ > , shape : Shape ) -> Option < String > {
488
+ self . rewrite_result ( context, shape) . ok ( )
489
+ }
490
+
491
+ fn rewrite_result ( & self , context : & RewriteContext < ' _ > , shape : Shape ) -> RewriteResult {
476
492
match * self {
477
- TuplePatField :: Pat ( p) => p. rewrite ( context, shape) ,
478
- TuplePatField :: Dotdot ( _) => Some ( ".." . to_string ( ) ) ,
493
+ TuplePatField :: Pat ( p) => p. rewrite_result ( context, shape) ,
494
+ TuplePatField :: Dotdot ( _) => Ok ( ".." . to_string ( ) ) ,
479
495
}
480
496
}
481
497
}
0 commit comments