@@ -647,11 +647,17 @@ impl<'tcx> Pat<'tcx> {
647
647
_ => None ,
648
648
}
649
649
}
650
+ }
650
651
652
+ impl < ' tcx > Thir < ' tcx > {
651
653
/// Call `f` on every "binding" in a pattern, e.g., on `a` in
652
654
/// `match foo() { Some(a) => (), None => () }`
653
- pub fn each_binding ( & self , mut f : impl FnMut ( Symbol , ByRef , Ty < ' tcx > , Span ) ) {
654
- self . walk_always ( |p| {
655
+ pub fn each_pat_binding (
656
+ & self ,
657
+ pat : & Pat < ' tcx > ,
658
+ mut f : impl FnMut ( Symbol , ByRef , Ty < ' tcx > , Span ) ,
659
+ ) {
660
+ self . walk_pat_always ( pat, |p| {
655
661
if let PatKind :: Binding { name, mode, ty, .. } = p. kind {
656
662
f ( name, mode. 0 , ty, p. span ) ;
657
663
}
@@ -661,17 +667,17 @@ impl<'tcx> Pat<'tcx> {
661
667
/// Walk the pattern in left-to-right order.
662
668
///
663
669
/// If `it(pat)` returns `false`, the children are not visited.
664
- pub fn walk ( & self , mut it : impl FnMut ( & Pat < ' tcx > ) -> bool ) {
665
- self . walk_ ( & mut it)
670
+ pub fn walk_pat ( & self , pat : & Pat < ' tcx > , mut it : impl FnMut ( & Pat < ' tcx > ) -> bool ) {
671
+ self . walk_pat_inner ( pat , & mut it) ;
666
672
}
667
673
668
- fn walk_ ( & self , it : & mut impl FnMut ( & Pat < ' tcx > ) -> bool ) {
669
- if !it ( self ) {
674
+ fn walk_pat_inner ( & self , pat : & Pat < ' tcx > , it : & mut impl FnMut ( & Pat < ' tcx > ) -> bool ) {
675
+ if !it ( pat ) {
670
676
return ;
671
677
}
672
678
673
679
use PatKind :: * ;
674
- match & self . kind {
680
+ match & pat . kind {
675
681
Wild
676
682
| Never
677
683
| Range ( ..)
@@ -682,22 +688,24 @@ impl<'tcx> Pat<'tcx> {
682
688
| Binding { subpattern : Some ( subpattern) , .. }
683
689
| Deref { subpattern }
684
690
| DerefPattern { subpattern, .. }
685
- | ExpandedConstant { subpattern, .. } => subpattern . walk_ ( it) ,
691
+ | ExpandedConstant { subpattern, .. } => self . walk_pat_inner ( subpattern , it) ,
686
692
Leaf { subpatterns } | Variant { subpatterns, .. } => {
687
- subpatterns. iter ( ) . for_each ( |field| field. pattern . walk_ ( it) )
693
+ subpatterns. iter ( ) . for_each ( |field| self . walk_pat_inner ( & field. pattern , it) )
688
694
}
689
- Or { pats } => pats. iter ( ) . for_each ( |p| p . walk_ ( it) ) ,
695
+ Or { pats } => pats. iter ( ) . for_each ( |p| self . walk_pat_inner ( p , it) ) ,
690
696
Array { box ref prefix, ref slice, box ref suffix }
691
- | Slice { box ref prefix, ref slice, box ref suffix } => {
692
- prefix. iter ( ) . chain ( slice. iter ( ) ) . chain ( suffix. iter ( ) ) . for_each ( |p| p. walk_ ( it) )
693
- }
697
+ | Slice { box ref prefix, ref slice, box ref suffix } => prefix
698
+ . iter ( )
699
+ . chain ( slice. iter ( ) )
700
+ . chain ( suffix. iter ( ) )
701
+ . for_each ( |p| self . walk_pat_inner ( p, it) ) ,
694
702
}
695
703
}
696
704
697
705
/// Whether the pattern has a `PatKind::Error` nested within.
698
- pub fn pat_error_reported ( & self ) -> Result < ( ) , ErrorGuaranteed > {
706
+ pub fn pat_error_reported ( & self , pat : & Pat < ' tcx > ) -> Result < ( ) , ErrorGuaranteed > {
699
707
let mut error = None ;
700
- self . walk ( |pat| {
708
+ self . walk_pat ( pat , |pat| {
701
709
if let PatKind :: Error ( e) = pat. kind
702
710
&& error. is_none ( )
703
711
{
@@ -714,23 +722,23 @@ impl<'tcx> Pat<'tcx> {
714
722
/// Walk the pattern in left-to-right order.
715
723
///
716
724
/// If you always want to recurse, prefer this method over `walk`.
717
- pub fn walk_always ( & self , mut it : impl FnMut ( & Pat < ' tcx > ) ) {
718
- self . walk ( |p| {
725
+ pub fn walk_pat_always ( & self , pat : & Pat < ' tcx > , mut it : impl FnMut ( & Pat < ' tcx > ) ) {
726
+ self . walk_pat ( pat , |p| {
719
727
it ( p) ;
720
728
true
721
729
} )
722
730
}
723
731
724
732
/// Whether this a never pattern.
725
- pub fn is_never_pattern ( & self ) -> bool {
733
+ pub fn is_never_pattern ( & self , pat : & Pat < ' tcx > ) -> bool {
726
734
let mut is_never_pattern = false ;
727
- self . walk ( |pat| match & pat. kind {
735
+ self . walk_pat ( pat , |pat| match & pat. kind {
728
736
PatKind :: Never => {
729
737
is_never_pattern = true ;
730
738
false
731
739
}
732
740
PatKind :: Or { pats } => {
733
- is_never_pattern = pats. iter ( ) . all ( |p| p . is_never_pattern ( ) ) ;
741
+ is_never_pattern = pats. iter ( ) . all ( |p| self . is_never_pattern ( p ) ) ;
734
742
false
735
743
}
736
744
_ => true ,
0 commit comments