@@ -58,22 +58,31 @@ impl SyntaxFactory {
58
58
tail_expr : Option < ast:: Expr > ,
59
59
) -> ast:: BlockExpr {
60
60
let stmts = stmts. into_iter ( ) . collect_vec ( ) ;
61
- let input = stmts. iter ( ) . map ( |it| it. syntax ( ) . clone ( ) ) . collect_vec ( ) ;
61
+ let mut input = stmts. iter ( ) . map ( |it| it. syntax ( ) . clone ( ) ) . collect_vec ( ) ;
62
62
63
63
let ast = make:: block_expr ( stmts, tail_expr. clone ( ) ) . clone_for_update ( ) ;
64
64
65
- if let Some ( ( mut mapping, stmt_list) ) = self . mappings ( ) . zip ( ast. stmt_list ( ) ) {
65
+ if let Some ( mut mapping) = self . mappings ( ) {
66
+ let stmt_list = ast. stmt_list ( ) . unwrap ( ) ;
66
67
let mut builder = SyntaxMappingBuilder :: new ( stmt_list. syntax ( ) . clone ( ) ) ;
67
68
69
+ if let Some ( input) = tail_expr {
70
+ builder. map_node (
71
+ input. syntax ( ) . clone ( ) ,
72
+ stmt_list. tail_expr ( ) . unwrap ( ) . syntax ( ) . clone ( ) ,
73
+ ) ;
74
+ } else if let Some ( ast_tail) = stmt_list. tail_expr ( ) {
75
+ // The parser interpreted the last statement (probably a statement with a block) as an Expr
76
+ let last_stmt = input. pop ( ) . unwrap ( ) ;
77
+
78
+ builder. map_node ( last_stmt, ast_tail. syntax ( ) . clone ( ) ) ;
79
+ }
80
+
68
81
builder. map_children (
69
82
input. into_iter ( ) ,
70
83
stmt_list. statements ( ) . map ( |it| it. syntax ( ) . clone ( ) ) ,
71
84
) ;
72
85
73
- if let Some ( ( input, output) ) = tail_expr. zip ( stmt_list. tail_expr ( ) ) {
74
- builder. map_node ( input. syntax ( ) . clone ( ) , output. syntax ( ) . clone ( ) ) ;
75
- }
76
-
77
86
builder. finish ( & mut mapping) ;
78
87
}
79
88
0 commit comments