Skip to content

Commit 457dc79

Browse files
camsteffencalebcartwright
authored andcommitted
Add support for ExprKind::Let
1 parent 2707103 commit 457dc79

File tree

5 files changed

+100
-1
lines changed

5 files changed

+100
-1
lines changed

src/expr.rs

+32-1
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ pub(crate) fn format_expr(
132132
ast::ExprKind::Tup(ref items) => {
133133
rewrite_tuple(context, items.iter(), expr.span, shape, items.len() == 1)
134134
}
135-
ast::ExprKind::Let(..) => None,
135+
ast::ExprKind::Let(ref pat, ref expr, _span) => rewrite_let(context, shape, pat, expr),
136136
ast::ExprKind::If(..)
137137
| ast::ExprKind::ForLoop(..)
138138
| ast::ExprKind::Loop(..)
@@ -1834,6 +1834,37 @@ fn rewrite_tuple_in_visual_indent_style<'a, T: 'a + IntoOverflowableItem<'a>>(
18341834
Some(format!("({list_str})"))
18351835
}
18361836

1837+
fn rewrite_let(
1838+
context: &RewriteContext<'_>,
1839+
shape: Shape,
1840+
pat: &ast::Pat,
1841+
expr: &ast::Expr,
1842+
) -> Option<String> {
1843+
let mut result = "let ".to_owned();
1844+
1845+
// 4 = "let ".len()
1846+
let pat_shape = shape.offset_left(4)?;
1847+
let pat_str = pat.rewrite(context, pat_shape)?;
1848+
result.push_str(&pat_str);
1849+
1850+
result.push_str(" =");
1851+
1852+
let comments_lo = context
1853+
.snippet_provider
1854+
.span_after(expr.span.with_lo(pat.span.hi()), "=");
1855+
let comments_span = mk_sp(comments_lo, expr.span.lo());
1856+
rewrite_assign_rhs_with_comments(
1857+
context,
1858+
result,
1859+
expr,
1860+
shape,
1861+
&RhsAssignKind::Expr(&expr.kind, expr.span),
1862+
RhsTactics::Default,
1863+
comments_span,
1864+
true,
1865+
)
1866+
}
1867+
18371868
pub(crate) fn rewrite_tuple<'a, T: 'a + IntoOverflowableItem<'a>>(
18381869
context: &'a RewriteContext<'_>,
18391870
items: impl Iterator<Item = &'a T>,

tests/source/let_chains.rs

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
fn main() {
2+
if let x = x && x {}
3+
4+
if xxx && let x = x {}
5+
6+
if aaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaa && aaaaaaaaa && let Some(x) = xxxxxxxxxxxx && aaaaaaa && let None = aaaaaaaaaa {}
7+
8+
if aaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaa || aaaaaaaaa && let Some(x) = xxxxxxxxxxxx && aaaaaaa && let None = aaaaaaaaaa {}
9+
10+
if let Some(Struct { x:TS(1,2) }) = path::to::<_>(hehe)
11+
&& let [Simple, people] = /* get ready */ create_universe(/* hi */ GreatPowers).initialize_badminton().populate_swamps() &&
12+
let everybody = (Loops { hi /*hi*/ , ..loopy() }) || summons::triumphantly() { todo!() }
13+
14+
if let XXXXXXXXX { xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx, yyyyyyyyyyyyy, zzzzzzzzzzzzz} = xxxxxxx()
15+
&& let Foo = bar() { todo!() }
16+
}

tests/source/match.rs

+3
Original file line numberDiff line numberDiff line change
@@ -292,6 +292,9 @@ fn guards() {
292292
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
293293
if fooooooooooooooooooooo &&
294294
(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb || cccccccccccccccccccccccccccccccccccccccc) => {}
295+
Hi { friend } if let None = friend => {}
296+
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa if let Some(foooooooooooooo) = hiiiiiiiiiiiiiii => {}
297+
aaaaaaaaaaaaaaaaa if let Superman { powers: Some(goteem), .. } = all::get_random_being::<Super>() => {}
295298
}
296299
}
297300

tests/target/let_chains.rs

+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
fn main() {
2+
if let x = x && x {}
3+
4+
if xxx && let x = x {}
5+
6+
if aaaaaaaaaaaaaaaaaaaaa
7+
&& aaaaaaaaaaaaaaa
8+
&& aaaaaaaaa
9+
&& let Some(x) = xxxxxxxxxxxx
10+
&& aaaaaaa
11+
&& let None = aaaaaaaaaa
12+
{}
13+
14+
if aaaaaaaaaaaaaaaaaaaaa && aaaaaaaaaaaaaaa
15+
|| aaaaaaaaa && let Some(x) = xxxxxxxxxxxx && aaaaaaa && let None = aaaaaaaaaa
16+
{}
17+
18+
if let Some(Struct { x: TS(1, 2) }) = path::to::<_>(hehe)
19+
&& let [Simple, people] = /* get ready */
20+
create_universe(/* hi */ GreatPowers)
21+
.initialize_badminton()
22+
.populate_swamps()
23+
&& let everybody = (Loops {
24+
hi, /*hi*/
25+
..loopy()
26+
})
27+
|| summons::triumphantly()
28+
{
29+
todo!()
30+
}
31+
32+
if let XXXXXXXXX {
33+
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,
34+
yyyyyyyyyyyyy,
35+
zzzzzzzzzzzzz,
36+
} = xxxxxxx()
37+
&& let Foo = bar()
38+
{
39+
todo!()
40+
}
41+
}

tests/target/match.rs

+8
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,14 @@ fn guards() {
317317
if fooooooooooooooooooooo
318318
&& (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
319319
|| cccccccccccccccccccccccccccccccccccccccc) => {}
320+
Hi { friend } if let None = friend => {}
321+
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
322+
if let Some(foooooooooooooo) = hiiiiiiiiiiiiiii => {}
323+
aaaaaaaaaaaaaaaaa
324+
if let Superman {
325+
powers: Some(goteem),
326+
..
327+
} = all::get_random_being::<Super>() => {}
320328
}
321329
}
322330

0 commit comments

Comments
 (0)