@@ -21,94 +21,95 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
2121 pub ( crate ) fn lower_pat_mut ( & mut self , mut pattern : & Pat ) -> hir:: Pat < ' hir > {
2222 ensure_sufficient_stack ( || {
2323 // loop here to avoid recursion
24- let node = loop {
25- match pattern. kind {
26- PatKind :: Wild => break hir:: PatKind :: Wild ,
27- PatKind :: Ident ( binding_mode, ident, ref sub) => {
28- let lower_sub = |this : & mut Self | sub. as_ref ( ) . map ( |s| this. lower_pat ( & * s) ) ;
29- break self . lower_pat_ident ( pattern, binding_mode, ident, lower_sub) ;
30- }
31- PatKind :: Lit ( ref e) => {
32- break hir:: PatKind :: Lit ( self . lower_expr_within_pat ( e, false ) ) ;
33- }
34- PatKind :: TupleStruct ( ref qself, ref path, ref pats) => {
35- let qpath = self . lower_qpath (
36- pattern. id ,
37- qself,
38- path,
39- ParamMode :: Optional ,
40- & mut ImplTraitContext :: Disallowed ( ImplTraitPosition :: Path ) ,
41- ) ;
42- let ( pats, ddpos) = self . lower_pat_tuple ( pats, "tuple struct" ) ;
43- break hir:: PatKind :: TupleStruct ( qpath, pats, ddpos) ;
44- }
45- PatKind :: Or ( ref pats) => {
46- break hir:: PatKind :: Or (
47- self . arena . alloc_from_iter ( pats. iter ( ) . map ( |x| self . lower_pat_mut ( x) ) ) ,
48- ) ;
49- }
50- PatKind :: Path ( ref qself, ref path) => {
51- let qpath = self . lower_qpath (
52- pattern. id ,
53- qself,
54- path,
55- ParamMode :: Optional ,
56- & mut ImplTraitContext :: Disallowed ( ImplTraitPosition :: Path ) ,
57- ) ;
58- break hir:: PatKind :: Path ( qpath) ;
59- }
60- PatKind :: Struct ( ref qself, ref path, ref fields, etc) => {
61- let qpath = self . lower_qpath (
62- pattern. id ,
63- qself,
64- path,
65- ParamMode :: Optional ,
66- & mut ImplTraitContext :: Disallowed ( ImplTraitPosition :: Path ) ,
67- ) ;
6824
69- let fs = self . arena . alloc_from_iter ( fields. iter ( ) . map ( |f| {
70- let hir_id = self . lower_node_id ( f. id ) ;
71- self . lower_attrs ( hir_id, & f. attrs ) ;
25+ while let PatKind :: Paren ( ref inner) = pattern. kind {
26+ // return inner to be processed in next loop
27+ pattern = inner;
28+ }
29+
30+ let pat_hir_id = self . lower_node_id ( pattern. id ) ;
31+ let node = match pattern. kind {
32+ PatKind :: Wild => hir:: PatKind :: Wild ,
33+ PatKind :: Ident ( binding_mode, ident, ref sub) => {
34+ let lower_sub = |this : & mut Self | sub. as_ref ( ) . map ( |s| this. lower_pat ( & * s) ) ;
35+ self . lower_pat_ident ( pattern, binding_mode, ident, lower_sub)
36+ }
37+ PatKind :: Lit ( ref e) => hir:: PatKind :: Lit ( self . lower_expr_within_pat ( e, false ) ) ,
38+ PatKind :: TupleStruct ( ref qself, ref path, ref pats) => {
39+ let qpath = self . lower_qpath (
40+ pattern. id ,
41+ qself,
42+ path,
43+ ParamMode :: Optional ,
44+ & mut ImplTraitContext :: Disallowed ( ImplTraitPosition :: Path ) ,
45+ ) ;
46+ let ( pats, ddpos) = self . lower_pat_tuple ( pats, "tuple struct" ) ;
47+ hir:: PatKind :: TupleStruct ( qpath, pats, ddpos)
48+ }
49+ PatKind :: Or ( ref pats) => hir:: PatKind :: Or (
50+ self . arena . alloc_from_iter ( pats. iter ( ) . map ( |x| self . lower_pat_mut ( x) ) ) ,
51+ ) ,
52+ PatKind :: Path ( ref qself, ref path) => {
53+ let qpath = self . lower_qpath (
54+ pattern. id ,
55+ qself,
56+ path,
57+ ParamMode :: Optional ,
58+ & mut ImplTraitContext :: Disallowed ( ImplTraitPosition :: Path ) ,
59+ ) ;
60+ hir:: PatKind :: Path ( qpath)
61+ }
62+ PatKind :: Struct ( ref qself, ref path, ref fields, etc) => {
63+ let qpath = self . lower_qpath (
64+ pattern. id ,
65+ qself,
66+ path,
67+ ParamMode :: Optional ,
68+ & mut ImplTraitContext :: Disallowed ( ImplTraitPosition :: Path ) ,
69+ ) ;
70+
71+ let fs = self . arena . alloc_from_iter ( fields. iter ( ) . map ( |f| {
72+ let hir_id = self . lower_node_id ( f. id ) ;
73+ self . lower_attrs ( hir_id, & f. attrs ) ;
7274
73- hir:: PatField {
74- hir_id,
75- ident : self . lower_ident ( f. ident ) ,
76- pat : self . lower_pat ( & f. pat ) ,
77- is_shorthand : f. is_shorthand ,
78- span : self . lower_span ( f. span ) ,
79- }
80- } ) ) ;
81- break hir:: PatKind :: Struct ( qpath, fs, etc) ;
82- }
83- PatKind :: Tuple ( ref pats) => {
84- let ( pats, ddpos) = self . lower_pat_tuple ( pats, "tuple" ) ;
85- break hir:: PatKind :: Tuple ( pats, ddpos) ;
86- }
87- PatKind :: Box ( ref inner) => {
88- break hir:: PatKind :: Box ( self . lower_pat ( inner) ) ;
89- }
90- PatKind :: Ref ( ref inner, mutbl) => {
91- break hir:: PatKind :: Ref ( self . lower_pat ( inner) , mutbl) ;
92- }
93- PatKind :: Range ( ref e1, ref e2, Spanned { node : ref end, .. } ) => {
94- break hir:: PatKind :: Range (
95- e1. as_deref ( ) . map ( |e| self . lower_expr_within_pat ( e, true ) ) ,
96- e2. as_deref ( ) . map ( |e| self . lower_expr_within_pat ( e, true ) ) ,
97- self . lower_range_end ( end, e2. is_some ( ) ) ,
98- ) ;
99- }
100- PatKind :: Slice ( ref pats) => break self . lower_pat_slice ( pats) ,
101- PatKind :: Rest => {
102- // If we reach here the `..` pattern is not semantically allowed.
103- break self . ban_illegal_rest_pat ( pattern. span ) ;
104- }
105- // return inner to be processed in next loop
106- PatKind :: Paren ( ref inner) => pattern = inner,
107- PatKind :: MacCall ( _) => panic ! ( "{:?} shouldn't exist here" , pattern. span) ,
75+ hir:: PatField {
76+ hir_id,
77+ ident : self . lower_ident ( f. ident ) ,
78+ pat : self . lower_pat ( & f. pat ) ,
79+ is_shorthand : f. is_shorthand ,
80+ span : self . lower_span ( f. span ) ,
81+ }
82+ } ) ) ;
83+ hir:: PatKind :: Struct ( qpath, fs, etc)
10884 }
85+ PatKind :: Tuple ( ref pats) => {
86+ let ( pats, ddpos) = self . lower_pat_tuple ( pats, "tuple" ) ;
87+ hir:: PatKind :: Tuple ( pats, ddpos)
88+ }
89+ PatKind :: Box ( ref inner) => hir:: PatKind :: Box ( self . lower_pat ( inner) ) ,
90+ PatKind :: Ref ( ref inner, mutbl) => hir:: PatKind :: Ref ( self . lower_pat ( inner) , mutbl) ,
91+ PatKind :: Range ( ref e1, ref e2, Spanned { node : ref end, .. } ) => {
92+ hir:: PatKind :: Range (
93+ e1. as_deref ( ) . map ( |e| self . lower_expr_within_pat ( e, true ) ) ,
94+ e2. as_deref ( ) . map ( |e| self . lower_expr_within_pat ( e, true ) ) ,
95+ self . lower_range_end ( end, e2. is_some ( ) ) ,
96+ )
97+ }
98+ PatKind :: Slice ( ref pats) => self . lower_pat_slice ( pats) ,
99+ PatKind :: Rest => {
100+ // If we reach here the `..` pattern is not semantically allowed.
101+ self . ban_illegal_rest_pat ( pattern. span )
102+ }
103+ PatKind :: MacCall ( _) | _ => panic ! ( "{:?} shouldn't exist here" , pattern. span) ,
109104 } ;
110105
111- self . pat_with_node_id_of ( pattern, node)
106+ //self.pat_with_node_id_of(pattern, node)
107+ hir:: Pat {
108+ hir_id : pat_hir_id,
109+ kind : node,
110+ span : self . lower_span ( pattern. span ) ,
111+ default_binding_modes : true ,
112+ }
112113 } )
113114 }
114115
@@ -176,10 +177,16 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
176177 let mut prev_rest_span = None ;
177178
178179 // Lowers `$bm $ident @ ..` to `$bm $ident @ _`.
179- let lower_rest_sub = |this : & mut Self , pat, ann, ident, sub| {
180+ let lower_rest_sub = |this : & mut Self , pat : & Pat , ann, ident, sub| {
181+ let hir_id = this. lower_node_id ( pat. id ) ;
180182 let lower_sub = |this : & mut Self | Some ( this. pat_wild_with_node_id_of ( sub) ) ;
181183 let node = this. lower_pat_ident ( pat, ann, ident, lower_sub) ;
182- this. pat_with_node_id_of ( pat, node)
184+ hir:: Pat {
185+ hir_id,
186+ kind : node,
187+ span : this. lower_span ( pat. span ) ,
188+ default_binding_modes : true ,
189+ }
183190 } ;
184191
185192 let mut iter = pats. iter ( ) ;
0 commit comments