Skip to content

Commit 13ce2e2

Browse files
committed
minor: Handle the final statement in SyntaxFactory::block_expr properly
This caused a bug that was rather tricky to hunt down!
1 parent 0ad3509 commit 13ce2e2

File tree

1 file changed

+15
-6
lines changed

1 file changed

+15
-6
lines changed

crates/syntax/src/ast/syntax_factory/constructors.rs

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,22 +32,31 @@ impl SyntaxFactory {
3232
tail_expr: Option<ast::Expr>,
3333
) -> ast::BlockExpr {
3434
let stmts = stmts.into_iter().collect_vec();
35-
let input = stmts.iter().map(|it| it.syntax().clone()).collect_vec();
35+
let mut input = stmts.iter().map(|it| it.syntax().clone()).collect_vec();
3636

3737
let ast = make::block_expr(stmts, tail_expr.clone()).clone_for_update();
3838

39-
if let Some((mut mapping, stmt_list)) = self.mappings().zip(ast.stmt_list()) {
39+
if let Some(mut mapping) = self.mappings() {
40+
let stmt_list = ast.stmt_list().unwrap();
4041
let mut builder = SyntaxMappingBuilder::new(stmt_list.syntax().clone());
4142

43+
if let Some(input) = tail_expr {
44+
builder.map_node(
45+
input.syntax().clone(),
46+
stmt_list.tail_expr().unwrap().syntax().clone(),
47+
);
48+
} else if let Some(ast_tail) = stmt_list.tail_expr() {
49+
// The parser interpreted the last statement (probably a statement with a block) as an Expr
50+
let last_stmt = input.pop().unwrap();
51+
52+
builder.map_node(last_stmt, ast_tail.syntax().clone());
53+
}
54+
4255
builder.map_children(
4356
input.into_iter(),
4457
stmt_list.statements().map(|it| it.syntax().clone()),
4558
);
4659

47-
if let Some((input, output)) = tail_expr.zip(stmt_list.tail_expr()) {
48-
builder.map_node(input.syntax().clone(), output.syntax().clone());
49-
}
50-
5160
builder.finish(&mut mapping);
5261
}
5362

0 commit comments

Comments
 (0)