1
1
//! Def-use analysis.
2
2
3
- use rustc:: mir:: { Local , Location , Body } ;
3
+ use rustc:: mir:: { Body , Local , Location , Place , PlaceElem } ;
4
4
use rustc:: mir:: visit:: { PlaceContext , MutVisitor , Visitor } ;
5
5
use rustc_index:: vec:: IndexVec ;
6
6
use std:: mem;
@@ -47,13 +47,13 @@ impl DefUseAnalysis {
47
47
& self . info [ local]
48
48
}
49
49
50
- fn mutate_defs_and_uses < F > ( & self , local : Local , body : & mut Body < ' _ > , mut callback : F )
51
- where F : for < ' a > FnMut ( & ' a mut Local ,
50
+ fn mutate_defs_and_uses < F > ( & self , local : Local , body : & mut Body < ' _ > , callback : F )
51
+ where F : for < ' a > Fn ( & ' a Local ,
52
52
PlaceContext ,
53
- Location ) {
53
+ Location ) -> Local {
54
54
for place_use in & self . info [ local] . defs_and_uses {
55
55
MutateUseVisitor :: new ( local,
56
- & mut callback,
56
+ & callback,
57
57
body) . visit_location ( body, place_use. location )
58
58
}
59
59
}
@@ -63,7 +63,7 @@ impl DefUseAnalysis {
63
63
local : Local ,
64
64
body : & mut Body < ' _ > ,
65
65
new_local : Local ) {
66
- self . mutate_defs_and_uses ( local, body, |local , _, _| * local = new_local)
66
+ self . mutate_defs_and_uses ( local, body, |_ , _, _| new_local)
67
67
}
68
68
}
69
69
@@ -125,7 +125,7 @@ struct MutateUseVisitor<F> {
125
125
impl < F > MutateUseVisitor < F > {
126
126
fn new ( query : Local , callback : F , _: & Body < ' _ > )
127
127
-> MutateUseVisitor < F >
128
- where F : for < ' a > FnMut ( & ' a mut Local , PlaceContext , Location ) {
128
+ where F : for < ' a > Fn ( & ' a Local , PlaceContext , Location ) -> Local {
129
129
MutateUseVisitor {
130
130
query,
131
131
callback,
@@ -134,13 +134,31 @@ impl<F> MutateUseVisitor<F> {
134
134
}
135
135
136
136
impl < F > MutVisitor < ' _ > for MutateUseVisitor < F >
137
- where F : for < ' a > FnMut ( & ' a mut Local , PlaceContext , Location ) {
137
+ where F : for < ' a > Fn ( & ' a Local , PlaceContext , Location ) -> Local {
138
138
fn visit_local ( & mut self ,
139
139
local : & mut Local ,
140
140
context : PlaceContext ,
141
141
location : Location ) {
142
142
if * local == self . query {
143
- ( self . callback ) ( local, context, location)
143
+ * local = ( self . callback ) ( local, context, location)
144
144
}
145
145
}
146
+
147
+ fn visit_place ( & mut self ,
148
+ place : & mut Place < ' tcx > ,
149
+ context : PlaceContext ,
150
+ location : Location ) {
151
+ self . visit_place_base ( & mut place. base , context, location) ;
152
+
153
+ let new_projection: Vec < _ > = place. projection . iter ( ) . map ( |elem|
154
+ match elem {
155
+ PlaceElem :: Index ( local) if * local == self . query => {
156
+ PlaceElem :: Index ( ( self . callback ) ( & local, context, location) )
157
+ }
158
+ _ => elem. clone ( ) ,
159
+ }
160
+ ) . collect ( ) ;
161
+
162
+ place. projection = new_projection. into_boxed_slice ( ) ;
163
+ }
146
164
}
0 commit comments