1- //! From the NLL RFC: "The deep [aka 'supporting'] prefixes for an 
2- //! place are formed by stripping away fields and derefs, except that 
3- //! we stop when we reach the deref of a shared reference. [...] " 
4- //! 
1+ //! From the NLL RFC: 
52//! "Shallow prefixes are found by stripping away fields, but stop at 
63//! any dereference. So: writing a path like `a` is illegal if `a.b` 
74//! is borrowed. But: writing `a` is legal if `*a` is borrowed, 
85//! whether or not `a` is a shared or mutable reference. [...] " 
96
107use  super :: MirBorrowckCtxt ; 
118
12- use  rustc_hir as  hir; 
13- use  rustc_middle:: mir:: { Body ,  PlaceRef ,  ProjectionElem } ; 
14- use  rustc_middle:: ty:: { self ,  TyCtxt } ; 
9+ use  rustc_middle:: mir:: { PlaceRef ,  ProjectionElem } ; 
1510
1611pub  trait  IsPrefixOf < ' tcx >  { 
1712    fn  is_prefix_of ( & self ,  other :  PlaceRef < ' tcx > )  -> bool ; 
@@ -25,9 +20,7 @@ impl<'tcx> IsPrefixOf<'tcx> for PlaceRef<'tcx> {
2520    } 
2621} 
2722
28- pub ( super )  struct  Prefixes < ' cx ,  ' tcx >  { 
29-     body :  & ' cx  Body < ' tcx > , 
30-     tcx :  TyCtxt < ' tcx > , 
23+ pub ( super )  struct  Prefixes < ' tcx >  { 
3124    kind :  PrefixSet , 
3225    next :  Option < PlaceRef < ' tcx > > , 
3326} 
@@ -39,24 +32,18 @@ pub(super) enum PrefixSet {
3932All , 
4033    /// Stops at any dereference. 
4134Shallow , 
42-     /// Stops at the deref of a shared reference. 
43- Supporting , 
4435} 
4536
4637impl < ' cx ,  ' tcx >  MirBorrowckCtxt < ' cx ,  ' tcx >  { 
4738    /// Returns an iterator over the prefixes of `place` 
4839/// (inclusive) from longest to smallest, potentially 
4940/// terminating the iteration early based on `kind`. 
50- pub ( super )  fn  prefixes ( 
51-         & self , 
52-         place_ref :  PlaceRef < ' tcx > , 
53-         kind :  PrefixSet , 
54-     )  -> Prefixes < ' cx ,  ' tcx >  { 
55-         Prefixes  {  next :  Some ( place_ref) ,  kind,  body :  self . body ,  tcx :  self . infcx . tcx  } 
41+ pub ( super )  fn  prefixes ( & self ,  place_ref :  PlaceRef < ' tcx > ,  kind :  PrefixSet )  -> Prefixes < ' tcx >  { 
42+         Prefixes  {  next :  Some ( place_ref) ,  kind } 
5643    } 
5744} 
5845
59- impl < ' cx ,   ' tcx >  Iterator  for  Prefixes < ' cx ,   ' tcx >  { 
46+ impl < ' tcx >  Iterator  for  Prefixes < ' tcx >  { 
6047    type  Item  = PlaceRef < ' tcx > ; 
6148    fn  next ( & mut  self )  -> Option < Self :: Item >  { 
6249        let  mut  cursor = self . next ?; 
@@ -91,57 +78,23 @@ impl<'cx, 'tcx> Iterator for Prefixes<'cx, 'tcx> {
9178                            panic ! ( "Subtype projection is not allowed before borrow check" ) 
9279                        } 
9380                        ProjectionElem :: Deref  => { 
94-                             // (handled below) 
81+                             match  self . kind  { 
82+                                 PrefixSet :: Shallow  => { 
83+                                     // Shallow prefixes are found by stripping away 
84+                                     // fields, but stop at *any* dereference. 
85+                                     // So we can just stop the traversal now. 
86+                                     self . next  = None ; 
87+                                     return  Some ( cursor) ; 
88+                                 } 
89+                                 PrefixSet :: All  => { 
90+                                     // All prefixes: just blindly enqueue the base 
91+                                     // of the projection. 
92+                                     self . next  = Some ( cursor_base) ; 
93+                                     return  Some ( cursor) ; 
94+                                 } 
95+                             } 
9596                        } 
9697                    } 
97- 
98-                     assert_eq ! ( elem,  ProjectionElem :: Deref ) ; 
99- 
100-                     match  self . kind  { 
101-                         PrefixSet :: Shallow  => { 
102-                             // Shallow prefixes are found by stripping away 
103-                             // fields, but stop at *any* dereference. 
104-                             // So we can just stop the traversal now. 
105-                             self . next  = None ; 
106-                             return  Some ( cursor) ; 
107-                         } 
108-                         PrefixSet :: All  => { 
109-                             // All prefixes: just blindly enqueue the base 
110-                             // of the projection. 
111-                             self . next  = Some ( cursor_base) ; 
112-                             return  Some ( cursor) ; 
113-                         } 
114-                         PrefixSet :: Supporting  => { 
115-                             // Fall through! 
116-                         } 
117-                     } 
118- 
119-                     assert_eq ! ( self . kind,  PrefixSet :: Supporting ) ; 
120-                     // Supporting prefixes: strip away fields and 
121-                     // derefs, except we stop at the deref of a shared 
122-                     // reference. 
123- 
124-                     let  ty = cursor_base. ty ( self . body ,  self . tcx ) . ty ; 
125-                     match  ty. kind ( )  { 
126-                         ty:: RawPtr ( _)  | ty:: Ref ( _ /*rgn*/ ,  _ /*ty*/ ,  hir:: Mutability :: Not )  => { 
127-                             // don't continue traversing over derefs of raw pointers or shared 
128-                             // borrows. 
129-                             self . next  = None ; 
130-                             return  Some ( cursor) ; 
131-                         } 
132- 
133-                         ty:: Ref ( _ /*rgn*/ ,  _ /*ty*/ ,  hir:: Mutability :: Mut )  => { 
134-                             self . next  = Some ( cursor_base) ; 
135-                             return  Some ( cursor) ; 
136-                         } 
137- 
138-                         ty:: Adt ( ..)  if  ty. is_box ( )  => { 
139-                             self . next  = Some ( cursor_base) ; 
140-                             return  Some ( cursor) ; 
141-                         } 
142- 
143-                         _ => panic ! ( "unknown type fed to Projection Deref." ) , 
144-                     } 
14598                } 
14699            } 
147100        } 
0 commit comments