Skip to content

Commit b883eeb

Browse files
committed
Format heterogeneous try blocks
1 parent 893e972 commit b883eeb

3 files changed

Lines changed: 97 additions & 2 deletions

File tree

src/expr.rs

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -385,8 +385,33 @@ pub(crate) fn format_expr(
385385
))
386386
}
387387
}
388-
// FIXME: heterogeneous try blocks, which include a type so are harder to format
389-
ast::ExprKind::TryBlock(_, Some(_)) => Err(RewriteError::Unknown),
388+
ast::ExprKind::TryBlock(ref block, Some(ref ty)) => {
389+
let keyword = "try bikeshed ";
390+
// 2 = " {".len()
391+
let ty_shape = shape
392+
.shrink_left(keyword.len())
393+
.and_then(|shape| shape.sub_width(2))
394+
.max_width_error(shape.width, expr.span)?;
395+
let ty_str = ty.rewrite_result(context, ty_shape)?;
396+
let prefix = format!("{keyword}{ty_str} ");
397+
if let rw @ Ok(_) =
398+
rewrite_single_line_block(context, &prefix, block, Some(&expr.attrs), None, shape)
399+
{
400+
rw
401+
} else {
402+
let budget = shape.width.saturating_sub(prefix.len());
403+
Ok(format!(
404+
"{prefix}{}",
405+
rewrite_block(
406+
block,
407+
Some(&expr.attrs),
408+
None,
409+
context,
410+
Shape::legacy(budget, shape.indent)
411+
)?
412+
))
413+
}
414+
}
390415
ast::ExprKind::Gen(capture_by, ref block, ref kind, _) => {
391416
let mover = if matches!(capture_by, ast::CaptureBy::Value { .. }) {
392417
"move "
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
// rustfmt-edition: 2018
2+
3+
fn main() -> Result<(), !> {
4+
let _x = try bikeshed Option<_> {
5+
4
6+
};
7+
8+
try bikeshed Result<_, _> {}
9+
}
10+
11+
fn baz() -> Option<i32> {
12+
if (1 == 1) {
13+
return try bikeshed Option<i32> {
14+
5
15+
};
16+
}
17+
18+
// test
19+
let x = try bikeshed Option<()> {
20+
// try blocks are great
21+
};
22+
23+
let y = try bikeshed Option<i32> {
24+
6
25+
}; // comment
26+
27+
let x = try bikeshed Option<i32> { baz()?; baz()?; baz()?; 7 };
28+
29+
let x = try bikeshed Foo<Bar, Bar, Bar, Bar, Bar, Bar, Bar, Bar, Bar, Bar, Bar, Bar, Bar> { 1 + 1 + 1 };
30+
31+
let x = try bikeshed Foo<Bar, Bar, Bar, Bar, Bar, Bar, Bar, Bar, Bar, Bar, Bar, Bar, Bar, Bar> {};
32+
33+
return None;
34+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
// rustfmt-edition: 2018
2+
3+
fn main() -> Result<(), !> {
4+
let _x = try bikeshed Option<_> { 4 };
5+
6+
try bikeshed Result<_, _> {}
7+
}
8+
9+
fn baz() -> Option<i32> {
10+
if (1 == 1) {
11+
return try bikeshed Option<i32> { 5 };
12+
}
13+
14+
// test
15+
let x = try bikeshed Option<()> {
16+
// try blocks are great
17+
};
18+
19+
let y = try bikeshed Option<i32> { 6 }; // comment
20+
21+
let x = try bikeshed Option<i32> {
22+
baz()?;
23+
baz()?;
24+
baz()?;
25+
7
26+
};
27+
28+
let x = try bikeshed Foo<Bar, Bar, Bar, Bar, Bar, Bar, Bar, Bar, Bar, Bar, Bar, Bar, Bar> {
29+
1 + 1 + 1
30+
};
31+
32+
let x =
33+
try bikeshed Foo<Bar, Bar, Bar, Bar, Bar, Bar, Bar, Bar, Bar, Bar, Bar, Bar, Bar, Bar> {};
34+
35+
return None;
36+
}

0 commit comments

Comments
 (0)