@@ -2156,61 +2156,95 @@ impl<'p, 'tcx> FusedIterator for PlaceProjectionsIter<'p, 'tcx> {}
2156
2156
2157
2157
impl < ' tcx > Debug for Place < ' tcx > {
2158
2158
fn fmt ( & self , fmt : & mut Formatter < ' _ > ) -> fmt:: Result {
2159
- use self :: Place :: * ;
2160
-
2161
- match * self {
2162
- Base ( PlaceBase :: Local ( id) ) => write ! ( fmt, "{:?}" , id) ,
2163
- Base ( PlaceBase :: Static ( box self :: Static { ty, kind : StaticKind :: Static ( def_id) } ) ) => {
2164
- write ! (
2165
- fmt,
2166
- "({}: {:?})" ,
2167
- ty:: tls:: with( |tcx| tcx. def_path_str( def_id) ) ,
2168
- ty
2169
- )
2170
- } ,
2171
- Base ( PlaceBase :: Static (
2172
- box self :: Static { ty, kind : StaticKind :: Promoted ( promoted) } )
2173
- ) => {
2174
- write ! (
2175
- fmt,
2176
- "({:?}: {:?})" ,
2177
- promoted,
2178
- ty
2179
- )
2180
- } ,
2181
- Projection ( ref data) => match data. elem {
2182
- ProjectionElem :: Downcast ( Some ( name) , _index) => {
2183
- write ! ( fmt, "({:?} as {})" , data. base, name)
2184
- }
2185
- ProjectionElem :: Downcast ( None , index) => {
2186
- write ! ( fmt, "({:?} as variant#{:?})" , data. base, index)
2187
- }
2188
- ProjectionElem :: Deref => write ! ( fmt, "(*{:?})" , data. base) ,
2189
- ProjectionElem :: Field ( field, ty) => {
2190
- write ! ( fmt, "({:?}.{:?}: {:?})" , data. base, field. index( ) , ty)
2191
- }
2192
- ProjectionElem :: Index ( ref index) => write ! ( fmt, "{:?}[{:?}]" , data. base, index) ,
2193
- ProjectionElem :: ConstantIndex {
2194
- offset,
2195
- min_length,
2196
- from_end : false ,
2197
- } => write ! ( fmt, "{:?}[{:?} of {:?}]" , data. base, offset, min_length) ,
2198
- ProjectionElem :: ConstantIndex {
2199
- offset,
2200
- min_length,
2201
- from_end : true ,
2202
- } => write ! ( fmt, "{:?}[-{:?} of {:?}]" , data. base, offset, min_length) ,
2203
- ProjectionElem :: Subslice { from, to } if to == 0 => {
2204
- write ! ( fmt, "{:?}[{:?}:]" , data. base, from)
2159
+ self . iterate ( |_place_base, place_projections| {
2160
+ // FIXME: remove this collect once we have migrated to slices
2161
+ let projs_vec: Vec < _ > = place_projections. collect ( ) ;
2162
+ for projection in projs_vec. iter ( ) . rev ( ) {
2163
+ match projection. elem {
2164
+ ProjectionElem :: Downcast ( _, _) |
2165
+ ProjectionElem :: Field ( _, _) => {
2166
+ write ! ( fmt, "(" ) . unwrap ( ) ;
2167
+ }
2168
+ ProjectionElem :: Deref => {
2169
+ write ! ( fmt, "(*" ) . unwrap ( ) ;
2170
+ }
2171
+ ProjectionElem :: Index ( _) |
2172
+ ProjectionElem :: ConstantIndex { .. } |
2173
+ ProjectionElem :: Subslice { .. } => { }
2205
2174
}
2206
- ProjectionElem :: Subslice { from, to } if from == 0 => {
2207
- write ! ( fmt, "{:?}[:-{:?}]" , data. base, to)
2175
+ }
2176
+ } ) ;
2177
+
2178
+ self . iterate ( |place_base, place_projections| {
2179
+ match place_base {
2180
+ PlaceBase :: Local ( id) => {
2181
+ write ! ( fmt, "{:?}" , id) ?;
2208
2182
}
2209
- ProjectionElem :: Subslice { from, to } => {
2210
- write ! ( fmt, "{:?}[{:?}:-{:?}]" , data. base, from, to)
2183
+ PlaceBase :: Static ( box self :: Static { ty, kind : StaticKind :: Static ( def_id) } ) => {
2184
+ write ! (
2185
+ fmt,
2186
+ "({}: {:?})" ,
2187
+ ty:: tls:: with( |tcx| tcx. def_path_str( * def_id) ) ,
2188
+ ty
2189
+ ) ?;
2190
+ } ,
2191
+ PlaceBase :: Static (
2192
+ box self :: Static { ty, kind : StaticKind :: Promoted ( promoted) }
2193
+ ) => {
2194
+ write ! (
2195
+ fmt,
2196
+ "({:?}: {:?})" ,
2197
+ promoted,
2198
+ ty
2199
+ ) ?;
2200
+ } ,
2201
+ }
2202
+
2203
+ for projection in place_projections {
2204
+ match projection. elem {
2205
+ ProjectionElem :: Downcast ( Some ( name) , _index) => {
2206
+ write ! ( fmt, " as {})" , name) ?;
2207
+ }
2208
+ ProjectionElem :: Downcast ( None , index) => {
2209
+ write ! ( fmt, " as variant#{:?})" , index) ?;
2210
+ }
2211
+ ProjectionElem :: Deref => {
2212
+ write ! ( fmt, ")" ) ?;
2213
+ }
2214
+ ProjectionElem :: Field ( field, ty) => {
2215
+ write ! ( fmt, ".{:?}: {:?})" , field. index( ) , ty) ?;
2216
+ }
2217
+ ProjectionElem :: Index ( ref index) => {
2218
+ write ! ( fmt, "[{:?}]" , index) ?;
2219
+ }
2220
+ ProjectionElem :: ConstantIndex {
2221
+ offset,
2222
+ min_length,
2223
+ from_end : false ,
2224
+ } => {
2225
+ write ! ( fmt, "[{:?} of {:?}]" , offset, min_length) ?;
2226
+ }
2227
+ ProjectionElem :: ConstantIndex {
2228
+ offset,
2229
+ min_length,
2230
+ from_end : true ,
2231
+ } => {
2232
+ write ! ( fmt, "[-{:?} of {:?}]" , offset, min_length) ?;
2233
+ }
2234
+ ProjectionElem :: Subslice { from, to } if to == 0 => {
2235
+ write ! ( fmt, "[{:?}:]" , from) ?;
2236
+ }
2237
+ ProjectionElem :: Subslice { from, to } if from == 0 => {
2238
+ write ! ( fmt, "[:-{:?}]" , to) ?;
2239
+ }
2240
+ ProjectionElem :: Subslice { from, to } => {
2241
+ write ! ( fmt, "[{:?}:-{:?}]" , from, to) ?;
2242
+ }
2211
2243
}
2212
- } ,
2213
- }
2244
+ }
2245
+
2246
+ Ok ( ( ) )
2247
+ } )
2214
2248
}
2215
2249
}
2216
2250
0 commit comments