@@ -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