@@ -21,94 +21,95 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
21
21
pub ( crate ) fn lower_pat_mut ( & mut self , mut pattern : & Pat ) -> hir:: Pat < ' hir > {
22
22
ensure_sufficient_stack ( || {
23
23
// 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
- ) ;
68
24
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 ) ;
72
74
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)
108
84
}
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) ,
109
104
} ;
110
105
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
+ }
112
113
} )
113
114
}
114
115
@@ -176,10 +177,16 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
176
177
let mut prev_rest_span = None ;
177
178
178
179
// 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 ) ;
180
182
let lower_sub = |this : & mut Self | Some ( this. pat_wild_with_node_id_of ( sub) ) ;
181
183
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
+ }
183
190
} ;
184
191
185
192
let mut iter = pats. iter ( ) ;
0 commit comments