From e24003fb3ceaac9da1b848069555b491b9488ad0 Mon Sep 17 00:00:00 2001 From: achernyak Date: Thu, 27 Apr 2017 13:27:16 -0500 Subject: [PATCH] query for describe_def --- src/librustc/middle/cstore.rs | 4 +--- src/librustc/middle/stability.rs | 2 +- src/librustc/ty/maps.rs | 15 ++++++++++++++- src/librustc/ty/mod.rs | 2 +- src/librustc_const_eval/eval.rs | 2 +- src/librustc_metadata/cstore_impl.rs | 8 ++------ 6 files changed, 20 insertions(+), 13 deletions(-) diff --git a/src/librustc/middle/cstore.rs b/src/librustc/middle/cstore.rs index 60171f1a4289a..0358319256760 100644 --- a/src/librustc/middle/cstore.rs +++ b/src/librustc/middle/cstore.rs @@ -22,7 +22,7 @@ // are *mostly* used as a part of that interface, but these should // probably get a better home if someone can find one. -use hir::def::{self, Def}; +use hir::def; use hir::def_id::{CrateNum, DefId, DefIndex}; use hir::map as hir_map; use hir::map::definitions::{Definitions, DefKey, DisambiguatedDefPathData}; @@ -181,7 +181,6 @@ pub trait CrateStore { fn crate_data_as_rc_any(&self, krate: CrateNum) -> Rc; // item info - fn describe_def(&self, def: DefId) -> Option; fn def_span(&self, sess: &Session, def: DefId) -> Span; fn stability(&self, def: DefId) -> Option; fn deprecation(&self, def: DefId) -> Option; @@ -313,7 +312,6 @@ impl CrateStore for DummyCrateStore { fn crate_data_as_rc_any(&self, krate: CrateNum) -> Rc { bug!("crate_data_as_rc_any") } // item info - fn describe_def(&self, def: DefId) -> Option { bug!("describe_def") } fn def_span(&self, sess: &Session, def: DefId) -> Span { bug!("def_span") } fn stability(&self, def: DefId) -> Option { bug!("stability") } fn deprecation(&self, def: DefId) -> Option { bug!("deprecation") } diff --git a/src/librustc/middle/stability.rs b/src/librustc/middle/stability.rs index 7431eb3fe96ef..1ac7f4fcc95c2 100644 --- a/src/librustc/middle/stability.rs +++ b/src/librustc/middle/stability.rs @@ -432,7 +432,7 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> { // (See issue #38412) fn skip_stability_check_due_to_privacy(self, mut def_id: DefId) -> bool { // Check if `def_id` is a trait method. - match self.sess.cstore.describe_def(def_id) { + match self.describe_def(def_id) { Some(Def::Method(_)) | Some(Def::AssociatedTy(_)) | Some(Def::AssociatedConst(_)) => { diff --git a/src/librustc/ty/maps.rs b/src/librustc/ty/maps.rs index c80ae87d941ff..096d69aa3760a 100644 --- a/src/librustc/ty/maps.rs +++ b/src/librustc/ty/maps.rs @@ -10,6 +10,7 @@ use dep_graph::{DepGraph, DepNode, DepTrackingMap, DepTrackingMapConfig}; use hir::def_id::{CrateNum, DefId, LOCAL_CRATE}; +use hir::def::Def; use hir; use middle::const_val; use middle::privacy::AccessLevels; @@ -264,6 +265,12 @@ impl<'tcx> QueryDescription for queries::symbol_name<'tcx> { } } +impl<'tcx> QueryDescription for queries::describe_def<'tcx> { + fn describe(_: TyCtxt, _: DefId) -> String { + bug!("describe_def") + } +} + macro_rules! define_maps { (<$tcx:tt> $($(#[$attr:meta])* @@ -538,7 +545,9 @@ define_maps! { <'tcx> pub mir_shims: mir_shim_dep_node(ty::InstanceDef<'tcx>) -> &'tcx RefCell>, pub def_symbol_name: SymbolName(DefId) -> ty::SymbolName, - pub symbol_name: symbol_name_dep_node(ty::Instance<'tcx>) -> ty::SymbolName + pub symbol_name: symbol_name_dep_node(ty::Instance<'tcx>) -> ty::SymbolName, + + pub describe_def: meta_data_node(DefId) -> Option } fn coherent_trait_dep_node((_, def_id): (CrateNum, DefId)) -> DepNode { @@ -570,3 +579,7 @@ fn typeck_item_bodies_dep_node(_: CrateNum) -> DepNode { fn const_eval_dep_node((def_id, _): (DefId, &Substs)) -> DepNode { DepNode::ConstEval(def_id) } + +fn meta_data_node(def_id: DefId) -> DepNode { + DepNode::MetaData(def_id) +} \ No newline at end of file diff --git a/src/librustc/ty/mod.rs b/src/librustc/ty/mod.rs index de207df7d15eb..238791fb6edb3 100644 --- a/src/librustc/ty/mod.rs +++ b/src/librustc/ty/mod.rs @@ -2385,7 +2385,7 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> { /// ID of the impl that the method belongs to. Otherwise, return `None`. pub fn impl_of_method(self, def_id: DefId) -> Option { let item = if def_id.krate != LOCAL_CRATE { - if let Some(Def::Method(_)) = self.sess.cstore.describe_def(def_id) { + if let Some(Def::Method(_)) = self.describe_def(def_id) { Some(self.associated_item(def_id)) } else { None diff --git a/src/librustc_const_eval/eval.rs b/src/librustc_const_eval/eval.rs index 9470316c7e7e0..8b1aa0708807b 100644 --- a/src/librustc_const_eval/eval.rs +++ b/src/librustc_const_eval/eval.rs @@ -68,7 +68,7 @@ pub fn lookup_const_by_id<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, _ => Some((def_id, substs)) } } else { - match tcx.sess.cstore.describe_def(def_id) { + match tcx.describe_def(def_id) { Some(Def::AssociatedConst(_)) => { // As mentioned in the comments above for in-crate // constants, we only try to find the expression for a diff --git a/src/librustc_metadata/cstore_impl.rs b/src/librustc_metadata/cstore_impl.rs index ddb3332be3731..839caca2ee914 100644 --- a/src/librustc_metadata/cstore_impl.rs +++ b/src/librustc_metadata/cstore_impl.rs @@ -17,7 +17,7 @@ use rustc::dep_graph::DepTrackingMapConfig; use rustc::middle::cstore::{CrateStore, CrateSource, LibSource, DepKind, ExternCrate, NativeLibrary, LinkMeta, LinkagePreference, LoadedMacro, EncodedMetadata}; -use rustc::hir::def::{self, Def}; +use rustc::hir::def; use rustc::middle::lang_items; use rustc::session::Session; use rustc::ty::{self, TyCtxt}; @@ -113,6 +113,7 @@ provide! { <'tcx> tcx, def_id, cdata closure_type => { cdata.closure_ty(def_id.index, tcx) } inherent_impls => { Rc::new(cdata.get_inherent_implementations_for_type(def_id.index)) } is_foreign_item => { cdata.is_foreign_item(def_id.index) } + describe_def => { cdata.get_def(def_id.index) } } impl CrateStore for cstore::CStore { @@ -120,11 +121,6 @@ impl CrateStore for cstore::CStore { self.get_crate_data(krate) } - fn describe_def(&self, def: DefId) -> Option { - self.dep_graph.read(DepNode::MetaData(def)); - self.get_crate_data(def.krate).get_def(def.index) - } - fn def_span(&self, sess: &Session, def: DefId) -> Span { self.dep_graph.read(DepNode::MetaData(def)); self.get_crate_data(def.krate).get_span(def.index, sess)