@@ -647,11 +647,17 @@ impl<'tcx> Pat<'tcx> {
647647 _ => None ,
648648 }
649649 }
650+ }
650651
652+ impl < ' tcx > Thir < ' tcx > {
651653 /// Call `f` on every "binding" in a pattern, e.g., on `a` in
652654 /// `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| {
655661 if let PatKind :: Binding { name, mode, ty, .. } = p. kind {
656662 f ( name, mode. 0 , ty, p. span ) ;
657663 }
@@ -661,17 +667,17 @@ impl<'tcx> Pat<'tcx> {
661667 /// Walk the pattern in left-to-right order.
662668 ///
663669 /// 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) ;
666672 }
667673
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 ) {
670676 return ;
671677 }
672678
673679 use PatKind :: * ;
674- match & self . kind {
680+ match & pat . kind {
675681 Wild
676682 | Never
677683 | Range ( ..)
@@ -682,22 +688,24 @@ impl<'tcx> Pat<'tcx> {
682688 | Binding { subpattern : Some ( subpattern) , .. }
683689 | Deref { subpattern }
684690 | DerefPattern { subpattern, .. }
685- | ExpandedConstant { subpattern, .. } => subpattern . walk_ ( it) ,
691+ | ExpandedConstant { subpattern, .. } => self . walk_pat_inner ( subpattern , it) ,
686692 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) )
688694 }
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) ) ,
690696 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) ) ,
694702 }
695703 }
696704
697705 /// 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 > {
699707 let mut error = None ;
700- self . walk ( |pat| {
708+ self . walk_pat ( pat , |pat| {
701709 if let PatKind :: Error ( e) = pat. kind
702710 && error. is_none ( )
703711 {
@@ -714,23 +722,23 @@ impl<'tcx> Pat<'tcx> {
714722 /// Walk the pattern in left-to-right order.
715723 ///
716724 /// 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| {
719727 it ( p) ;
720728 true
721729 } )
722730 }
723731
724732 /// Whether this a never pattern.
725- pub fn is_never_pattern ( & self ) -> bool {
733+ pub fn is_never_pattern ( & self , pat : & Pat < ' tcx > ) -> bool {
726734 let mut is_never_pattern = false ;
727- self . walk ( |pat| match & pat. kind {
735+ self . walk_pat ( pat , |pat| match & pat. kind {
728736 PatKind :: Never => {
729737 is_never_pattern = true ;
730738 false
731739 }
732740 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 ) ) ;
734742 false
735743 }
736744 _ => true ,
0 commit comments