Skip to content

Commit 19a5e1c

Browse files
committed
add extension trait for converting Option to RewriteResult
1 parent 28a4885 commit 19a5e1c

File tree

2 files changed

+55
-63
lines changed

2 files changed

+55
-63
lines changed

src/items.rs

Lines changed: 36 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ use crate::expr::{
2424
use crate::lists::{definitive_tactic, itemize_list, write_list, ListFormatting, Separator};
2525
use crate::macros::{rewrite_macro, MacroPosition};
2626
use crate::overflow;
27-
use crate::rewrite::{Rewrite, RewriteContext, RewriteError, RewriteResult};
27+
use crate::rewrite::{Rewrite, RewriteContext, RewriteError, RewriteErrorExt, RewriteResult};
2828
use crate::shape::{Indent, Shape};
2929
use crate::source_map::{LineRangeUtils, SpanUtils};
3030
use crate::spanned::Spanned;
@@ -78,24 +78,18 @@ impl Rewrite for ast::Local {
7878
shape,
7979
false,
8080
)
81-
.ok_or_else(|| RewriteError::Unknown)?
81+
.unknown_error()?
8282
};
8383
let let_kw_offset = result.len() - "let ".len();
8484

8585
// 4 = "let ".len()
8686
let pat_shape = shape
8787
.offset_left(4)
88-
.ok_or_else(|| RewriteError::ExceedsMaxWidth {
89-
configured_width: shape.width,
90-
span: self.span(),
91-
})?;
88+
.max_width_error(shape.width, self.span())?;
9289
// 1 = ;
9390
let pat_shape = pat_shape
9491
.sub_width(1)
95-
.ok_or_else(|| RewriteError::ExceedsMaxWidth {
96-
configured_width: shape.width,
97-
span: self.span(),
98-
})?;
92+
.max_width_error(shape.width, self.span())?;
9993
let pat_str = self.pat.rewrite_result(context, pat_shape)?;
10094

10195
result.push_str(&pat_str);
@@ -112,16 +106,10 @@ impl Rewrite for ast::Local {
112106
shape
113107
}
114108
.offset_left(last_line_width(&result) + separator.len())
115-
.ok_or_else(|| RewriteError::ExceedsMaxWidth {
116-
configured_width: shape.width,
117-
span: self.span(),
118-
})?
109+
.max_width_error(shape.width, self.span())?
119110
// 2 = ` =`
120111
.sub_width(2)
121-
.ok_or_else(|| RewriteError::ExceedsMaxWidth {
122-
configured_width: shape.width,
123-
span: self.span(),
124-
})?;
112+
.max_width_error(shape.width, self.span())?;
125113

126114
let rewrite = ty.rewrite_result(context, ty_shape)?;
127115

@@ -140,7 +128,7 @@ impl Rewrite for ast::Local {
140128

141129
if let Some((init, else_block)) = self.kind.init_else_opt() {
142130
// 1 = trailing semicolon;
143-
let nested_shape = shape.sub_width(1).ok_or_else(|| RewriteError::Unknown)?;
131+
let nested_shape = shape.sub_width(1).unknown_error()?;
144132

145133
result = rewrite_assign_rhs(
146134
context,
@@ -149,10 +137,7 @@ impl Rewrite for ast::Local {
149137
&RhsAssignKind::Expr(&init.kind, init.span),
150138
nested_shape,
151139
)
152-
.ok_or_else(|| RewriteError::ExceedsMaxWidth {
153-
configured_width: shape.width,
154-
span: self.span(),
155-
})?;
140+
.max_width_error(shape.width, self.span())?;
156141

157142
if let Some(block) = else_block {
158143
let else_kw_span = init.span.between(block.span);
@@ -195,7 +180,7 @@ impl Rewrite for ast::Local {
195180

196181
let mut rw_else_block =
197182
rewrite_let_else_block(block, allow_single_line, context, shape)
198-
.ok_or_else(|| RewriteError::Unknown)?;
183+
.unknown_error()?;
199184

200185
let single_line_else = !rw_else_block.contains('\n');
201186
// +1 for the trailing `;`
@@ -204,8 +189,8 @@ impl Rewrite for ast::Local {
204189
if allow_single_line && single_line_else && else_block_exceeds_width {
205190
// writing this on one line would exceed the available width
206191
// so rewrite the else block over multiple lines.
207-
rw_else_block = rewrite_let_else_block(block, false, context, shape)
208-
.ok_or_else(|| RewriteError::Unknown)?;
192+
rw_else_block =
193+
rewrite_let_else_block(block, false, context, shape).unknown_error()?;
209194
}
210195

211196
result.push_str(&rw_else_block);
@@ -1916,7 +1901,7 @@ pub(crate) fn rewrite_struct_field(
19161901
shape,
19171902
attrs_extendable,
19181903
)
1919-
.ok_or_else(|| RewriteError::Unknown)?;
1904+
.unknown_error()?;
19201905
let overhead = trimmed_last_line_width(&attr_prefix);
19211906
let lhs_offset = lhs_max_width.saturating_sub(overhead);
19221907
for _ in 0..lhs_offset {
@@ -1931,12 +1916,9 @@ pub(crate) fn rewrite_struct_field(
19311916
// let orig_ty = shape
19321917
// .offset_left(overhead + spacing.len())
19331918
// .and_then(|ty_shape| field.ty.rewrite(context, ty_shape));
1934-
let ty_shape = shape.offset_left(overhead + spacing.len()).ok_or_else(|| {
1935-
RewriteError::ExceedsMaxWidth {
1936-
configured_width: shape.width,
1937-
span: field.span(),
1938-
}
1939-
})?;
1919+
let ty_shape = shape
1920+
.offset_left(overhead + spacing.len())
1921+
.max_width_error(shape.width, field.ty.span())?;
19401922
let orig_ty = field.ty.rewrite_result(context, ty_shape);
19411923
if let Ok(ref ty) = orig_ty {
19421924
if !ty.contains('\n') && !contains_comment(context.snippet(missing_span)) {
@@ -1947,15 +1929,15 @@ pub(crate) fn rewrite_struct_field(
19471929
let is_prefix_empty = prefix.is_empty();
19481930
// We must use multiline. We are going to put attributes and a field on different lines.
19491931
let field_str = rewrite_assign_rhs(context, prefix, &*field.ty, &RhsAssignKind::Ty, shape)
1950-
.ok_or_else(|| RewriteError::Unknown)?;
1932+
.unknown_error()?;
19511933
// Remove a leading white-space from `rewrite_assign_rhs()` when rewriting a tuple struct.
19521934
let field_str = if is_prefix_empty {
19531935
field_str.trim_start()
19541936
} else {
19551937
&field_str
19561938
};
19571939
combine_strs_with_missing_comments(context, &attrs_str, field_str, missing_span, shape, false)
1958-
.ok_or_else(|| RewriteError::Unknown)
1940+
.unknown_error()
19591941
}
19601942

19611943
pub(crate) struct StaticParts<'a> {
@@ -2126,12 +2108,10 @@ impl Rewrite for ast::FnRetTy {
21262108
if context.config.version() == Version::One
21272109
|| context.config.indent_style() == IndentStyle::Visual
21282110
{
2129-
let inner_width = shape.width.checked_sub(3).ok_or_else(|| {
2130-
RewriteError::ExceedsMaxWidth {
2131-
configured_width: shape.width,
2132-
span: self.span(),
2133-
}
2134-
})?;
2111+
let inner_width = shape
2112+
.width
2113+
.checked_sub(3)
2114+
.max_width_error(shape.width, self.span())?;
21352115
return ty
21362116
.rewrite_result(context, Shape::legacy(inner_width, shape.indent + 3))
21372117
.map(|r| format!("-> {}", r));
@@ -2140,10 +2120,7 @@ impl Rewrite for ast::FnRetTy {
21402120
// 3 = "-> "
21412121
let shape = shape
21422122
.offset_left(3)
2143-
.ok_or_else(|| RewriteError::ExceedsMaxWidth {
2144-
configured_width: shape.width,
2145-
span: self.span(),
2146-
})?;
2123+
.max_width_error(shape.width, self.span())?;
21472124

21482125
ty.rewrite_result(context, shape)
21492126
.map(|s| format!("-> {}", s))
@@ -2238,7 +2215,7 @@ impl Rewrite for ast::Param {
22382215
shape,
22392216
!has_multiple_attr_lines && !has_doc_comments,
22402217
)
2241-
.ok_or_else(|| RewriteError::Unknown)?;
2218+
.unknown_error()?;
22422219

22432220
if !is_empty_infer(&*self.ty, self.pat.span) {
22442221
let (before_comment, after_comment) =
@@ -2247,12 +2224,10 @@ impl Rewrite for ast::Param {
22472224
result.push_str(colon_spaces(context.config));
22482225
result.push_str(&after_comment);
22492226
let overhead = last_line_width(&result);
2250-
let max_width = shape.width.checked_sub(overhead).ok_or_else(|| {
2251-
RewriteError::ExceedsMaxWidth {
2252-
configured_width: shape.width,
2253-
span: self.span(),
2254-
}
2255-
})?;
2227+
let max_width = shape
2228+
.width
2229+
.checked_sub(overhead)
2230+
.max_width_error(shape.width, self.span())?;
22562231
if let Ok(ty_str) = self
22572232
.ty
22582233
.rewrite_result(context, Shape::legacy(max_width, shape.indent))
@@ -2273,17 +2248,15 @@ impl Rewrite for ast::Param {
22732248
shape,
22742249
!has_multiple_attr_lines,
22752250
)
2276-
.ok_or_else(|| RewriteError::Unknown)?;
2251+
.unknown_error()?;
22772252
result.push_str(&before_comment);
22782253
result.push_str(colon_spaces(context.config));
22792254
result.push_str(&after_comment);
22802255
let overhead = last_line_width(&result);
2281-
let max_width = shape.width.checked_sub(overhead).ok_or_else(|| {
2282-
RewriteError::ExceedsMaxWidth {
2283-
configured_width: shape.width,
2284-
span: self.span(),
2285-
}
2286-
})?;
2256+
let max_width = shape
2257+
.width
2258+
.checked_sub(overhead)
2259+
.max_width_error(shape.width, self.span())?;
22872260
let ty_str = self
22882261
.ty
22892262
.rewrite_result(context, Shape::legacy(max_width, shape.indent))?;
@@ -2323,7 +2296,7 @@ fn rewrite_explicit_self(
23232296
shape,
23242297
!has_multiple_attr_lines,
23252298
)
2326-
.ok_or_else(|| RewriteError::Unknown)?)
2299+
.unknown_error()?)
23272300
}
23282301
None => Ok(combine_strs_with_missing_comments(
23292302
context,
@@ -2333,7 +2306,7 @@ fn rewrite_explicit_self(
23332306
shape,
23342307
!has_multiple_attr_lines,
23352308
)
2336-
.ok_or_else(|| RewriteError::Unknown)?),
2309+
.unknown_error()?),
23372310
}
23382311
}
23392312
ast::SelfKind::Explicit(ref ty, mutability) => {
@@ -2350,7 +2323,7 @@ fn rewrite_explicit_self(
23502323
shape,
23512324
!has_multiple_attr_lines,
23522325
)
2353-
.ok_or_else(|| RewriteError::Unknown)?)
2326+
.unknown_error()?)
23542327
}
23552328
ast::SelfKind::Value(mutability) => Ok(combine_strs_with_missing_comments(
23562329
context,
@@ -2360,7 +2333,7 @@ fn rewrite_explicit_self(
23602333
shape,
23612334
!has_multiple_attr_lines,
23622335
)
2363-
.ok_or_else(|| RewriteError::Unknown)?),
2336+
.unknown_error()?),
23642337
}
23652338
}
23662339

src/rewrite.rs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,25 @@ pub(crate) enum RewriteError {
4242
Unknown,
4343
}
4444

45+
/// Extension trait used to conveniently convert to RewriteError
46+
pub(crate) trait RewriteErrorExt<T> {
47+
fn max_width_error(self, width: usize, span: Span) -> Result<T, RewriteError>;
48+
fn unknown_error(self) -> Result<T, RewriteError>;
49+
}
50+
51+
impl<T> RewriteErrorExt<T> for Option<T> {
52+
fn max_width_error(self, width: usize, span: Span) -> Result<T, RewriteError> {
53+
self.ok_or_else(|| RewriteError::ExceedsMaxWidth {
54+
configured_width: width,
55+
span: span,
56+
})
57+
}
58+
59+
fn unknown_error(self) -> Result<T, RewriteError> {
60+
self.ok_or_else(|| RewriteError::Unknown)
61+
}
62+
}
63+
4564
#[derive(Clone)]
4665
pub(crate) struct RewriteContext<'a> {
4766
pub(crate) psess: &'a ParseSess,

0 commit comments

Comments
 (0)