From eeb45c7591ae7c7e843a132fe937b97a7d670581 Mon Sep 17 00:00:00 2001 From: Niko Matsakis Date: Tue, 8 Nov 2016 11:16:39 -0500 Subject: [PATCH] make distinct Hir() nodes in the graph for impl items --- src/librustc/dep_graph/visit.rs | 9 ++++----- src/librustc/hir/map/mod.rs | 8 ++++++-- src/librustc_incremental/calculate_svh/mod.rs | 5 +++++ src/librustc_incremental/calculate_svh/svh_visitor.rs | 6 ++---- 4 files changed, 17 insertions(+), 11 deletions(-) diff --git a/src/librustc/dep_graph/visit.rs b/src/librustc/dep_graph/visit.rs index 6d89bbba54ec..600732fc6f70 100644 --- a/src/librustc/dep_graph/visit.rs +++ b/src/librustc/dep_graph/visit.rs @@ -47,13 +47,12 @@ pub fn visit_all_item_likes_in_krate<'a, 'tcx, V, F>(tcx: TyCtxt<'a, 'tcx, 'tcx> } fn visit_impl_item(&mut self, i: &'tcx hir::ImplItem) { - // TODO -- use the def-id of the impl for now - let impl_def_id = self.tcx.map.get_parent_did(i.id); - let task_id = (self.dep_node_fn)(impl_def_id); + let impl_item_def_id = self.tcx.map.local_def_id(i.id); + let task_id = (self.dep_node_fn)(impl_item_def_id); let _task = self.tcx.dep_graph.in_task(task_id.clone()); debug!("Started task {:?}", task_id); - assert!(!self.tcx.map.is_inlined_def_id(impl_def_id)); - self.tcx.dep_graph.read(DepNode::Hir(impl_def_id)); + assert!(!self.tcx.map.is_inlined_def_id(impl_item_def_id)); + self.tcx.dep_graph.read(DepNode::Hir(impl_item_def_id)); self.visitor.visit_impl_item(i); debug!("Ended task {:?}", task_id); } diff --git a/src/librustc/hir/map/mod.rs b/src/librustc/hir/map/mod.rs index c629ec66ca4d..e684040a1735 100644 --- a/src/librustc/hir/map/mod.rs +++ b/src/librustc/hir/map/mod.rs @@ -254,9 +254,14 @@ impl<'ast> Map<'ast> { return DepNode::Hir(def_id); } + EntryImplItem(..) => { + let def_id = self.local_def_id(id); + assert!(!self.is_inlined_def_id(def_id)); + return DepNode::Hir(def_id); + } + EntryForeignItem(p, _) | EntryTraitItem(p, _) | - EntryImplItem(p, _) | EntryVariant(p, _) | EntryExpr(p, _) | EntryStmt(p, _) | @@ -379,7 +384,6 @@ impl<'ast> Map<'ast> { } pub fn impl_item(&self, id: ImplItemId) -> &'ast ImplItem { - // TODO right now this triggers a read of the whole impl self.read(id.id); // NB: intentionally bypass `self.forest.krate()` so that we diff --git a/src/librustc_incremental/calculate_svh/mod.rs b/src/librustc_incremental/calculate_svh/mod.rs index 5697441b6676..c08519090d27 100644 --- a/src/librustc_incremental/calculate_svh/mod.rs +++ b/src/librustc_incremental/calculate_svh/mod.rs @@ -207,6 +207,11 @@ impl<'a, 'tcx> Visitor<'tcx> for HashItemsVisitor<'a, 'tcx> { visit::walk_item(self, item); } + fn visit_impl_item(&mut self, impl_item: &'tcx hir::ImplItem) { + self.calculate_node_id(impl_item.id, |v| v.visit_impl_item(impl_item)); + visit::walk_impl_item(self, impl_item); + } + fn visit_foreign_item(&mut self, item: &'tcx hir::ForeignItem) { self.calculate_node_id(item.id, |v| v.visit_foreign_item(item)); visit::walk_foreign_item(self, item); diff --git a/src/librustc_incremental/calculate_svh/svh_visitor.rs b/src/librustc_incremental/calculate_svh/svh_visitor.rs index 3060e237fc13..3af6ee35f9e5 100644 --- a/src/librustc_incremental/calculate_svh/svh_visitor.rs +++ b/src/librustc_incremental/calculate_svh/svh_visitor.rs @@ -503,10 +503,8 @@ impl<'a, 'hash, 'tcx> visit::Visitor<'tcx> for StrictVersionHashVisitor<'a, 'has // Each item is hashed independently; ignore nested items. } - fn visit_nested_impl_item(&mut self, impl_item_id: ImplItemId) { - // For now, we hash impl items as part of the containing impl. - let impl_item = self.tcx.map.impl_item(impl_item_id); - self.visit_impl_item(impl_item); + fn visit_nested_impl_item(&mut self, _: ImplItemId) { + // Impl items are hashed independently; ignore nested impl items. } fn visit_variant_data(&mut self,