@@ -32,6 +32,7 @@ use hir::print as pprust;
32
32
33
33
use arena:: TypedArena ;
34
34
use std:: cell:: RefCell ;
35
+ use std:: cmp;
35
36
use std:: io;
36
37
use std:: mem;
37
38
@@ -127,7 +128,10 @@ impl<'ast> MapEntry<'ast> {
127
128
EntryStructCtor ( id, _) => id,
128
129
EntryLifetime ( id, _) => id,
129
130
EntryTyParam ( id, _) => id,
130
- _ => return None
131
+
132
+ NotPresent |
133
+ RootCrate |
134
+ RootInlinedParent ( _) => return None ,
131
135
} )
132
136
}
133
137
@@ -196,6 +200,10 @@ pub struct Map<'ast> {
196
200
map : RefCell < Vec < MapEntry < ' ast > > > ,
197
201
198
202
definitions : RefCell < Definitions > ,
203
+
204
+ /// All NodeIds that are numerically greater or equal to this value come
205
+ /// from inlined items.
206
+ local_node_id_watermark : NodeId ,
199
207
}
200
208
201
209
impl < ' ast > Map < ' ast > {
@@ -550,6 +558,13 @@ impl<'ast> Map<'ast> {
550
558
}
551
559
}
552
560
561
+ pub fn expect_inlined_item ( & self , id : NodeId ) -> & ' ast InlinedItem {
562
+ match self . find_entry ( id) {
563
+ Some ( RootInlinedParent ( inlined_item) ) => inlined_item,
564
+ _ => bug ! ( "expected inlined item, found {}" , self . node_to_string( id) ) ,
565
+ }
566
+ }
567
+
553
568
/// Returns the name associated with the given NodeId's AST.
554
569
pub fn name ( & self , id : NodeId ) -> Name {
555
570
match self . get ( id) {
@@ -649,6 +664,10 @@ impl<'ast> Map<'ast> {
649
664
pub fn node_to_user_string ( & self , id : NodeId ) -> String {
650
665
node_id_to_string ( self , id, false )
651
666
}
667
+
668
+ pub fn is_inlined ( & self , id : NodeId ) -> bool {
669
+ id >= self . local_node_id_watermark
670
+ }
652
671
}
653
672
654
673
pub struct NodesMatchingSuffix < ' a , ' ast : ' a > {
@@ -765,13 +784,37 @@ pub trait FoldOps {
765
784
}
766
785
767
786
/// A Folder that updates IDs and Span's according to fold_ops.
768
- struct IdAndSpanUpdater < F > {
769
- fold_ops : F
787
+ pub struct IdAndSpanUpdater < F > {
788
+ fold_ops : F ,
789
+ min_id_assigned : NodeId ,
790
+ max_id_assigned : NodeId ,
791
+ }
792
+
793
+ impl < F : FoldOps > IdAndSpanUpdater < F > {
794
+ pub fn new ( fold_ops : F ) -> IdAndSpanUpdater < F > {
795
+ IdAndSpanUpdater {
796
+ fold_ops : fold_ops,
797
+ min_id_assigned : :: std:: u32:: MAX ,
798
+ max_id_assigned : :: std:: u32:: MIN ,
799
+ }
800
+ }
801
+
802
+ pub fn id_range ( & self ) -> intravisit:: IdRange {
803
+ intravisit:: IdRange {
804
+ min : self . min_id_assigned ,
805
+ max : self . max_id_assigned + 1 ,
806
+ }
807
+ }
770
808
}
771
809
772
810
impl < F : FoldOps > Folder for IdAndSpanUpdater < F > {
773
811
fn new_id ( & mut self , id : NodeId ) -> NodeId {
774
- self . fold_ops . new_id ( id)
812
+ let id = self . fold_ops . new_id ( id) ;
813
+
814
+ self . min_id_assigned = cmp:: min ( self . min_id_assigned , id) ;
815
+ self . max_id_assigned = cmp:: max ( self . max_id_assigned , id) ;
816
+
817
+ id
775
818
}
776
819
777
820
fn new_span ( & mut self , span : Span ) -> Span {
@@ -802,11 +845,14 @@ pub fn map_crate<'ast>(forest: &'ast mut Forest,
802
845
entries, vector_length, ( entries as f64 / vector_length as f64 ) * 100. ) ;
803
846
}
804
847
848
+ let local_node_id_watermark = map. len ( ) as NodeId ;
849
+
805
850
Map {
806
851
forest : forest,
807
852
dep_graph : forest. dep_graph . clone ( ) ,
808
853
map : RefCell :: new ( map) ,
809
854
definitions : RefCell :: new ( definitions) ,
855
+ local_node_id_watermark : local_node_id_watermark
810
856
}
811
857
}
812
858
@@ -818,7 +864,7 @@ pub fn map_decoded_item<'ast, F: FoldOps>(map: &Map<'ast>,
818
864
ii : InlinedItem ,
819
865
fold_ops : F )
820
866
-> & ' ast InlinedItem {
821
- let mut fld = IdAndSpanUpdater { fold_ops : fold_ops } ;
867
+ let mut fld = IdAndSpanUpdater :: new ( fold_ops) ;
822
868
let ii = match ii {
823
869
II :: Item ( i) => II :: Item ( i. map ( |i| fld. fold_item ( i) ) ) ,
824
870
II :: TraitItem ( d, ti) => {
@@ -835,6 +881,12 @@ pub fn map_decoded_item<'ast, F: FoldOps>(map: &Map<'ast>,
835
881
let ii = map. forest . inlined_items . alloc ( ii) ;
836
882
let ii_parent_id = fld. new_id ( DUMMY_NODE_ID ) ;
837
883
884
+ // Assert that the ii_parent_id is the last NodeId in our reserved range
885
+ assert ! ( ii_parent_id == fld. max_id_assigned) ;
886
+ // Assert that we did not violate the invariant that all inlined HIR items
887
+ // have NodeIds greater than or equal to `local_node_id_watermark`
888
+ assert ! ( fld. min_id_assigned >= map. local_node_id_watermark) ;
889
+
838
890
let defs = & mut * map. definitions . borrow_mut ( ) ;
839
891
let mut def_collector = DefCollector :: extend ( ii_parent_id,
840
892
parent_def_path. clone ( ) ,
0 commit comments