@@ -79,9 +79,17 @@ def_tag!(undeserializable, "oiqjweoifjqwoeifjwqoiefjqwoiej");
7979#[ derive( Deserialize , Debug , Clone ) ]
8080pub struct ToProc ( pub undeserializable , pub Box < Expression > ) ;
8181
82+ def_tag ! (
83+ undeserializable_anon_block_arg,
84+ "oiqjweoifjqwoeifjwqoiefjqwoiej_anon_block_arg"
85+ ) ;
86+ #[ derive( Deserialize , Debug , Clone ) ]
87+ pub struct AnonBlockArg ( pub undeserializable_anon_block_arg , pub u64 ) ;
88+
8289#[ derive( RipperDeserialize , Debug , Clone ) ]
8390pub enum Expression {
8491 ToProc ( ToProc ) ,
92+ AnonBlockArg ( AnonBlockArg ) ,
8593 Class ( Class ) ,
8694 If ( If ) ,
8795 Unary ( Unary ) ,
@@ -296,6 +304,9 @@ impl Expression {
296304 // Arefs only have an accurate closing line and not a starting line,
297305 // so don't use it here
298306 Expression :: Aref ( Aref ( _, expr, ..) ) => expr. start_line ( ) ,
307+ // Anonymous block arguments have no location information, so we use the end of the
308+ // original enclosing `args_add_block` node.
309+ Expression :: AnonBlockArg ( AnonBlockArg ( .., line_start) ) => Some ( * line_start) ,
299310 }
300311 }
301312}
@@ -1298,7 +1309,7 @@ pub struct KwRestParam(pub kw_rest_param_tag, pub Option<Ident>);
12981309
12991310def_tag ! ( blockarg_tag, "blockarg" ) ;
13001311#[ derive( Deserialize , Debug , Clone ) ]
1301- pub struct BlockArg ( pub blockarg_tag , pub Ident ) ;
1312+ pub struct BlockArg ( pub blockarg_tag , pub Option < Ident > ) ;
13021313
13031314#[ derive( Deserialize , Debug , Clone ) ]
13041315pub struct LineCol ( pub LineNumber , pub u64 ) ;
@@ -1350,26 +1361,30 @@ pub fn normalize_args_add_block_or_expression_list(
13501361pub fn normalize_args_add_block ( aab : ArgsAddBlock ) -> ArgsAddStarOrExpressionListOrArgsForward {
13511362 // .1 is expression list
13521363 // .2 is block
1353- match aab. 2 {
1354- ToProcExpr :: NotPresent ( _) => ( aab. 1 ) . into_args_add_star_or_expression_list ( ) ,
1355- ToProcExpr :: Present ( e) => {
1356- let trailing_expr_as_vec = vec ! [ Expression :: ToProc ( ToProc ( undeserializable, e) ) ] ;
1357-
1358- match ( aab. 1 ) . into_args_add_star_or_expression_list ( ) {
1359- ArgsAddStarOrExpressionListOrArgsForward :: ExpressionList ( items) => {
1360- ArgsAddStarOrExpressionListOrArgsForward :: ExpressionList (
1361- vec ! [ items, trailing_expr_as_vec] . concat ( ) ,
1362- )
1363- }
1364- ArgsAddStarOrExpressionListOrArgsForward :: ArgsAddStar ( aas) => {
1365- let mut new_aas = aas;
1366- new_aas. 3 = vec ! [ new_aas. 3 , trailing_expr_as_vec] . concat ( ) ;
1367- ArgsAddStarOrExpressionListOrArgsForward :: ArgsAddStar ( new_aas)
1368- }
1369- ArgsAddStarOrExpressionListOrArgsForward :: ArgsForward ( af) => {
1370- ArgsAddStarOrExpressionListOrArgsForward :: ArgsForward ( af)
1371- }
1372- }
1364+
1365+ let trailing_expr = match aab. 2 {
1366+ Some ( ToProcExpr :: NotPresent ( _) ) => {
1367+ return ( aab. 1 ) . into_args_add_star_or_expression_list ( ) ;
1368+ }
1369+ Some ( ToProcExpr :: Present ( e) ) => Expression :: ToProc ( ToProc ( undeserializable, e) ) ,
1370+ // anonymous block
1371+ None => Expression :: AnonBlockArg ( AnonBlockArg (
1372+ undeserializable_anon_block_arg,
1373+ aab. 3 . end_line ( ) ,
1374+ ) ) ,
1375+ } ;
1376+
1377+ match ( aab. 1 ) . into_args_add_star_or_expression_list ( ) {
1378+ ArgsAddStarOrExpressionListOrArgsForward :: ExpressionList ( mut items) => {
1379+ items. push ( trailing_expr) ;
1380+ ArgsAddStarOrExpressionListOrArgsForward :: ExpressionList ( items)
1381+ }
1382+ ArgsAddStarOrExpressionListOrArgsForward :: ArgsAddStar ( mut aas) => {
1383+ aas. 3 . push ( trailing_expr) ;
1384+ ArgsAddStarOrExpressionListOrArgsForward :: ArgsAddStar ( aas)
1385+ }
1386+ ArgsAddStarOrExpressionListOrArgsForward :: ArgsForward ( af) => {
1387+ ArgsAddStarOrExpressionListOrArgsForward :: ArgsForward ( af)
13731388 }
13741389 }
13751390}
@@ -1420,7 +1435,7 @@ def_tag!(args_add_block_tag, "args_add_block");
14201435pub struct ArgsAddBlock (
14211436 pub args_add_block_tag ,
14221437 pub ArgsAddBlockInner ,
1423- pub ToProcExpr ,
1438+ pub Option < ToProcExpr > ,
14241439 pub StartEnd ,
14251440) ;
14261441
0 commit comments