From cb4ac714e1155c9ae66a25300250bdd887bb8e53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=20K=C3=A5re=20Alsaker?= Date: Sat, 16 Mar 2019 07:16:25 +0100 Subject: [PATCH] Allocate HIR id counters for use trees in MiscCollector --- src/librustc/hir/lowering.rs | 57 ++++++++++++++++++++++++++---------- src/librustc/middle/dead.rs | 2 +- 2 files changed, 43 insertions(+), 16 deletions(-) diff --git a/src/librustc/hir/lowering.rs b/src/librustc/hir/lowering.rs index ad517bfc3ed7..2a085f1c0a87 100644 --- a/src/librustc/hir/lowering.rs +++ b/src/librustc/hir/lowering.rs @@ -361,9 +361,40 @@ impl<'a> LoweringContext<'a> { 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 @@ impl<'a> LoweringContext<'a> { .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 @@ impl<'a> LoweringContext<'a> { 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 @@ impl<'a> LoweringContext<'a> { } } - 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 @@ impl<'a> LoweringContext<'a> { 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 @@ impl<'a> LoweringContext<'a> { // 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 @@ impl<'a> LoweringContext<'a> { _ => 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, diff --git a/src/librustc/middle/dead.rs b/src/librustc/middle/dead.rs index f12367a89bbf..0a0a1dee7f07 100644 --- a/src/librustc/middle/dead.rs +++ b/src/librustc/middle/dead.rs @@ -292,7 +292,7 @@ impl<'a, 'tcx> Visitor<'tcx> for MarkSymbolVisitor<'a, 'tcx> { 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); } _ => ()