@@ -3,20 +3,34 @@ use std::iter::{IntoIterator, once};
33use std:: vec:: IntoIter ;
44
55pub fn expr < ' a > (
6- ast : & ' a [ Expr < ' a > ] ,
6+ xs : & ' a [ Expr < ' a > ] ,
77) -> impl Iterator < Item = & ' a str > + ' a {
8- ast. iter ( ) . flat_map ( expr_one)
8+ xs. iter ( )
9+ . enumerate ( )
10+ . flat_map ( |( i, x) | expr_ast ( i + 1 == xs. len ( ) , x) )
911}
1012
11- fn expr_one < ' a > ( ast : & ' a Expr < ' a > ) -> IntoIter < & ' a str > {
13+ fn expr_ast < ' a > (
14+ last : bool ,
15+ ast : & ' a Expr < ' a > ,
16+ ) -> IntoIter < & ' a str > {
17+ let end = if last { vec ! [ ] } else { vec ! [ ";" ] } ;
1218 match ast {
13- Expr :: Mod ( x) => vec ! [ "mod " , x, ";" ] . into_iter ( ) ,
19+ Expr :: Mod ( x) => vec ! [ "mod " , x, ";" ] ,
1420 Expr :: Use ( x) => expr_use ( true , x)
1521 . chain ( once ( ";" ) )
16- . collect :: < Vec < _ > > ( )
17- . into_iter ( ) ,
18- Expr :: Raw ( x) => vec ! [ * x] . into_iter ( ) ,
22+ . collect :: < Vec < _ > > ( ) ,
23+ Expr :: Jump ( x) => {
24+ expr_jump ( x) . chain ( end) . collect :: < Vec < _ > > ( )
25+ }
26+ Expr :: Block ( xs) => once ( "{" )
27+ . chain ( expr ( xs) )
28+ . chain ( once ( "}" ) )
29+ . chain ( end)
30+ . collect :: < Vec < _ > > ( ) ,
31+ Expr :: Raw ( x) => vec ! [ * x] ,
1932 }
33+ . into_iter ( )
2034}
2135
2236fn expr_use < ' a > (
@@ -42,6 +56,19 @@ fn expr_use<'a>(
4256 x0. into_iter ( ) . chain ( x1) . collect :: < Vec < _ > > ( ) . into_iter ( )
4357}
4458
59+ fn expr_jump < ' a > (
60+ ast : & ' a ExprJump < ' a > ,
61+ ) -> IntoIter < & ' a str > {
62+ match ast {
63+ ExprJump :: Break => vec ! [ "break" ] ,
64+ ExprJump :: Continue => vec ! [ "continue" ] ,
65+ ExprJump :: Return ( x) => once ( "return " )
66+ . chain ( expr_ast ( true , x) )
67+ . collect :: < Vec < _ > > ( ) ,
68+ }
69+ . into_iter ( )
70+ }
71+
4572fn expr_use_item < ' a > (
4673 module : & ' a str ,
4774 rename : Option < & ' a str > ,
0 commit comments