@@ -408,7 +408,8 @@ impl Body {
408
408
f ( else_branch) ;
409
409
}
410
410
}
411
- Expr :: Let { expr, .. } => {
411
+ Expr :: Let { expr, pat } => {
412
+ self . walk_exprs_in_pat ( * pat, & mut f) ;
412
413
f ( * expr) ;
413
414
}
414
415
Expr :: Block { statements, tail, .. }
@@ -444,7 +445,10 @@ impl Body {
444
445
}
445
446
Expr :: Match { expr, arms } => {
446
447
f ( * expr) ;
447
- arms. iter ( ) . map ( |arm| arm. expr ) . for_each ( f) ;
448
+ arms. iter ( ) . for_each ( |arm| {
449
+ f ( arm. expr ) ;
450
+ self . walk_exprs_in_pat ( arm. pat , & mut f) ;
451
+ } ) ;
448
452
}
449
453
Expr :: Break { expr, .. }
450
454
| Expr :: Return { expr }
@@ -505,6 +509,131 @@ impl Body {
505
509
}
506
510
}
507
511
512
+ pub fn walk_child_exprs_without_pats ( & self , expr_id : ExprId , mut f : impl FnMut ( ExprId ) ) {
513
+ let expr = & self [ expr_id] ;
514
+ match expr {
515
+ Expr :: Continue { .. }
516
+ | Expr :: Const ( _)
517
+ | Expr :: Missing
518
+ | Expr :: Path ( _)
519
+ | Expr :: OffsetOf ( _)
520
+ | Expr :: Literal ( _)
521
+ | Expr :: Underscore => { }
522
+ Expr :: InlineAsm ( it) => it. operands . iter ( ) . for_each ( |( _, op) | match op {
523
+ AsmOperand :: In { expr, .. }
524
+ | AsmOperand :: Out { expr : Some ( expr) , .. }
525
+ | AsmOperand :: InOut { expr, .. } => f ( * expr) ,
526
+ AsmOperand :: SplitInOut { in_expr, out_expr, .. } => {
527
+ f ( * in_expr) ;
528
+ if let Some ( out_expr) = out_expr {
529
+ f ( * out_expr) ;
530
+ }
531
+ }
532
+ AsmOperand :: Out { expr : None , .. }
533
+ | AsmOperand :: Const ( _)
534
+ | AsmOperand :: Label ( _)
535
+ | AsmOperand :: Sym ( _) => ( ) ,
536
+ } ) ,
537
+ Expr :: If { condition, then_branch, else_branch } => {
538
+ f ( * condition) ;
539
+ f ( * then_branch) ;
540
+ if let & Some ( else_branch) = else_branch {
541
+ f ( else_branch) ;
542
+ }
543
+ }
544
+ Expr :: Let { expr, .. } => {
545
+ f ( * expr) ;
546
+ }
547
+ Expr :: Block { statements, tail, .. }
548
+ | Expr :: Unsafe { statements, tail, .. }
549
+ | Expr :: Async { statements, tail, .. } => {
550
+ for stmt in statements. iter ( ) {
551
+ match stmt {
552
+ Statement :: Let { initializer, else_branch, .. } => {
553
+ if let & Some ( expr) = initializer {
554
+ f ( expr) ;
555
+ }
556
+ if let & Some ( expr) = else_branch {
557
+ f ( expr) ;
558
+ }
559
+ }
560
+ Statement :: Expr { expr : expression, .. } => f ( * expression) ,
561
+ Statement :: Item ( _) => ( ) ,
562
+ }
563
+ }
564
+ if let & Some ( expr) = tail {
565
+ f ( expr) ;
566
+ }
567
+ }
568
+ Expr :: Loop { body, .. } => f ( * body) ,
569
+ Expr :: Call { callee, args, .. } => {
570
+ f ( * callee) ;
571
+ args. iter ( ) . copied ( ) . for_each ( f) ;
572
+ }
573
+ Expr :: MethodCall { receiver, args, .. } => {
574
+ f ( * receiver) ;
575
+ args. iter ( ) . copied ( ) . for_each ( f) ;
576
+ }
577
+ Expr :: Match { expr, arms } => {
578
+ f ( * expr) ;
579
+ arms. iter ( ) . map ( |arm| arm. expr ) . for_each ( f) ;
580
+ }
581
+ Expr :: Break { expr, .. }
582
+ | Expr :: Return { expr }
583
+ | Expr :: Yield { expr }
584
+ | Expr :: Yeet { expr } => {
585
+ if let & Some ( expr) = expr {
586
+ f ( expr) ;
587
+ }
588
+ }
589
+ Expr :: Become { expr } => f ( * expr) ,
590
+ Expr :: RecordLit { fields, spread, .. } => {
591
+ for field in fields. iter ( ) {
592
+ f ( field. expr ) ;
593
+ }
594
+ if let & Some ( expr) = spread {
595
+ f ( expr) ;
596
+ }
597
+ }
598
+ Expr :: Closure { body, .. } => {
599
+ f ( * body) ;
600
+ }
601
+ Expr :: BinaryOp { lhs, rhs, .. } => {
602
+ f ( * lhs) ;
603
+ f ( * rhs) ;
604
+ }
605
+ Expr :: Range { lhs, rhs, .. } => {
606
+ if let & Some ( lhs) = rhs {
607
+ f ( lhs) ;
608
+ }
609
+ if let & Some ( rhs) = lhs {
610
+ f ( rhs) ;
611
+ }
612
+ }
613
+ Expr :: Index { base, index, .. } => {
614
+ f ( * base) ;
615
+ f ( * index) ;
616
+ }
617
+ Expr :: Field { expr, .. }
618
+ | Expr :: Await { expr }
619
+ | Expr :: Cast { expr, .. }
620
+ | Expr :: Ref { expr, .. }
621
+ | Expr :: UnaryOp { expr, .. }
622
+ | Expr :: Box { expr } => {
623
+ f ( * expr) ;
624
+ }
625
+ Expr :: Tuple { exprs, .. } => exprs. iter ( ) . copied ( ) . for_each ( f) ,
626
+ Expr :: Array ( a) => match a {
627
+ Array :: ElementList { elements, .. } => elements. iter ( ) . copied ( ) . for_each ( f) ,
628
+ Array :: Repeat { initializer, repeat } => {
629
+ f ( * initializer) ;
630
+ f ( * repeat)
631
+ }
632
+ } ,
633
+ & Expr :: Assignment { target : _, value } => f ( value) ,
634
+ }
635
+ }
636
+
508
637
pub fn walk_exprs_in_pat ( & self , pat_id : PatId , f : & mut impl FnMut ( ExprId ) ) {
509
638
self . walk_pats ( pat_id, & mut |pat| {
510
639
if let Pat :: Expr ( expr) | Pat :: ConstBlock ( expr) = self [ pat] {
0 commit comments