Skip to content

Commit 40f5075

Browse files
ding-youngytmimi
authored andcommitted
impl rewrite_result for Pat, TuplePatField
- also update rewrite_unary_*** to return RewriteResult
1 parent 8894466 commit 40f5075

File tree

3 files changed

+88
-66
lines changed

3 files changed

+88
-66
lines changed

src/expr.rs

+28-22
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ pub(crate) fn format_expr(
113113
})
114114
.ok()
115115
}
116-
ast::ExprKind::Unary(op, ref subexpr) => rewrite_unary_op(context, op, subexpr, shape),
116+
ast::ExprKind::Unary(op, ref subexpr) => rewrite_unary_op(context, op, subexpr, shape).ok(),
117117
ast::ExprKind::Struct(ref struct_expr) => {
118118
let ast::StructExpr {
119119
qself,
@@ -213,14 +213,14 @@ pub(crate) fn format_expr(
213213
};
214214

215215
if let Some(ref expr) = *opt_expr {
216-
rewrite_unary_prefix(context, &format!("break{id_str} "), &**expr, shape)
216+
rewrite_unary_prefix(context, &format!("break{id_str} "), &**expr, shape).ok()
217217
} else {
218218
Some(format!("break{id_str}"))
219219
}
220220
}
221221
ast::ExprKind::Yield(ref opt_expr) => {
222222
if let Some(ref expr) = *opt_expr {
223-
rewrite_unary_prefix(context, "yield ", &**expr, shape)
223+
rewrite_unary_prefix(context, "yield ", &**expr, shape).ok()
224224
} else {
225225
Some("yield".to_string())
226226
}
@@ -253,15 +253,17 @@ pub(crate) fn format_expr(
253253
}
254254
ast::ExprKind::Ret(None) => Some("return".to_owned()),
255255
ast::ExprKind::Ret(Some(ref expr)) => {
256-
rewrite_unary_prefix(context, "return ", &**expr, shape)
256+
rewrite_unary_prefix(context, "return ", &**expr, shape).ok()
257+
}
258+
ast::ExprKind::Become(ref expr) => {
259+
rewrite_unary_prefix(context, "become ", &**expr, shape).ok()
257260
}
258-
ast::ExprKind::Become(ref expr) => rewrite_unary_prefix(context, "become ", &**expr, shape),
259261
ast::ExprKind::Yeet(None) => Some("do yeet".to_owned()),
260262
ast::ExprKind::Yeet(Some(ref expr)) => {
261-
rewrite_unary_prefix(context, "do yeet ", &**expr, shape)
263+
rewrite_unary_prefix(context, "do yeet ", &**expr, shape).ok()
262264
}
263265
ast::ExprKind::AddrOf(borrow_kind, mutability, ref expr) => {
264-
rewrite_expr_addrof(context, borrow_kind, mutability, expr, shape)
266+
rewrite_expr_addrof(context, borrow_kind, mutability, expr, shape).ok()
265267
}
266268
ast::ExprKind::Cast(ref expr, ref ty) => rewrite_pair(
267269
&**expr,
@@ -344,15 +346,15 @@ pub(crate) fn format_expr(
344346
} else {
345347
default_sp_delim(None, Some(rhs))
346348
};
347-
rewrite_unary_prefix(context, &sp_delim, &*rhs, shape)
349+
rewrite_unary_prefix(context, &sp_delim, &*rhs, shape).ok()
348350
}
349351
(Some(lhs), None) => {
350352
let sp_delim = if context.config.spaces_around_ranges() {
351353
format!(" {delim}")
352354
} else {
353355
default_sp_delim(Some(lhs), None)
354356
};
355-
rewrite_unary_suffix(context, &sp_delim, &*lhs, shape)
357+
rewrite_unary_suffix(context, &sp_delim, &*lhs, shape).ok()
356358
}
357359
(None, None) => Some(delim.to_owned()),
358360
}
@@ -1970,39 +1972,43 @@ pub(crate) fn rewrite_tuple<'a, T: 'a + IntoOverflowableItem<'a>>(
19701972
}
19711973
}
19721974

1973-
pub(crate) fn rewrite_unary_prefix<R: Rewrite>(
1975+
pub(crate) fn rewrite_unary_prefix<R: Rewrite + Spanned>(
19741976
context: &RewriteContext<'_>,
19751977
prefix: &str,
19761978
rewrite: &R,
19771979
shape: Shape,
1978-
) -> Option<String> {
1980+
) -> RewriteResult {
1981+
let shape = shape
1982+
.offset_left(prefix.len())
1983+
.max_width_error(shape.width, rewrite.span())?;
19791984
rewrite
1980-
.rewrite(context, shape.offset_left(prefix.len())?)
1985+
.rewrite_result(context, shape)
19811986
.map(|r| format!("{}{}", prefix, r))
19821987
}
19831988

19841989
// FIXME: this is probably not correct for multi-line Rewrites. we should
19851990
// subtract suffix.len() from the last line budget, not the first!
1986-
pub(crate) fn rewrite_unary_suffix<R: Rewrite>(
1991+
pub(crate) fn rewrite_unary_suffix<R: Rewrite + Spanned>(
19871992
context: &RewriteContext<'_>,
19881993
suffix: &str,
19891994
rewrite: &R,
19901995
shape: Shape,
1991-
) -> Option<String> {
1992-
rewrite
1993-
.rewrite(context, shape.sub_width(suffix.len())?)
1994-
.map(|mut r| {
1995-
r.push_str(suffix);
1996-
r
1997-
})
1996+
) -> RewriteResult {
1997+
let shape = shape
1998+
.sub_width(suffix.len())
1999+
.max_width_error(shape.width, rewrite.span())?;
2000+
rewrite.rewrite_result(context, shape).map(|mut r| {
2001+
r.push_str(suffix);
2002+
r
2003+
})
19982004
}
19992005

20002006
fn rewrite_unary_op(
20012007
context: &RewriteContext<'_>,
20022008
op: ast::UnOp,
20032009
expr: &ast::Expr,
20042010
shape: Shape,
2005-
) -> Option<String> {
2011+
) -> RewriteResult {
20062012
// For some reason, an UnOp is not spanned like BinOp!
20072013
rewrite_unary_prefix(context, op.as_str(), expr, shape)
20082014
}
@@ -2257,7 +2263,7 @@ fn rewrite_expr_addrof(
22572263
mutability: ast::Mutability,
22582264
expr: &ast::Expr,
22592265
shape: Shape,
2260-
) -> Option<String> {
2266+
) -> RewriteResult {
22612267
let operator_str = match (mutability, borrow_kind) {
22622268
(ast::Mutability::Not, ast::BorrowKind::Ref) => "&",
22632269
(ast::Mutability::Not, ast::BorrowKind::Raw) => "&raw const ",

src/patterns.rs

+59-43
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use crate::lists::{
1313
use crate::macros::{rewrite_macro, MacroPosition};
1414
use crate::overflow;
1515
use crate::pairs::{rewrite_pair, PairParts};
16-
use crate::rewrite::{Rewrite, RewriteContext, RewriteErrorExt, RewriteResult};
16+
use crate::rewrite::{Rewrite, RewriteContext, RewriteError, RewriteErrorExt, RewriteResult};
1717
use crate::shape::Shape;
1818
use crate::source_map::SpanUtils;
1919
use crate::spanned::Spanned;
@@ -81,12 +81,16 @@ impl<'a> Rewrite for RangeOperand<'a> {
8181

8282
impl Rewrite for Pat {
8383
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 {
8488
match self.kind {
8589
PatKind::Or(ref pats) => {
8690
let pat_strs = pats
8791
.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>>()?;
9094

9195
let use_mixed_layout = pats
9296
.iter()
@@ -108,7 +112,7 @@ impl Rewrite for Pat {
108112
.separator(" |")
109113
.separator_place(context.config.binop_separator())
110114
.ends_with_newline(false);
111-
write_list(&items, &fmt).ok()
115+
write_list(&items, &fmt)
112116
}
113117
PatKind::Box(ref pat) => rewrite_unary_prefix(context, "box ", &**pat, shape),
114118
PatKind::Ident(BindingMode(by_ref, mutability), ident, ref sub_pat) => {
@@ -122,19 +126,25 @@ impl Rewrite for Pat {
122126
let sub_pat = match *sub_pat {
123127
Some(ref p) => {
124128
// 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())?;
128139
let lo = context.snippet_provider.span_after(self.span, "@");
129140
combine_strs_with_missing_comments(
130141
context,
131142
"@",
132-
&p.rewrite(context, Shape::legacy(width, shape.indent))?,
143+
&p.rewrite_result(context, Shape::legacy(width, shape.indent))?,
133144
mk_sp(lo, p.span.lo()),
134145
shape,
135146
true,
136-
)
137-
.ok()?
147+
)?
138148
}
139149
None => "".to_owned(),
140150
};
@@ -153,8 +163,7 @@ impl Rewrite for Pat {
153163
mk_sp(lo, hi),
154164
shape,
155165
true,
156-
)
157-
.ok()?,
166+
)?,
158167
)
159168
}
160169
(false, true) => (
@@ -183,8 +192,7 @@ impl Rewrite for Pat {
183192
mk_sp(lo, hi),
184193
shape,
185194
true,
186-
)
187-
.ok()?,
195+
)?,
188196
)
189197
}
190198
(false, true) => (first_lo, first),
@@ -201,8 +209,7 @@ impl Rewrite for Pat {
201209
mk_sp(ident.span.hi(), hi),
202210
shape,
203211
true,
204-
)
205-
.ok()?
212+
)?
206213
} else {
207214
id_str.to_owned()
208215
};
@@ -215,23 +222,28 @@ impl Rewrite for Pat {
215222
shape,
216223
true,
217224
)
218-
.ok()
219225
}
220226
PatKind::Wild => {
221227
if 1 <= shape.width {
222-
Some("_".to_owned())
228+
Ok("_".to_owned())
223229
} else {
224-
None
230+
Err(RewriteError::ExceedsMaxWidth {
231+
configured_width: 1,
232+
span: self.span,
233+
})
225234
}
226235
}
227236
PatKind::Rest => {
228237
if 1 <= shape.width {
229-
Some("..".to_owned())
238+
Ok("..".to_owned())
230239
} else {
231-
None
240+
Err(RewriteError::ExceedsMaxWidth {
241+
configured_width: 1,
242+
span: self.span,
243+
})
232244
}
233245
}
234-
PatKind::Never => None,
246+
PatKind::Never => Err(RewriteError::Unknown),
235247
PatKind::Range(ref lhs, ref rhs, ref end_kind) => {
236248
let infix = match end_kind.node {
237249
RangeEnd::Included(RangeSyntax::DotDotDot) => "...",
@@ -267,38 +279,34 @@ impl Rewrite for Pat {
267279
shape,
268280
SeparatorPlace::Front,
269281
)
270-
.ok()
271282
}
272283
PatKind::Ref(ref pat, mutability) => {
273284
let prefix = format!("&{}", format_mutability(mutability));
274285
rewrite_unary_prefix(context, &prefix, &**pat, shape)
275286
}
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),
279288
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)
281290
}
282291
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)
286294
}
287-
PatKind::Lit(ref expr) => expr.rewrite(context, shape),
295+
PatKind::Lit(ref expr) => expr.rewrite_result(context, shape),
288296
PatKind::Slice(ref slice_pat)
289297
if context.config.style_edition() <= StyleEdition::Edition2021 =>
290298
{
291299
let rw: Vec<String> = slice_pat
292300
.iter()
293301
.map(|p| {
294-
if let Some(rw) = p.rewrite(context, shape) {
302+
if let Ok(rw) = p.rewrite_result(context, shape) {
295303
rw
296304
} else {
297305
context.snippet(p.span).to_string()
298306
}
299307
})
300308
.collect();
301-
Some(format!("[{}]", rw.join(", ")))
309+
Ok(format!("[{}]", rw.join(", ")))
302310
}
303311
PatKind::Slice(ref slice_pat) => overflow::rewrite_with_square_brackets(
304312
context,
@@ -308,8 +316,7 @@ impl Rewrite for Pat {
308316
self.span,
309317
None,
310318
None,
311-
)
312-
.ok(),
319+
),
313320
PatKind::Struct(ref qself, ref path, ref fields, rest) => rewrite_struct_pat(
314321
qself,
315322
path,
@@ -318,16 +325,21 @@ impl Rewrite for Pat {
318325
self.span,
319326
context,
320327
shape,
321-
)
322-
.ok(),
328+
),
323329
PatKind::MacCall(ref mac) => {
324-
rewrite_macro(mac, None, context, shape, MacroPosition::Pat)
330+
rewrite_macro(mac, None, context, shape, MacroPosition::Pat).unknown_error()
325331
}
326332
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+
)
328340
.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),
331343
}
332344
}
333345
}
@@ -473,9 +485,13 @@ pub(crate) enum TuplePatField<'a> {
473485

474486
impl<'a> Rewrite for TuplePatField<'a> {
475487
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 {
476492
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()),
479495
}
480496
}
481497
}

src/types.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -802,7 +802,7 @@ impl Rewrite for ast::Ty {
802802
Mutability::Not => "*const ",
803803
};
804804

805-
rewrite_unary_prefix(context, prefix, &*mt.ty, shape).unknown_error()
805+
rewrite_unary_prefix(context, prefix, &*mt.ty, shape)
806806
}
807807
ast::TyKind::Ref(ref lifetime, ref mt) => {
808808
let mut_str = format_mutability(mt.mutbl);

0 commit comments

Comments
 (0)