diff options
| author | Taylor Cramer <cramertaylorj@gmail.com> | 2017-03-14 22:46:36 -0700 |
|---|---|---|
| committer | Taylor Cramer <cramertaylorj@gmail.com> | 2017-03-28 20:36:18 -0700 |
| commit | 3b10b4e95fa5a91cf9c6bdd3162b6dff069a5444 (patch) | |
| tree | eab1866b300da2b26e6aa341fe3bd735046ea26d | |
| parent | 07a34293faeb10757944ce2fa9d552cc2b189583 (diff) | |
| download | rust-3b10b4e95fa5a91cf9c6bdd3162b6dff069a5444.tar.gz rust-3b10b4e95fa5a91cf9c6bdd3162b6dff069a5444.zip | |
On-demandify the typechecking of item bodies
| -rw-r--r-- | src/librustc/ty/maps.rs | 14 | ||||
| -rw-r--r-- | src/librustc_typeck/check/mod.rs | 14 |
2 files changed, 22 insertions, 6 deletions
diff --git a/src/librustc/ty/maps.rs b/src/librustc/ty/maps.rs index 5a57b007210..4a183191cef 100644 --- a/src/librustc/ty/maps.rs +++ b/src/librustc/ty/maps.rs @@ -13,6 +13,7 @@ use hir::def_id::{CrateNum, DefId, LOCAL_CRATE}; use middle::const_val::ConstVal; use middle::privacy::AccessLevels; use mir; +use session::CompileResult; use ty::{self, CrateInherentImpls, Ty, TyCtxt}; use rustc_data_structures::indexed_vec::IndexVec; @@ -202,6 +203,13 @@ impl<'tcx> QueryDescription for queries::privacy_access_levels<'tcx> { } } +impl<'tcx> QueryDescription for queries::typeck_item_bodies<'tcx> { + fn describe(_: TyCtxt, _: CrateNum) -> String { + format!("type-checking all item bodies") + } +} + + macro_rules! define_maps { (<$tcx:tt> $($(#[$attr:meta])* @@ -409,6 +417,8 @@ define_maps! { <'tcx> pub coerce_unsized_info: ItemSignature(DefId) -> ty::adjustment::CoerceUnsizedInfo, + pub typeck_item_bodies: typeck_item_bodies_dep_node(CrateNum) -> CompileResult, + pub typeck_tables: TypeckTables(DefId) -> &'tcx ty::TypeckTables<'tcx>, pub coherent_trait: coherent_trait_dep_node((CrateNum, DefId)) -> (), @@ -444,3 +454,7 @@ fn crate_inherent_impls_dep_node(_: CrateNum) -> DepNode<DefId> { fn mir_shim(instance: ty::InstanceDef) -> DepNode<DefId> { instance.dep_node() } + +fn typeck_item_bodies_dep_node(_: CrateNum) -> DepNode<DefId> { + DepNode::TypeckBodiesKrate +} diff --git a/src/librustc_typeck/check/mod.rs b/src/librustc_typeck/check/mod.rs index 9c62fd486d4..416147fd8d4 100644 --- a/src/librustc_typeck/check/mod.rs +++ b/src/librustc_typeck/check/mod.rs @@ -84,7 +84,7 @@ use astconv::AstConv; use dep_graph::DepNode; use fmt_macros::{Parser, Piece, Position}; use hir::def::{Def, CtorKind}; -use hir::def_id::{DefId, LOCAL_CRATE}; +use hir::def_id::{CrateNum, DefId, LOCAL_CRATE}; use rustc::infer::{self, InferCtxt, InferOk, RegionVariableOrigin, TypeTrace}; use rustc::infer::type_variable::{self, TypeVariableOrigin}; use rustc::ty::subst::{Kind, Subst, Substs}; @@ -541,19 +541,21 @@ pub fn check_item_types<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>) -> CompileResult } pub fn check_item_bodies<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>) -> CompileResult { - return tcx.sess.track_errors(|| { - tcx.dep_graph.with_task(DepNode::TypeckBodiesKrate, tcx, (), check_item_bodies_task); - }); + ty::queries::typeck_item_bodies::get(tcx, DUMMY_SP, LOCAL_CRATE) +} - fn check_item_bodies_task<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, (): ()) { +fn typeck_item_bodies<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, crate_num: CrateNum) -> CompileResult { + debug_assert!(crate_num == LOCAL_CRATE); + tcx.sess.track_errors(|| { tcx.visit_all_bodies_in_krate(|body_owner_def_id, _body_id| { tcx.item_tables(body_owner_def_id); }); - } + }) } pub fn provide(providers: &mut Providers) { *providers = Providers { + typeck_item_bodies, typeck_tables, closure_type, closure_kind, |
