]> git.lizzy.rs Git - rust.git/commitdiff
Allocate HIR id counters for use trees in MiscCollector
authorJohn Kåre Alsaker <john.kare.alsaker@gmail.com>
Sat, 16 Mar 2019 06:16:25 +0000 (07:16 +0100)
committerJohn Kåre Alsaker <john.kare.alsaker@gmail.com>
Mon, 25 Mar 2019 14:04:28 +0000 (15:04 +0100)
src/librustc/hir/lowering.rs
src/librustc/middle/dead.rs

index ad517bfc3ed75c20967edb368be247b48b1281ab..2a085f1c0a879773e7ec390be2bc1f0e3e33767d 100644 (file)
@@ -361,9 +361,40 @@ struct MiscCollector<'lcx, 'interner: 'lcx> {
             lctx: &'lcx mut LoweringContext<'interner>,
         }
 
+        impl MiscCollector<'_, '_> {
+            fn allocate_use_tree_hir_id_counters(
+                &mut self,
+                tree: &UseTree,
+                owner: DefIndex,
+            ) {
+                match tree.kind {
+                    UseTreeKind::Simple(_, id1, id2) => {
+                        for &id in &[id1, id2] {
+                            self.lctx.resolver.definitions().create_def_with_parent(
+                                owner,
+                                id,
+                                DefPathData::Misc,
+                                DefIndexAddressSpace::High,
+                                Mark::root(),
+                                tree.prefix.span,
+                            );
+                            self.lctx.allocate_hir_id_counter(id, &tree);
+                        }
+                    }
+                    UseTreeKind::Glob => (),
+                    UseTreeKind::Nested(ref trees) => {
+                        for &(ref use_tree, id) in trees {
+                            let hir_id = self.lctx.allocate_hir_id_counter(id, &use_tree).hir_id;
+                            self.allocate_use_tree_hir_id_counters(use_tree, hir_id.owner);
+                        }
+                    }
+                }
+            }
+        }
+
         impl<'lcx, 'interner> Visitor<'lcx> for MiscCollector<'lcx, 'interner> {
             fn visit_item(&mut self, item: &'lcx Item) {
-                self.lctx.allocate_hir_id_counter(item.id, item);
+                let hir_id = self.lctx.allocate_hir_id_counter(item.id, item).hir_id;
 
                 match item.node {
                     ItemKind::Struct(_, ref generics)
@@ -383,6 +414,9 @@ fn visit_item(&mut self, item: &'lcx Item) {
                             .count();
                         self.lctx.type_def_lifetime_params.insert(def_id, count);
                     }
+                    ItemKind::Use(ref use_tree) => {
+                        self.allocate_use_tree_hir_id_counters(use_tree, hir_id.owner);
+                    }
                     _ => {}
                 }
                 visit::walk_item(self, item);
@@ -517,6 +551,8 @@ fn visit_impl_item(&mut self, item: &'lcx ImplItem) {
 
     fn insert_item(&mut self, item: hir::Item) {
         let id = item.hir_id;
+        // FIXME: Use debug_asset-rt
+        assert_eq!(id.local_id, hir::ItemLocalId::from_u32(0));
         self.items.insert(id, item);
         self.modules.get_mut(&self.current_module).unwrap().items.insert(id);
     }
@@ -3065,7 +3101,6 @@ fn lower_use_tree(
                     }
                 }
 
-                let parent_def_index = self.current_hir_id_owner.last().unwrap().0;
                 let mut defs = self.expect_full_def_from_use(id);
                 // We want to return *something* from this function, so hold onto the first item
                 // for later.
@@ -3084,14 +3119,6 @@ fn lower_use_tree(
                         seg.id = self.sess.next_node_id();
                     }
                     let span = path.span;
-                    self.resolver.definitions().create_def_with_parent(
-                        parent_def_index,
-                        new_node_id,
-                        DefPathData::Misc,
-                        DefIndexAddressSpace::High,
-                        Mark::root(),
-                        span);
-                    self.allocate_hir_id_counter(new_node_id, &path);
 
                     self.with_hir_id_owner(new_node_id, |this| {
                         let new_id = this.lower_node_id(new_node_id);
@@ -3173,8 +3200,6 @@ fn lower_use_tree(
 
                 // Add all the nested `PathListItem`s to the HIR.
                 for &(ref use_tree, id) in trees {
-                    self.allocate_hir_id_counter(id, &use_tree);
-
                     let LoweredNodeId {
                         node_id: new_id,
                         hir_id: new_hir_id,
@@ -3469,9 +3494,11 @@ fn lower_mod(&mut self, m: &Mod) -> hir::Mod {
             _ => smallvec![i.id],
         };
 
-        node_ids.into_iter()
-                .map(|node_id| hir::ItemId { id: self.lower_node_id(node_id).hir_id })
-                .collect()
+        node_ids.into_iter().map(|node_id| hir::ItemId {
+            id: self.lower_node_id_generic(node_id, |_| {
+                panic!("expected node_id to be lowered already {:#?}", i)
+            }).hir_id
+        }).collect()
     }
 
     fn lower_item_id_use_tree(&mut self,
index f12367a89bbf3dae3c94414aa4a09812e8f812d6..0a0a1dee7f07c52fdae3e01b46f8a0afc7fa505a 100644 (file)
@@ -292,7 +292,7 @@ fn visit_path(&mut self, path: &'tcx hir::Path, _: hir::HirId) {
     fn visit_ty(&mut self, ty: &'tcx hir::Ty) {
         match ty.node {
             TyKind::Def(item_id, _) => {
-                let item = self.tcx.hir().expect_item(item_id.id);
+                let item = self.tcx.hir().expect_item_by_hir_id(item_id.id);
                 intravisit::walk_item(self, item);
             }
             _ => ()