Rollup merge of #37688 - eddyb:lazy-8, r=petrochenkov

[8/n] rustc: clean up lookup_item_type and remove TypeScheme.

_This is part of a series ([prev](https://github.com/rust-lang/rust/pull/37676) | [next]()) of patches designed to rework rustc into an out-of-order on-demand pipeline model for both better feature support (e.g. [MIR-based](https://github.com/solson/miri) early constant evaluation) and incremental execution of compiler passes (e.g. type-checking), with beneficial consequences to IDE support as well.
If any motivation is unclear, please ask for additional PR description clarifications or code comments._

<hr>

* `tcx.tcache` -> `tcx.item_types`
* `TypeScheme` (grouping `Ty` and `ty::Generics`) is removed
* `tcx.item_types` entries no longer duplicated in `tcx.tables.node_types`
* `tcx.lookup_item_type(def_id).ty` -> `tcx.item_type(def_id)`
* `tcx.lookup_item_type(def_id).generics` -> `tcx.item_generics(def_id)`
* `tcx.lookup_generics(def_id)` -> `tcx.item_generics(def_id)`
* `tcx.lookup_{super_,}predicates(def_id)` -> `tcx.item_{super_,}predicates(def_id)`
This commit is contained in:
Eduard-Mihai Burtescu 2016-11-12 10:38:41 +02:00 committed by GitHub
commit 6dd4ee6d08
61 changed files with 399 additions and 491 deletions

View File

@ -112,15 +112,15 @@ impl<M: DepTrackingMapConfig> MemoizationMap for RefCell<DepTrackingMap<M>> {
/// switched to `Map(key)`. Therefore, if `op` makes use of any /// switched to `Map(key)`. Therefore, if `op` makes use of any
/// HIR nodes or shared state accessed through its closure /// HIR nodes or shared state accessed through its closure
/// environment, it must explicitly register a read of that /// environment, it must explicitly register a read of that
/// state. As an example, see `type_scheme_of_item` in `collect`, /// state. As an example, see `type_of_item` in `collect`,
/// which looks something like this: /// which looks something like this:
/// ///
/// ``` /// ```
/// fn type_scheme_of_item(..., item: &hir::Item) -> ty::TypeScheme<'tcx> { /// fn type_of_item(..., item: &hir::Item) -> Ty<'tcx> {
/// let item_def_id = ccx.tcx.map.local_def_id(it.id); /// let item_def_id = ccx.tcx.map.local_def_id(it.id);
/// ccx.tcx.tcache.memoized(item_def_id, || { /// ccx.tcx.item_types.memoized(item_def_id, || {
/// ccx.tcx.dep_graph.read(DepNode::Hir(item_def_id)); // (*) /// ccx.tcx.dep_graph.read(DepNode::Hir(item_def_id)); // (*)
/// compute_type_scheme_of_item(ccx, item) /// compute_type_of_item(ccx, item)
/// }); /// });
/// } /// }
/// ``` /// ```

View File

@ -1443,7 +1443,7 @@ impl<'a, 'gcx, 'tcx> Rebuilder<'a, 'gcx, 'tcx> {
match self.tcx.expect_def(cur_ty.id) { match self.tcx.expect_def(cur_ty.id) {
Def::Enum(did) | Def::TyAlias(did) | Def::Enum(did) | Def::TyAlias(did) |
Def::Struct(did) | Def::Union(did) => { Def::Struct(did) | Def::Union(did) => {
let generics = self.tcx.lookup_generics(did); let generics = self.tcx.item_generics(did);
let expected = let expected =
generics.regions.len() as u32; generics.regions.len() as u32;

View File

@ -433,7 +433,7 @@ impl<'a, 'tcx> DeadVisitor<'a, 'tcx> {
} }
fn should_warn_about_field(&mut self, field: &hir::StructField) -> bool { fn should_warn_about_field(&mut self, field: &hir::StructField) -> bool {
let field_type = self.tcx.tables().node_id_to_type(field.id); let field_type = self.tcx.item_type(self.tcx.map.local_def_id(field.id));
let is_marker_field = match field_type.ty_to_def_id() { let is_marker_field = match field_type.ty_to_def_id() {
Some(def_id) => self.tcx.lang_items.items().iter().any(|item| *item == Some(def_id)), Some(def_id) => self.tcx.lang_items.items().iter().any(|item| *item == Some(def_id)),
_ => false _ => false

View File

@ -51,7 +51,7 @@ struct ExprVisitor<'a, 'gcx: 'a+'tcx, 'tcx: 'a> {
impl<'a, 'gcx, 'tcx> ExprVisitor<'a, 'gcx, 'tcx> { impl<'a, 'gcx, 'tcx> ExprVisitor<'a, 'gcx, 'tcx> {
fn def_id_is_transmute(&self, def_id: DefId) -> bool { fn def_id_is_transmute(&self, def_id: DefId) -> bool {
let intrinsic = match self.infcx.tcx.lookup_item_type(def_id).ty.sty { let intrinsic = match self.infcx.tcx.item_type(def_id).sty {
ty::TyFnDef(.., ref bfty) => bfty.abi == RustIntrinsic, ty::TyFnDef(.., ref bfty) => bfty.abi == RustIntrinsic,
_ => return false _ => return false
}; };

View File

@ -112,7 +112,7 @@ use self::VarKind::*;
use dep_graph::DepNode; use dep_graph::DepNode;
use hir::def::*; use hir::def::*;
use hir::pat_util; use hir::pat_util;
use ty::{self, Ty, TyCtxt, ParameterEnvironment}; use ty::{self, TyCtxt, ParameterEnvironment};
use traits::{self, Reveal}; use traits::{self, Reveal};
use ty::subst::Subst; use ty::subst::Subst;
use lint; use lint;
@ -1440,28 +1440,30 @@ fn check_expr(this: &mut Liveness, expr: &Expr) {
} }
impl<'a, 'tcx> Liveness<'a, 'tcx> { impl<'a, 'tcx> Liveness<'a, 'tcx> {
fn fn_ret(&self, id: NodeId) -> ty::Binder<Ty<'tcx>> {
let fn_ty = self.ir.tcx.tables().node_id_to_type(id);
match fn_ty.sty {
ty::TyClosure(closure_def_id, substs) =>
self.ir.tcx.closure_type(closure_def_id, substs).sig.output(),
_ => fn_ty.fn_ret()
}
}
fn check_ret(&self, fn check_ret(&self,
id: NodeId, id: NodeId,
sp: Span, sp: Span,
_fk: FnKind, fk: FnKind,
entry_ln: LiveNode, entry_ln: LiveNode,
body: &hir::Expr) body: &hir::Expr)
{ {
let fn_ty = if let FnKind::Closure(_) = fk {
self.ir.tcx.tables().node_id_to_type(id)
} else {
self.ir.tcx.item_type(self.ir.tcx.map.local_def_id(id))
};
let fn_ret = match fn_ty.sty {
ty::TyClosure(closure_def_id, substs) =>
self.ir.tcx.closure_type(closure_def_id, substs).sig.output(),
_ => fn_ty.fn_ret()
};
// within the fn body, late-bound regions are liberated // within the fn body, late-bound regions are liberated
// and must outlive the *call-site* of the function. // and must outlive the *call-site* of the function.
let fn_ret = let fn_ret =
self.ir.tcx.liberate_late_bound_regions( self.ir.tcx.liberate_late_bound_regions(
self.ir.tcx.region_maps.call_site_extent(id, body.id), self.ir.tcx.region_maps.call_site_extent(id, body.id),
&self.fn_ret(id)); &fn_ret);
if !fn_ret.is_never() && self.live_on_entry(entry_ln, self.s.no_ret_var).is_some() { if !fn_ret.is_never() && self.live_on_entry(entry_ln, self.s.no_ret_var).is_some() {
let param_env = ParameterEnvironment::for_item(self.ir.tcx, id); let param_env = ParameterEnvironment::for_item(self.ir.tcx, id);

View File

@ -125,7 +125,7 @@ impl<'tcx> Lvalue<'tcx> {
Lvalue::Local(index) => Lvalue::Local(index) =>
LvalueTy::Ty { ty: mir.local_decls[index].ty }, LvalueTy::Ty { ty: mir.local_decls[index].ty },
Lvalue::Static(def_id) => Lvalue::Static(def_id) =>
LvalueTy::Ty { ty: tcx.lookup_item_type(def_id).ty }, LvalueTy::Ty { ty: tcx.item_type(def_id) },
Lvalue::Projection(ref proj) => Lvalue::Projection(ref proj) =>
proj.base.ty(mir, tcx).projection_ty(tcx, &proj.elem), proj.base.ty(mir, tcx).projection_ty(tcx, &proj.elem),
} }
@ -188,7 +188,7 @@ impl<'tcx> Rvalue<'tcx> {
)) ))
} }
AggregateKind::Adt(def, _, substs, _) => { AggregateKind::Adt(def, _, substs, _) => {
Some(tcx.lookup_item_type(def.did).ty.subst(tcx, substs)) Some(tcx.item_type(def.did).subst(tcx, substs))
} }
AggregateKind::Closure(did, substs) => { AggregateKind::Closure(did, substs) => {
Some(tcx.mk_closure_from_closure_substs(did, substs)) Some(tcx.mk_closure_from_closure_substs(did, substs))

View File

@ -154,9 +154,13 @@ impl<'a, 'gcx, 'tcx> DeferredObligation<'tcx> {
pub fn try_select(&self, tcx: TyCtxt<'a, 'gcx, 'tcx>) pub fn try_select(&self, tcx: TyCtxt<'a, 'gcx, 'tcx>)
-> Option<Vec<PredicateObligation<'tcx>>> { -> Option<Vec<PredicateObligation<'tcx>>> {
if let ty::TyAnon(def_id, substs) = self.predicate.skip_binder().self_ty().sty { if let ty::TyAnon(def_id, substs) = self.predicate.skip_binder().self_ty().sty {
let ty = if def_id.is_local() {
tcx.item_types.borrow().get(&def_id).cloned()
} else {
Some(tcx.item_type(def_id))
};
// We can resolve the `impl Trait` to its concrete type. // We can resolve the `impl Trait` to its concrete type.
if let Some(ty_scheme) = tcx.opt_lookup_item_type(def_id) { if let Some(concrete_ty) = ty.subst(tcx, substs) {
let concrete_ty = ty_scheme.ty.subst(tcx, substs);
let predicate = ty::TraitRef { let predicate = ty::TraitRef {
def_id: self.predicate.def_id(), def_id: self.predicate.def_id(),
substs: tcx.mk_substs_trait(concrete_ty, &[]) substs: tcx.mk_substs_trait(concrete_ty, &[])

View File

@ -603,7 +603,7 @@ pub fn get_vtable_methods<'a, 'tcx>(
// do not hold for this particular set of type parameters. // do not hold for this particular set of type parameters.
// Note that this method could then never be called, so we // Note that this method could then never be called, so we
// do not want to try and trans it, in that case (see #23435). // do not want to try and trans it, in that case (see #23435).
let predicates = tcx.lookup_predicates(def_id).instantiate_own(tcx, substs); let predicates = tcx.item_predicates(def_id).instantiate_own(tcx, substs);
if !normalize_and_test_predicates(tcx, predicates.predicates) { if !normalize_and_test_predicates(tcx, predicates.predicates) {
debug!("get_vtable_methods: predicates do not hold"); debug!("get_vtable_methods: predicates do not hold");
return None; return None;

View File

@ -129,7 +129,7 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
let trait_def = self.lookup_trait_def(trait_def_id); let trait_def = self.lookup_trait_def(trait_def_id);
let trait_ref = trait_def.trait_ref.clone(); let trait_ref = trait_def.trait_ref.clone();
let trait_ref = trait_ref.to_poly_trait_ref(); let trait_ref = trait_ref.to_poly_trait_ref();
let predicates = self.lookup_super_predicates(trait_def_id); let predicates = self.item_super_predicates(trait_def_id);
predicates predicates
.predicates .predicates
.into_iter() .into_iter()
@ -166,7 +166,7 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
// Search for a predicate like `Self : Sized` amongst the trait bounds. // Search for a predicate like `Self : Sized` amongst the trait bounds.
let free_substs = self.construct_free_substs(def_id, let free_substs = self.construct_free_substs(def_id,
self.region_maps.node_extent(ast::DUMMY_NODE_ID)); self.region_maps.node_extent(ast::DUMMY_NODE_ID));
let predicates = self.lookup_predicates(def_id); let predicates = self.item_predicates(def_id);
let predicates = predicates.instantiate(self, free_substs).predicates; let predicates = predicates.instantiate(self, free_substs).predicates;
elaborate_predicates(self, predicates) elaborate_predicates(self, predicates)
.any(|predicate| { .any(|predicate| {
@ -238,7 +238,7 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
// The `Self` type is erased, so it should not appear in list of // The `Self` type is erased, so it should not appear in list of
// arguments or return type apart from the receiver. // arguments or return type apart from the receiver.
let ref sig = self.lookup_item_type(method.def_id).ty.fn_sig(); let ref sig = self.item_type(method.def_id).fn_sig();
for &input_ty in &sig.0.inputs[1..] { for &input_ty in &sig.0.inputs[1..] {
if self.contains_illegal_self_type_reference(trait_def_id, input_ty) { if self.contains_illegal_self_type_reference(trait_def_id, input_ty) {
return Some(MethodViolationCode::ReferencesSelf); return Some(MethodViolationCode::ReferencesSelf);
@ -249,7 +249,7 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
} }
// We can't monomorphize things like `fn foo<A>(...)`. // We can't monomorphize things like `fn foo<A>(...)`.
if !self.lookup_generics(method.def_id).types.is_empty() { if !self.item_generics(method.def_id).types.is_empty() {
return Some(MethodViolationCode::Generic); return Some(MethodViolationCode::Generic);
} }

View File

@ -311,7 +311,7 @@ impl<'a, 'b, 'gcx, 'tcx> TypeFolder<'gcx, 'tcx> for AssociatedTypeNormalizer<'a,
ty::TyAnon(def_id, substs) if !substs.has_escaping_regions() => { // (*) ty::TyAnon(def_id, substs) if !substs.has_escaping_regions() => { // (*)
// Only normalize `impl Trait` after type-checking, usually in trans. // Only normalize `impl Trait` after type-checking, usually in trans.
if self.selcx.projection_mode() == Reveal::All { if self.selcx.projection_mode() == Reveal::All {
let generic_ty = self.tcx().lookup_item_type(def_id).ty; let generic_ty = self.tcx().item_type(def_id);
let concrete_ty = generic_ty.subst(self.tcx(), substs); let concrete_ty = generic_ty.subst(self.tcx(), substs);
self.fold_ty(concrete_ty) self.fold_ty(concrete_ty)
} else { } else {
@ -809,7 +809,7 @@ fn assemble_candidates_from_trait_def<'cx, 'gcx, 'tcx>(
}; };
// If so, extract what we know from the trait and try to come up with a good answer. // If so, extract what we know from the trait and try to come up with a good answer.
let trait_predicates = selcx.tcx().lookup_predicates(def_id); let trait_predicates = selcx.tcx().item_predicates(def_id);
let bounds = trait_predicates.instantiate(selcx.tcx(), substs); let bounds = trait_predicates.instantiate(selcx.tcx(), substs);
let bounds = elaborate_predicates(selcx.tcx(), bounds.predicates); let bounds = elaborate_predicates(selcx.tcx(), bounds.predicates);
assemble_candidates_from_predicates(selcx, assemble_candidates_from_predicates(selcx,
@ -1313,7 +1313,7 @@ fn confirm_impl_candidate<'cx, 'gcx, 'tcx>(
obligation.predicate.trait_ref); obligation.predicate.trait_ref);
tcx.types.err tcx.types.err
} else { } else {
tcx.lookup_item_type(node_item.item.def_id).ty tcx.item_type(node_item.item.def_id)
}; };
let substs = translate_substs(selcx.infcx(), impl_def_id, substs, node_item.node); let substs = translate_substs(selcx.infcx(), impl_def_id, substs, node_item.node);
Progress { Progress {

View File

@ -1200,7 +1200,7 @@ impl<'cx, 'gcx, 'tcx> SelectionContext<'cx, 'gcx, 'tcx> {
def_id={:?}, substs={:?}", def_id={:?}, substs={:?}",
def_id, substs); def_id, substs);
let item_predicates = self.tcx().lookup_predicates(def_id); let item_predicates = self.tcx().item_predicates(def_id);
let bounds = item_predicates.instantiate(self.tcx(), substs); let bounds = item_predicates.instantiate(self.tcx(), substs);
debug!("match_projection_obligation_against_definition_bounds: \ debug!("match_projection_obligation_against_definition_bounds: \
bounds={:?}", bounds={:?}",
@ -2884,7 +2884,7 @@ impl<'cx, 'gcx, 'tcx> SelectionContext<'cx, 'gcx, 'tcx> {
// obligation will normalize to `<$0 as Iterator>::Item = $1` and // obligation will normalize to `<$0 as Iterator>::Item = $1` and
// `$1: Copy`, so we must ensure the obligations are emitted in // `$1: Copy`, so we must ensure the obligations are emitted in
// that order. // that order.
let predicates = tcx.lookup_predicates(def_id); let predicates = tcx.item_predicates(def_id);
assert_eq!(predicates.parent, None); assert_eq!(predicates.parent, None);
let predicates = predicates.predicates.iter().flat_map(|predicate| { let predicates = predicates.predicates.iter().flat_map(|predicate| {
let predicate = normalize_with_depth(self, cause.clone(), recursion_depth, let predicate = normalize_with_depth(self, cause.clone(), recursion_depth,

View File

@ -128,7 +128,7 @@ impl<'cx, 'gcx, 'tcx> Elaborator<'cx, 'gcx, 'tcx> {
match *predicate { match *predicate {
ty::Predicate::Trait(ref data) => { ty::Predicate::Trait(ref data) => {
// Predicates declared on the trait. // Predicates declared on the trait.
let predicates = tcx.lookup_super_predicates(data.def_id()); let predicates = tcx.item_super_predicates(data.def_id());
let mut predicates: Vec<_> = let mut predicates: Vec<_> =
predicates.predicates predicates.predicates
@ -295,7 +295,7 @@ impl<'cx, 'gcx, 'tcx> Iterator for SupertraitDefIds<'cx, 'gcx, 'tcx> {
None => { return None; } None => { return None; }
}; };
let predicates = self.tcx.lookup_super_predicates(def_id); let predicates = self.tcx.item_super_predicates(def_id);
let visited = &mut self.visited; let visited = &mut self.visited;
self.stack.extend( self.stack.extend(
predicates.predicates predicates.predicates
@ -362,7 +362,7 @@ pub fn impl_trait_ref_and_oblig<'a, 'gcx, 'tcx>(selcx: &mut SelectionContext<'a,
let Normalized { value: impl_trait_ref, obligations: normalization_obligations1 } = let Normalized { value: impl_trait_ref, obligations: normalization_obligations1 } =
super::normalize(selcx, ObligationCause::dummy(), &impl_trait_ref); super::normalize(selcx, ObligationCause::dummy(), &impl_trait_ref);
let predicates = selcx.tcx().lookup_predicates(impl_def_id); let predicates = selcx.tcx().item_predicates(impl_def_id);
let predicates = predicates.instantiate(selcx.tcx(), impl_substs); let predicates = predicates.instantiate(selcx.tcx(), impl_substs);
let Normalized { value: predicates, obligations: normalization_obligations2 } = let Normalized { value: predicates, obligations: normalization_obligations2 } =
super::normalize(selcx, ObligationCause::dummy(), &predicates); super::normalize(selcx, ObligationCause::dummy(), &predicates);

View File

@ -444,7 +444,7 @@ pub struct GlobalCtxt<'tcx> {
pub maybe_unused_trait_imports: NodeSet, pub maybe_unused_trait_imports: NodeSet,
// Records the type of every item. // Records the type of every item.
pub tcache: RefCell<DepTrackingMap<maps::Tcache<'tcx>>>, pub item_types: RefCell<DepTrackingMap<maps::Types<'tcx>>>,
// Internal cache for metadata decoding. No need to track deps on this. // Internal cache for metadata decoding. No need to track deps on this.
pub rcache: RefCell<FxHashMap<ty::CReaderCacheKey, Ty<'tcx>>>, pub rcache: RefCell<FxHashMap<ty::CReaderCacheKey, Ty<'tcx>>>,
@ -665,10 +665,6 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
self.ty_param_defs.borrow().get(&node_id).unwrap().clone() self.ty_param_defs.borrow().get(&node_id).unwrap().clone()
} }
pub fn node_type_insert(self, id: NodeId, ty: Ty<'gcx>) {
self.tables.borrow_mut().node_types.insert(id, ty);
}
pub fn alloc_generics(self, generics: ty::Generics<'gcx>) pub fn alloc_generics(self, generics: ty::Generics<'gcx>)
-> &'gcx ty::Generics<'gcx> { -> &'gcx ty::Generics<'gcx> {
self.global_interners.arenas.generics.alloc(generics) self.global_interners.arenas.generics.alloc(generics)
@ -815,7 +811,7 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
mir_map: RefCell::new(DepTrackingMap::new(dep_graph.clone())), mir_map: RefCell::new(DepTrackingMap::new(dep_graph.clone())),
freevars: RefCell::new(freevars), freevars: RefCell::new(freevars),
maybe_unused_trait_imports: maybe_unused_trait_imports, maybe_unused_trait_imports: maybe_unused_trait_imports,
tcache: RefCell::new(DepTrackingMap::new(dep_graph.clone())), item_types: RefCell::new(DepTrackingMap::new(dep_graph.clone())),
rcache: RefCell::new(FxHashMap()), rcache: RefCell::new(FxHashMap()),
tc_cache: RefCell::new(FxHashMap()), tc_cache: RefCell::new(FxHashMap()),
associated_items: RefCell::new(DepTrackingMap::new(dep_graph.clone())), associated_items: RefCell::new(DepTrackingMap::new(dep_graph.clone())),

View File

@ -218,7 +218,7 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
// users may find it useful. Currently, we omit the parent if // users may find it useful. Currently, we omit the parent if
// the impl is either in the same module as the self-type or // the impl is either in the same module as the self-type or
// as the trait. // as the trait.
let self_ty = self.lookup_item_type(impl_def_id).ty; let self_ty = self.item_type(impl_def_id);
let in_self_mod = match characteristic_def_id_of_type(self_ty) { let in_self_mod = match characteristic_def_id_of_type(self_ty) {
None => false, None => false,
Some(ty_def_id) => self.parent_def_id(ty_def_id) == Some(parent_def_id), Some(ty_def_id) => self.parent_def_id(ty_def_id) == Some(parent_def_id),

View File

@ -33,7 +33,7 @@ macro_rules! dep_map_ty {
} }
dep_map_ty! { AssociatedItems: AssociatedItems(DefId) -> ty::AssociatedItem } dep_map_ty! { AssociatedItems: AssociatedItems(DefId) -> ty::AssociatedItem }
dep_map_ty! { Tcache: ItemSignature(DefId) -> Ty<'tcx> } dep_map_ty! { Types: ItemSignature(DefId) -> Ty<'tcx> }
dep_map_ty! { Generics: ItemSignature(DefId) -> &'tcx ty::Generics<'tcx> } dep_map_ty! { Generics: ItemSignature(DefId) -> &'tcx ty::Generics<'tcx> }
dep_map_ty! { Predicates: ItemSignature(DefId) -> ty::GenericPredicates<'tcx> } dep_map_ty! { Predicates: ItemSignature(DefId) -> ty::GenericPredicates<'tcx> }
dep_map_ty! { SuperPredicates: ItemSignature(DefId) -> ty::GenericPredicates<'tcx> } dep_map_ty! { SuperPredicates: ItemSignature(DefId) -> ty::GenericPredicates<'tcx> }

View File

@ -169,9 +169,9 @@ impl<'a, 'gcx, 'tcx> ImplHeader<'tcx> {
let header = ImplHeader { let header = ImplHeader {
impl_def_id: impl_def_id, impl_def_id: impl_def_id,
self_ty: tcx.lookup_item_type(impl_def_id).ty, self_ty: tcx.item_type(impl_def_id),
trait_ref: tcx.impl_trait_ref(impl_def_id), trait_ref: tcx.impl_trait_ref(impl_def_id),
predicates: tcx.lookup_predicates(impl_def_id).predicates predicates: tcx.item_predicates(impl_def_id).predicates
}.subst(tcx, impl_substs); }.subst(tcx, impl_substs);
let traits::Normalized { value: mut header, obligations } = let traits::Normalized { value: mut header, obligations } =
@ -708,7 +708,7 @@ impl<'a, 'gcx, 'tcx> GenericPredicates<'tcx> {
instantiated: &mut InstantiatedPredicates<'tcx>, instantiated: &mut InstantiatedPredicates<'tcx>,
substs: &Substs<'tcx>) { substs: &Substs<'tcx>) {
if let Some(def_id) = self.parent { if let Some(def_id) = self.parent {
tcx.lookup_predicates(def_id).instantiate_into(tcx, instantiated, substs); tcx.item_predicates(def_id).instantiate_into(tcx, instantiated, substs);
} }
instantiated.predicates.extend(self.predicates.iter().map(|p| p.subst(tcx, substs))) instantiated.predicates.extend(self.predicates.iter().map(|p| p.subst(tcx, substs)))
} }
@ -1301,31 +1301,6 @@ impl<'a, 'tcx> ParameterEnvironment<'tcx> {
} }
} }
/// A "type scheme", in ML terminology, is a type combined with some
/// set of generic types that the type is, well, generic over. In Rust
/// terms, it is the "type" of a fn item or struct -- this type will
/// include various generic parameters that must be substituted when
/// the item/struct is referenced. That is called converting the type
/// scheme to a monotype.
///
/// - `generics`: the set of type parameters and their bounds
/// - `ty`: the base types, which may reference the parameters defined
/// in `generics`
///
/// Note that TypeSchemes are also sometimes called "polytypes" (and
/// in fact this struct used to carry that name, so you may find some
/// stray references in a comment or something). We try to reserve the
/// "poly" prefix to refer to higher-ranked things, as in
/// `PolyTraitRef`.
///
/// Note that each item also comes with predicates, see
/// `lookup_predicates`.
#[derive(Clone, Debug)]
pub struct TypeScheme<'tcx> {
pub generics: &'tcx Generics<'tcx>,
pub ty: Ty<'tcx>,
}
bitflags! { bitflags! {
flags AdtFlags: u32 { flags AdtFlags: u32 {
const NO_ADT_FLAGS = 0, const NO_ADT_FLAGS = 0,
@ -1359,8 +1334,6 @@ pub struct VariantDefData<'tcx, 'container: 'tcx> {
} }
pub struct FieldDefData<'tcx, 'container: 'tcx> { pub struct FieldDefData<'tcx, 'container: 'tcx> {
/// The field's DefId. NOTE: the fields of tuple-like enum variants
/// are not real items, and don't have entries in tcache etc.
pub did: DefId, pub did: DefId,
pub name: Name, pub name: Name,
pub vis: Visibility, pub vis: Visibility,
@ -1541,14 +1514,9 @@ impl<'a, 'gcx, 'tcx, 'container> AdtDefData<'gcx, 'container> {
&self.variants[0] &self.variants[0]
} }
#[inline]
pub fn type_scheme(&self, tcx: TyCtxt<'a, 'gcx, 'tcx>) -> TypeScheme<'gcx> {
tcx.lookup_item_type(self.did)
}
#[inline] #[inline]
pub fn predicates(&self, tcx: TyCtxt<'a, 'gcx, 'tcx>) -> GenericPredicates<'gcx> { pub fn predicates(&self, tcx: TyCtxt<'a, 'gcx, 'tcx>) -> GenericPredicates<'gcx> {
tcx.lookup_predicates(self.did) tcx.item_predicates(self.did)
} }
/// Returns an iterator over all fields contained /// Returns an iterator over all fields contained
@ -1784,7 +1752,7 @@ impl<'a, 'tcx> AdtDefData<'tcx, 'tcx> {
def_id: sized_trait, def_id: sized_trait,
substs: tcx.mk_substs_trait(ty, &[]) substs: tcx.mk_substs_trait(ty, &[])
}).to_predicate(); }).to_predicate();
let predicates = tcx.lookup_predicates(self.did).predicates; let predicates = tcx.item_predicates(self.did).predicates;
if predicates.into_iter().any(|p| p == sized_predicate) { if predicates.into_iter().any(|p| p == sized_predicate) {
vec![] vec![]
} else { } else {
@ -1963,7 +1931,7 @@ impl LvaluePreference {
} }
/// Helper for looking things up in the various maps that are populated during /// Helper for looking things up in the various maps that are populated during
/// typeck::collect (e.g., `tcx.associated_items`, `tcx.tcache`, etc). All of /// typeck::collect (e.g., `tcx.associated_items`, `tcx.types`, etc). All of
/// these share the pattern that if the id is local, it should have been loaded /// these share the pattern that if the id is local, it should have been loaded
/// into the map by the `typeck::collect` phase. If the def-id is external, /// into the map by the `typeck::collect` phase. If the def-id is external,
/// then we have to go consult the crate loading code (and cache the result for /// then we have to go consult the crate loading code (and cache the result for
@ -2351,38 +2319,12 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
} }
} }
// Register a given item type
pub fn register_item_type(self, did: DefId, scheme: TypeScheme<'gcx>) {
self.tcache.borrow_mut().insert(did, scheme.ty);
self.generics.borrow_mut().insert(did, scheme.generics);
}
// If the given item is in an external crate, looks up its type and adds it to // If the given item is in an external crate, looks up its type and adds it to
// the type cache. Returns the type parameters and type. // the type cache. Returns the type parameters and type.
pub fn lookup_item_type(self, did: DefId) -> TypeScheme<'gcx> { pub fn item_type(self, did: DefId) -> Ty<'gcx> {
let ty = lookup_locally_or_in_crate_store( lookup_locally_or_in_crate_store(
"tcache", did, &self.tcache, "item_types", did, &self.item_types,
|| self.sess.cstore.item_type(self.global_tcx(), did)); || self.sess.cstore.item_type(self.global_tcx(), did))
TypeScheme {
ty: ty,
generics: self.lookup_generics(did)
}
}
pub fn opt_lookup_item_type(self, did: DefId) -> Option<TypeScheme<'gcx>> {
if did.krate != LOCAL_CRATE {
return Some(self.lookup_item_type(did));
}
if let Some(ty) = self.tcache.borrow().get(&did).cloned() {
Some(TypeScheme {
ty: ty,
generics: self.lookup_generics(did)
})
} else {
None
}
} }
/// Given the did of a trait, returns its canonical trait ref. /// Given the did of a trait, returns its canonical trait ref.
@ -2411,21 +2353,21 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
} }
/// Given the did of an item, returns its generics. /// Given the did of an item, returns its generics.
pub fn lookup_generics(self, did: DefId) -> &'gcx Generics<'gcx> { pub fn item_generics(self, did: DefId) -> &'gcx Generics<'gcx> {
lookup_locally_or_in_crate_store( lookup_locally_or_in_crate_store(
"generics", did, &self.generics, "generics", did, &self.generics,
|| self.alloc_generics(self.sess.cstore.item_generics(self.global_tcx(), did))) || self.alloc_generics(self.sess.cstore.item_generics(self.global_tcx(), did)))
} }
/// Given the did of an item, returns its full set of predicates. /// Given the did of an item, returns its full set of predicates.
pub fn lookup_predicates(self, did: DefId) -> GenericPredicates<'gcx> { pub fn item_predicates(self, did: DefId) -> GenericPredicates<'gcx> {
lookup_locally_or_in_crate_store( lookup_locally_or_in_crate_store(
"predicates", did, &self.predicates, "predicates", did, &self.predicates,
|| self.sess.cstore.item_predicates(self.global_tcx(), did)) || self.sess.cstore.item_predicates(self.global_tcx(), did))
} }
/// Given the did of a trait, returns its superpredicates. /// Given the did of a trait, returns its superpredicates.
pub fn lookup_super_predicates(self, did: DefId) -> GenericPredicates<'gcx> { pub fn item_super_predicates(self, did: DefId) -> GenericPredicates<'gcx> {
lookup_locally_or_in_crate_store( lookup_locally_or_in_crate_store(
"super_predicates", did, &self.super_predicates, "super_predicates", did, &self.super_predicates,
|| self.sess.cstore.item_super_predicates(self.global_tcx(), did)) || self.sess.cstore.item_super_predicates(self.global_tcx(), did))
@ -2718,7 +2660,7 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> {
// //
let tcx = self.global_tcx(); let tcx = self.global_tcx();
let generic_predicates = tcx.lookup_predicates(def_id); let generic_predicates = tcx.item_predicates(def_id);
let bounds = generic_predicates.instantiate(tcx, free_substs); let bounds = generic_predicates.instantiate(tcx, free_substs);
let bounds = tcx.liberate_late_bound_regions(free_id_outlive, &ty::Binder(bounds)); let bounds = tcx.liberate_late_bound_regions(free_id_outlive, &ty::Binder(bounds));
let predicates = bounds.predicates; let predicates = bounds.predicates;

View File

@ -164,7 +164,7 @@ pub enum TypeVariants<'tcx> {
/// Anonymized (`impl Trait`) type found in a return type. /// Anonymized (`impl Trait`) type found in a return type.
/// The DefId comes from the `impl Trait` ast::Ty node, and the /// The DefId comes from the `impl Trait` ast::Ty node, and the
/// substitutions are for the generics of the function in question. /// substitutions are for the generics of the function in question.
/// After typeck, the concrete type can be found in the `tcache` map. /// After typeck, the concrete type can be found in the `types` map.
TyAnon(DefId, &'tcx Substs<'tcx>), TyAnon(DefId, &'tcx Substs<'tcx>),
/// A type parameter; for example, `T` in `fn f<T>(x: T) {} /// A type parameter; for example, `T` in `fn f<T>(x: T) {}
@ -556,7 +556,7 @@ pub struct DebruijnIndex {
/// ///
/// These are regions that are stored behind a binder and must be substituted /// These are regions that are stored behind a binder and must be substituted
/// with some concrete region before being used. There are 2 kind of /// with some concrete region before being used. There are 2 kind of
/// bound regions: early-bound, which are bound in a TypeScheme/TraitDef, /// bound regions: early-bound, which are bound in an item's Generics,
/// and are substituted by a Substs, and late-bound, which are part of /// and are substituted by a Substs, and late-bound, which are part of
/// higher-ranked types (e.g. `for<'a> fn(&'a ())`) and are substituted by /// higher-ranked types (e.g. `for<'a> fn(&'a ())`) and are substituted by
/// the likes of `liberate_late_bound_regions`. The distinction exists /// the likes of `liberate_late_bound_regions`. The distinction exists

View File

@ -177,7 +177,7 @@ impl<'a, 'gcx, 'tcx> Substs<'tcx> {
-> &'tcx Substs<'tcx> -> &'tcx Substs<'tcx>
where FR: FnMut(&ty::RegionParameterDef, &[Kind<'tcx>]) -> &'tcx ty::Region, where FR: FnMut(&ty::RegionParameterDef, &[Kind<'tcx>]) -> &'tcx ty::Region,
FT: FnMut(&ty::TypeParameterDef<'tcx>, &[Kind<'tcx>]) -> Ty<'tcx> { FT: FnMut(&ty::TypeParameterDef<'tcx>, &[Kind<'tcx>]) -> Ty<'tcx> {
let defs = tcx.lookup_generics(def_id); let defs = tcx.item_generics(def_id);
let mut substs = Vec::with_capacity(defs.count()); let mut substs = Vec::with_capacity(defs.count());
Substs::fill_item(&mut substs, tcx, defs, &mut mk_region, &mut mk_type); Substs::fill_item(&mut substs, tcx, defs, &mut mk_region, &mut mk_type);
tcx.intern_substs(&substs) tcx.intern_substs(&substs)
@ -192,7 +192,7 @@ impl<'a, 'gcx, 'tcx> Substs<'tcx> {
FT: FnMut(&ty::TypeParameterDef<'tcx>, &[Kind<'tcx>]) -> Ty<'tcx> { FT: FnMut(&ty::TypeParameterDef<'tcx>, &[Kind<'tcx>]) -> Ty<'tcx> {
if let Some(def_id) = defs.parent { if let Some(def_id) = defs.parent {
let parent_defs = tcx.lookup_generics(def_id); let parent_defs = tcx.item_generics(def_id);
Substs::fill_item(substs, tcx, parent_defs, mk_region, mk_type); Substs::fill_item(substs, tcx, parent_defs, mk_region, mk_type);
} }
@ -271,7 +271,7 @@ impl<'a, 'gcx, 'tcx> Substs<'tcx> {
source_ancestor: DefId, source_ancestor: DefId,
target_substs: &Substs<'tcx>) target_substs: &Substs<'tcx>)
-> &'tcx Substs<'tcx> { -> &'tcx Substs<'tcx> {
let defs = tcx.lookup_generics(source_ancestor); let defs = tcx.item_generics(source_ancestor);
tcx.mk_substs(target_substs.iter().chain(&self[defs.own_count()..]).cloned()) tcx.mk_substs(target_substs.iter().chain(&self[defs.own_count()..]).cloned())
} }
} }
@ -519,7 +519,7 @@ impl<'a, 'gcx, 'tcx> ty::TraitRef<'tcx> {
trait_id: DefId, trait_id: DefId,
substs: &Substs<'tcx>) substs: &Substs<'tcx>)
-> ty::TraitRef<'tcx> { -> ty::TraitRef<'tcx> {
let defs = tcx.lookup_generics(trait_id); let defs = tcx.item_generics(trait_id);
ty::TraitRef { ty::TraitRef {
def_id: trait_id, def_id: trait_id,

View File

@ -18,7 +18,7 @@ use std::cell::{Cell, RefCell};
use hir; use hir;
use util::nodemap::FxHashMap; use util::nodemap::FxHashMap;
/// As `TypeScheme` but for a trait ref. /// A trait's definition with type information.
pub struct TraitDef<'tcx> { pub struct TraitDef<'tcx> {
pub unsafety: hir::Unsafety, pub unsafety: hir::Unsafety,

View File

@ -446,7 +446,7 @@ impl<'a, 'gcx, 'tcx> WfPredicates<'a, 'gcx, 'tcx> {
-> Vec<traits::PredicateObligation<'tcx>> -> Vec<traits::PredicateObligation<'tcx>>
{ {
let predicates = let predicates =
self.infcx.tcx.lookup_predicates(def_id) self.infcx.tcx.item_predicates(def_id)
.instantiate(self.infcx.tcx, substs); .instantiate(self.infcx.tcx, substs);
let cause = self.cause(traits::ItemObligation(def_id)); let cause = self.cause(traits::ItemObligation(def_id));
predicates.predicates predicates.predicates

View File

@ -105,7 +105,7 @@ pub fn parameterized(f: &mut fmt::Formatter,
} }
} }
} }
let mut generics = tcx.lookup_generics(item_def_id); let mut generics = tcx.item_generics(item_def_id);
let mut path_def_id = did; let mut path_def_id = did;
verbose = tcx.sess.verbose(); verbose = tcx.sess.verbose();
has_self = generics.has_self; has_self = generics.has_self;
@ -115,7 +115,7 @@ pub fn parameterized(f: &mut fmt::Formatter,
// Methods. // Methods.
assert!(is_value_path); assert!(is_value_path);
child_types = generics.types.len(); child_types = generics.types.len();
generics = tcx.lookup_generics(def_id); generics = tcx.item_generics(def_id);
num_regions = generics.regions.len(); num_regions = generics.regions.len();
num_types = generics.types.len(); num_types = generics.types.len();
@ -865,7 +865,7 @@ impl<'tcx> fmt::Display for ty::TypeVariants<'tcx> {
TyAdt(def, substs) => { TyAdt(def, substs) => {
ty::tls::with(|tcx| { ty::tls::with(|tcx| {
if def.did.is_local() && if def.did.is_local() &&
!tcx.tcache.borrow().contains_key(&def.did) { !tcx.item_types.borrow().contains_key(&def.did) {
write!(f, "{}<..>", tcx.item_path_str(def.did)) write!(f, "{}<..>", tcx.item_path_str(def.did))
} else { } else {
parameterized(f, substs, def.did, &[]) parameterized(f, substs, def.did, &[])
@ -878,7 +878,7 @@ impl<'tcx> fmt::Display for ty::TypeVariants<'tcx> {
ty::tls::with(|tcx| { ty::tls::with(|tcx| {
// Grab the "TraitA + TraitB" from `impl TraitA + TraitB`, // Grab the "TraitA + TraitB" from `impl TraitA + TraitB`,
// by looking up the projections associated with the def_id. // by looking up the projections associated with the def_id.
let item_predicates = tcx.lookup_predicates(def_id); let item_predicates = tcx.item_predicates(def_id);
let substs = tcx.lift(&substs).unwrap_or_else(|| { let substs = tcx.lift(&substs).unwrap_or_else(|| {
tcx.intern_substs(&[]) tcx.intern_substs(&[])
}); });

View File

@ -858,7 +858,7 @@ impl<'b, 'tcx> ElaborateDropsCtxt<'b, 'tcx> {
let free_func = tcx.lang_items.require(lang_items::BoxFreeFnLangItem) let free_func = tcx.lang_items.require(lang_items::BoxFreeFnLangItem)
.unwrap_or_else(|e| tcx.sess.fatal(&e)); .unwrap_or_else(|e| tcx.sess.fatal(&e));
let substs = tcx.mk_substs(iter::once(Kind::from(ty))); let substs = tcx.mk_substs(iter::once(Kind::from(ty)));
let fty = tcx.lookup_item_type(free_func).ty.subst(tcx, substs); let fty = tcx.item_type(free_func).subst(tcx, substs);
self.patch.new_block(BasicBlockData { self.patch.new_block(BasicBlockData {
statements: statements, statements: statements,

View File

@ -118,9 +118,10 @@ impl LateLintPass for BoxPointers {
hir::ItemEnum(..) | hir::ItemEnum(..) |
hir::ItemStruct(..) | hir::ItemStruct(..) |
hir::ItemUnion(..) => { hir::ItemUnion(..) => {
self.check_heap_type(cx, it.span, cx.tcx.tables().node_id_to_type(it.id)) let def_id = cx.tcx.map.local_def_id(it.id);
self.check_heap_type(cx, it.span, cx.tcx.item_type(def_id))
} }
_ => (), _ => ()
} }
// If it's a struct, we also have to check the fields' types // If it's a struct, we also have to check the fields' types
@ -128,9 +129,9 @@ impl LateLintPass for BoxPointers {
hir::ItemStruct(ref struct_def, _) | hir::ItemStruct(ref struct_def, _) |
hir::ItemUnion(ref struct_def, _) => { hir::ItemUnion(ref struct_def, _) => {
for struct_field in struct_def.fields() { for struct_field in struct_def.fields() {
self.check_heap_type(cx, let def_id = cx.tcx.map.local_def_id(struct_field.id);
struct_field.span, self.check_heap_type(cx, struct_field.span,
cx.tcx.tables().node_id_to_type(struct_field.id)); cx.tcx.item_type(def_id));
} }
} }
_ => (), _ => (),
@ -585,11 +586,9 @@ impl LateLintPass for MissingDebugImplementations {
let debug_def = cx.tcx.lookup_trait_def(debug); let debug_def = cx.tcx.lookup_trait_def(debug);
let mut impls = NodeSet(); let mut impls = NodeSet();
debug_def.for_each_impl(cx.tcx, |d| { debug_def.for_each_impl(cx.tcx, |d| {
if let Some(n) = cx.tcx.map.as_local_node_id(d) { if let Some(ty_def) = cx.tcx.item_type(d).ty_to_def_id() {
if let Some(ty_def) = cx.tcx.tables().node_id_to_type(n).ty_to_def_id() { if let Some(node_id) = cx.tcx.map.as_local_node_id(ty_def) {
if let Some(node_id) = cx.tcx.map.as_local_node_id(ty_def) { impls.insert(node_id);
impls.insert(node_id);
}
} }
} }
}); });
@ -1225,7 +1224,7 @@ impl LateLintPass for MutableTransmutes {
} }
fn def_id_is_transmute(cx: &LateContext, def_id: DefId) -> bool { fn def_id_is_transmute(cx: &LateContext, def_id: DefId) -> bool {
match cx.tcx.lookup_item_type(def_id).ty.sty { match cx.tcx.item_type(def_id).sty {
ty::TyFnDef(.., ref bfty) if bfty.abi == RustIntrinsic => (), ty::TyFnDef(.., ref bfty) if bfty.abi == RustIntrinsic => (),
_ => return false, _ => return false,
} }
@ -1282,7 +1281,7 @@ impl LateLintPass for UnionsWithDropFields {
if let hir::ItemUnion(ref vdata, _) = item.node { if let hir::ItemUnion(ref vdata, _) = item.node {
let param_env = &ty::ParameterEnvironment::for_item(ctx.tcx, item.id); let param_env = &ty::ParameterEnvironment::for_item(ctx.tcx, item.id);
for field in vdata.fields() { for field in vdata.fields() {
let field_ty = ctx.tcx.tables().node_id_to_type(field.id); let field_ty = ctx.tcx.item_type(ctx.tcx.map.local_def_id(field.id));
if ctx.tcx.type_needs_drop_given_env(field_ty, param_env) { if ctx.tcx.type_needs_drop_given_env(field_ty, param_env) {
ctx.span_lint(UNIONS_WITH_DROP_FIELDS, ctx.span_lint(UNIONS_WITH_DROP_FIELDS,
field.span, field.span,

View File

@ -675,8 +675,7 @@ impl<'a, 'tcx> ImproperCTypesVisitor<'a, 'tcx> {
fn check_foreign_fn(&mut self, id: ast::NodeId, decl: &hir::FnDecl) { fn check_foreign_fn(&mut self, id: ast::NodeId, decl: &hir::FnDecl) {
let def_id = self.cx.tcx.map.local_def_id(id); let def_id = self.cx.tcx.map.local_def_id(id);
let scheme = self.cx.tcx.lookup_item_type(def_id); let sig = self.cx.tcx.item_type(def_id).fn_sig();
let sig = scheme.ty.fn_sig();
let sig = self.cx.tcx.erase_late_bound_regions(&sig); let sig = self.cx.tcx.erase_late_bound_regions(&sig);
for (&input_ty, input_hir) in sig.inputs.iter().zip(&decl.inputs) { for (&input_ty, input_hir) in sig.inputs.iter().zip(&decl.inputs) {
@ -693,8 +692,8 @@ impl<'a, 'tcx> ImproperCTypesVisitor<'a, 'tcx> {
fn check_foreign_static(&mut self, id: ast::NodeId, span: Span) { fn check_foreign_static(&mut self, id: ast::NodeId, span: Span) {
let def_id = self.cx.tcx.map.local_def_id(id); let def_id = self.cx.tcx.map.local_def_id(id);
let scheme = self.cx.tcx.lookup_item_type(def_id); let ty = self.cx.tcx.item_type(def_id);
self.check_type_for_ffi_and_report_errors(span, scheme.ty); self.check_type_for_ffi_and_report_errors(span, ty);
} }
} }
@ -740,11 +739,12 @@ impl LateLintPass for VariantSizeDifferences {
if let hir::ItemEnum(ref enum_definition, ref gens) = it.node { if let hir::ItemEnum(ref enum_definition, ref gens) = it.node {
if gens.ty_params.is_empty() { if gens.ty_params.is_empty() {
// sizes only make sense for non-generic types // sizes only make sense for non-generic types
let t = cx.tcx.tables().node_id_to_type(it.id); let t = cx.tcx.item_type(cx.tcx.map.local_def_id(it.id));
let layout = cx.tcx.infer_ctxt(None, None, Reveal::All).enter(|infcx| { let layout = cx.tcx.infer_ctxt(None, None, Reveal::All).enter(|infcx| {
let ty = cx.tcx.erase_regions(&t); let ty = cx.tcx.erase_regions(&t);
ty.layout(&infcx) ty.layout(&infcx).unwrap_or_else(|e| {
.unwrap_or_else(|e| bug!("failed to get layout for `{}`: {}", t, e)) bug!("failed to get layout for `{}`: {}", t, e)
})
}); });
if let Layout::General { ref variants, ref size, discr, .. } = *layout { if let Layout::General { ref variants, ref size, discr, .. } = *layout {

View File

@ -133,7 +133,10 @@ pub fn decode_inlined_item<'a, 'tcx>(cdata: &CrateMetadata,
&InlinedItem::ImplItem(_, ref ii) => ii.id, &InlinedItem::ImplItem(_, ref ii) => ii.id,
}; };
let inlined_did = tcx.map.local_def_id(item_node_id); let inlined_did = tcx.map.local_def_id(item_node_id);
tcx.register_item_type(inlined_did, tcx.lookup_item_type(orig_did)); let ty = tcx.item_type(orig_did);
let generics = tcx.item_generics(orig_did);
tcx.item_types.borrow_mut().insert(inlined_did, ty);
tcx.generics.borrow_mut().insert(inlined_did, generics);
for (id, entry) in ast.side_tables.decode((cdata, tcx, id_ranges)) { for (id, entry) in ast.side_tables.decode((cdata, tcx, id_ranges)) {
match entry { match entry {
@ -141,7 +144,7 @@ pub fn decode_inlined_item<'a, 'tcx>(cdata: &CrateMetadata,
tcx.def_map.borrow_mut().insert(id, def::PathResolution::new(def)); tcx.def_map.borrow_mut().insert(id, def::PathResolution::new(def));
} }
TableEntry::NodeType(ty) => { TableEntry::NodeType(ty) => {
tcx.node_type_insert(id, ty); tcx.tables.borrow_mut().node_types.insert(id, ty);
} }
TableEntry::ItemSubsts(item_substs) => { TableEntry::ItemSubsts(item_substs) => {
tcx.tables.borrow_mut().item_substs.insert(id, item_substs); tcx.tables.borrow_mut().item_substs.insert(id, item_substs);

View File

@ -527,7 +527,7 @@ impl<'a, 'tcx> CrateMetadata {
ty::TraitDef::new(data.unsafety, ty::TraitDef::new(data.unsafety,
data.paren_sugar, data.paren_sugar,
tcx.lookup_generics(self.local_def_id(item_id)), tcx.item_generics(self.local_def_id(item_id)),
data.trait_ref.decode((self, tcx)), data.trait_ref.decode((self, tcx)),
self.def_path(item_id).unwrap().deterministic_hash(tcx)) self.def_path(item_id).unwrap().deterministic_hash(tcx))
} }

View File

@ -246,7 +246,7 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
fn encode_item_type(&mut self, def_id: DefId) -> Lazy<Ty<'tcx>> { fn encode_item_type(&mut self, def_id: DefId) -> Lazy<Ty<'tcx>> {
let tcx = self.tcx; let tcx = self.tcx;
self.lazy(&tcx.lookup_item_type(def_id).ty) self.lazy(&tcx.item_type(def_id))
} }
/// Encode data for the given variant of the given ADT. The /// Encode data for the given variant of the given ADT. The
@ -444,12 +444,12 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
fn encode_generics(&mut self, def_id: DefId) -> Lazy<ty::Generics<'tcx>> { fn encode_generics(&mut self, def_id: DefId) -> Lazy<ty::Generics<'tcx>> {
let tcx = self.tcx; let tcx = self.tcx;
self.lazy(tcx.lookup_generics(def_id)) self.lazy(tcx.item_generics(def_id))
} }
fn encode_predicates(&mut self, def_id: DefId) -> Lazy<ty::GenericPredicates<'tcx>> { fn encode_predicates(&mut self, def_id: DefId) -> Lazy<ty::GenericPredicates<'tcx>> {
let tcx = self.tcx; let tcx = self.tcx;
self.lazy(&tcx.lookup_predicates(def_id)) self.lazy(&tcx.item_predicates(def_id))
} }
fn encode_info_for_trait_item(&mut self, def_id: DefId) -> Entry<'tcx> { fn encode_info_for_trait_item(&mut self, def_id: DefId) -> Entry<'tcx> {
@ -556,7 +556,7 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
let (ast, mir) = if impl_item.kind == ty::AssociatedKind::Const { let (ast, mir) = if impl_item.kind == ty::AssociatedKind::Const {
(true, true) (true, true)
} else if let hir::ImplItemKind::Method(ref sig, _) = ast_item.node { } else if let hir::ImplItemKind::Method(ref sig, _) = ast_item.node {
let generics = self.tcx.lookup_generics(def_id); let generics = self.tcx.item_generics(def_id);
let types = generics.parent_types as usize + generics.types.len(); let types = generics.parent_types as usize + generics.types.len();
let needs_inline = types > 0 || attr::requests_inline(&ast_item.attrs); let needs_inline = types > 0 || attr::requests_inline(&ast_item.attrs);
let is_const_fn = sig.constness == hir::Constness::Const; let is_const_fn = sig.constness == hir::Constness::Const;
@ -717,7 +717,7 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> {
paren_sugar: trait_def.paren_sugar, paren_sugar: trait_def.paren_sugar,
has_default_impl: tcx.trait_has_default_impl(def_id), has_default_impl: tcx.trait_has_default_impl(def_id),
trait_ref: self.lazy(&trait_def.trait_ref), trait_ref: self.lazy(&trait_def.trait_ref),
super_predicates: self.lazy(&tcx.lookup_super_predicates(def_id)), super_predicates: self.lazy(&tcx.item_super_predicates(def_id)),
}; };
EntryKind::Trait(self.lazy(&data)) EntryKind::Trait(self.lazy(&data))

View File

@ -155,6 +155,7 @@ macro_rules! unpack {
pub fn construct_fn<'a, 'gcx, 'tcx, A>(hir: Cx<'a, 'gcx, 'tcx>, pub fn construct_fn<'a, 'gcx, 'tcx, A>(hir: Cx<'a, 'gcx, 'tcx>,
fn_id: ast::NodeId, fn_id: ast::NodeId,
arguments: A, arguments: A,
abi: Abi,
return_ty: Ty<'gcx>, return_ty: Ty<'gcx>,
ast_body: &'gcx hir::Expr) ast_body: &'gcx hir::Expr)
-> (Mir<'tcx>, ScopeAuxiliaryVec) -> (Mir<'tcx>, ScopeAuxiliaryVec)
@ -191,12 +192,9 @@ pub fn construct_fn<'a, 'gcx, 'tcx, A>(hir: Cx<'a, 'gcx, 'tcx>,
assert_eq!(block, builder.return_block()); assert_eq!(block, builder.return_block());
let mut spread_arg = None; let mut spread_arg = None;
match tcx.tables().node_id_to_type(fn_id).sty { if abi == Abi::RustCall {
ty::TyFnDef(_, _, f) if f.abi == Abi::RustCall => { // RustCall pseudo-ABI untuples the last argument.
// RustCall pseudo-ABI untuples the last argument. spread_arg = Some(Local::new(arguments.len()));
spread_arg = Some(Local::new(arguments.len()));
}
_ => {}
} }
// Gather the upvars of a closure, if any. // Gather the upvars of a closure, if any.

View File

@ -806,7 +806,7 @@ fn build_free<'a, 'gcx, 'tcx>(tcx: TyCtxt<'a, 'gcx, 'tcx>,
TerminatorKind::Call { TerminatorKind::Call {
func: Operand::Constant(Constant { func: Operand::Constant(Constant {
span: data.span, span: data.span,
ty: tcx.lookup_item_type(free_func).ty.subst(tcx, substs), ty: tcx.item_type(free_func).subst(tcx, substs),
literal: Literal::Item { literal: Literal::Item {
def_id: free_func, def_id: free_func,
substs: substs substs: substs

View File

@ -149,8 +149,8 @@ impl<'a, 'gcx, 'tcx> Cx<'a, 'gcx, 'tcx> {
let substs = self.tcx.mk_substs_trait(self_ty, params); let substs = self.tcx.mk_substs_trait(self_ty, params);
for item in self.tcx.associated_items(trait_def_id) { for item in self.tcx.associated_items(trait_def_id) {
if item.kind == ty::AssociatedKind::Method && item.name == method_name { if item.kind == ty::AssociatedKind::Method && item.name == method_name {
let method_ty = self.tcx.lookup_item_type(item.def_id); let method_ty = self.tcx.item_type(item.def_id);
let method_ty = method_ty.ty.subst(self.tcx, substs); let method_ty = method_ty.subst(self.tcx, substs);
return (method_ty, Literal::Item { return (method_ty, Literal::Item {
def_id: item.def_id, def_id: item.def_id,
substs: substs, substs: substs,

View File

@ -31,6 +31,7 @@ use rustc::ty::{self, Ty, TyCtxt};
use rustc::ty::subst::Substs; use rustc::ty::subst::Substs;
use rustc::hir; use rustc::hir;
use rustc::hir::intravisit::{self, FnKind, Visitor}; use rustc::hir::intravisit::{self, FnKind, Visitor};
use syntax::abi::Abi;
use syntax::ast; use syntax::ast;
use syntax_pos::Span; use syntax_pos::Span;
@ -221,10 +222,11 @@ impl<'a, 'tcx> Visitor<'tcx> for BuildMir<'a, 'tcx> {
} }
}; };
let implicit_argument = if let FnKind::Closure(..) = fk { let (abi, implicit_argument) = if let FnKind::Closure(..) = fk {
Some((closure_self_ty(self.tcx, id, body.id), None)) (Abi::Rust, Some((closure_self_ty(self.tcx, id, body.id), None)))
} else { } else {
None let def_id = self.tcx.map.local_def_id(id);
(self.tcx.item_type(def_id).fn_abi(), None)
}; };
let explicit_arguments = let explicit_arguments =
@ -237,7 +239,7 @@ impl<'a, 'tcx> Visitor<'tcx> for BuildMir<'a, 'tcx> {
let arguments = implicit_argument.into_iter().chain(explicit_arguments); let arguments = implicit_argument.into_iter().chain(explicit_arguments);
self.cx(MirSource::Fn(id)).build(|cx| { self.cx(MirSource::Fn(id)).build(|cx| {
build::construct_fn(cx, id, arguments, fn_sig.output, body) build::construct_fn(cx, id, arguments, abi, fn_sig.output, body)
}); });
intravisit::walk_fn(self, fk, decl, body, span, id); intravisit::walk_fn(self, fk, decl, body, span, id);

View File

@ -127,7 +127,7 @@ impl<'a, 'b, 'gcx, 'tcx> TypeVerifier<'a, 'b, 'gcx, 'tcx> {
match *lvalue { match *lvalue {
Lvalue::Local(index) => LvalueTy::Ty { ty: self.mir.local_decls[index].ty }, Lvalue::Local(index) => LvalueTy::Ty { ty: self.mir.local_decls[index].ty },
Lvalue::Static(def_id) => Lvalue::Static(def_id) =>
LvalueTy::Ty { ty: self.tcx().lookup_item_type(def_id).ty }, LvalueTy::Ty { ty: self.tcx().item_type(def_id) },
Lvalue::Projection(ref proj) => { Lvalue::Projection(ref proj) => {
let base_ty = self.sanitize_lvalue(&proj.base, location); let base_ty = self.sanitize_lvalue(&proj.base, location);
if let LvalueTy::Ty { ty } = base_ty { if let LvalueTy::Ty { ty } = base_ty {

View File

@ -286,7 +286,8 @@ impl<'l, 'tcx: 'l> SaveContext<'l, 'tcx> {
scope: NodeId) -> Option<VariableData> { scope: NodeId) -> Option<VariableData> {
if let Some(ident) = field.ident { if let Some(ident) = field.ident {
let qualname = format!("::{}::{}", self.tcx.node_path_str(scope), ident); let qualname = format!("::{}::{}", self.tcx.node_path_str(scope), ident);
let typ = self.tcx.tables().node_types.get(&field.id).unwrap().to_string(); let def_id = self.tcx.map.local_def_id(field.id);
let typ = self.tcx.item_type(def_id).to_string();
let sub_span = self.span_utils.sub_span_before_token(field.span, token::Colon); let sub_span = self.span_utils.sub_span_before_token(field.span, token::Colon);
filter!(self.span_utils, sub_span, field.span, None); filter!(self.span_utils, sub_span, field.span, None);
Some(VariableData { Some(VariableData {

View File

@ -231,7 +231,7 @@ impl<'a, 'tcx> Instance<'tcx> {
match key.disambiguated_data.data { match key.disambiguated_data.data {
DefPathData::TypeNs(_) | DefPathData::TypeNs(_) |
DefPathData::ValueNs(_) => { DefPathData::ValueNs(_) => {
instance_ty = scx.tcx().lookup_item_type(ty_def_id); instance_ty = scx.tcx().item_type(ty_def_id);
break; break;
} }
_ => { _ => {
@ -248,7 +248,7 @@ impl<'a, 'tcx> Instance<'tcx> {
// Erase regions because they may not be deterministic when hashed // Erase regions because they may not be deterministic when hashed
// and should not matter anyhow. // and should not matter anyhow.
let instance_ty = scx.tcx().erase_regions(&instance_ty.ty); let instance_ty = scx.tcx().erase_regions(&instance_ty);
let hash = get_symbol_hash(scx, &def_path, instance_ty, Some(substs)); let hash = get_symbol_hash(scx, &def_path, instance_ty, Some(substs));

View File

@ -1045,7 +1045,7 @@ pub fn trans_instance<'a, 'tcx>(ccx: &CrateContext<'a, 'tcx>, instance: Instance
debug!("trans_instance(instance={:?})", instance); debug!("trans_instance(instance={:?})", instance);
let _icx = push_ctxt("trans_instance"); let _icx = push_ctxt("trans_instance");
let fn_ty = ccx.tcx().lookup_item_type(instance.def).ty; let fn_ty = ccx.tcx().item_type(instance.def);
let fn_ty = ccx.tcx().erase_regions(&fn_ty); let fn_ty = ccx.tcx().erase_regions(&fn_ty);
let fn_ty = monomorphize::apply_param_substs(ccx.shared(), instance.substs, &fn_ty); let fn_ty = monomorphize::apply_param_substs(ccx.shared(), instance.substs, &fn_ty);
@ -1068,7 +1068,7 @@ pub fn trans_ctor_shim<'a, 'tcx>(ccx: &CrateContext<'a, 'tcx>,
attributes::inline(llfndecl, attributes::InlineAttr::Hint); attributes::inline(llfndecl, attributes::InlineAttr::Hint);
attributes::set_frame_pointer_elimination(ccx, llfndecl); attributes::set_frame_pointer_elimination(ccx, llfndecl);
let ctor_ty = ccx.tcx().lookup_item_type(def_id).ty; let ctor_ty = ccx.tcx().item_type(def_id);
let ctor_ty = monomorphize::apply_param_substs(ccx.shared(), substs, &ctor_ty); let ctor_ty = monomorphize::apply_param_substs(ccx.shared(), substs, &ctor_ty);
let sig = ccx.tcx().erase_late_bound_regions_and_normalize(&ctor_ty.fn_sig()); let sig = ccx.tcx().erase_late_bound_regions_and_normalize(&ctor_ty.fn_sig());
@ -1514,7 +1514,7 @@ pub fn filter_reachable_ids(tcx: TyCtxt, reachable: NodeSet) -> NodeSet {
hir_map::NodeImplItem(&hir::ImplItem { hir_map::NodeImplItem(&hir::ImplItem {
node: hir::ImplItemKind::Method(..), .. }) => { node: hir::ImplItemKind::Method(..), .. }) => {
let def_id = tcx.map.local_def_id(id); let def_id = tcx.map.local_def_id(id);
let generics = tcx.lookup_generics(def_id); let generics = tcx.item_generics(def_id);
let attributes = tcx.get_attrs(def_id); let attributes = tcx.get_attrs(def_id);
(generics.parent_types == 0 && generics.types.is_empty()) && (generics.parent_types == 0 && generics.types.is_empty()) &&
// Functions marked with #[inline] are only ever translated // Functions marked with #[inline] are only ever translated
@ -1719,7 +1719,7 @@ pub fn trans_crate<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
let applicable = match sess.cstore.describe_def(def_id) { let applicable = match sess.cstore.describe_def(def_id) {
Some(Def::Static(..)) => true, Some(Def::Static(..)) => true,
Some(Def::Fn(_)) => { Some(Def::Fn(_)) => {
shared_ccx.tcx().lookup_generics(def_id).types.is_empty() shared_ccx.tcx().item_generics(def_id).types.is_empty()
} }
_ => false _ => false
}; };

View File

@ -246,7 +246,7 @@ fn def_ty<'a, 'tcx>(shared: &SharedCrateContext<'a, 'tcx>,
def_id: DefId, def_id: DefId,
substs: &'tcx Substs<'tcx>) substs: &'tcx Substs<'tcx>)
-> Ty<'tcx> { -> Ty<'tcx> {
let ty = shared.tcx().lookup_item_type(def_id).ty; let ty = shared.tcx().item_type(def_id);
monomorphize::apply_param_substs(shared, substs, &ty) monomorphize::apply_param_substs(shared, substs, &ty)
} }
@ -400,7 +400,7 @@ fn get_fn<'a, 'tcx>(ccx: &CrateContext<'a, 'tcx>,
let substs = tcx.normalize_associated_type(&substs); let substs = tcx.normalize_associated_type(&substs);
let instance = Instance::new(def_id, substs); let instance = Instance::new(def_id, substs);
let item_ty = ccx.tcx().lookup_item_type(def_id).ty; let item_ty = ccx.tcx().item_type(def_id);
let fn_ty = monomorphize::apply_param_substs(ccx.shared(), substs, &item_ty); let fn_ty = monomorphize::apply_param_substs(ccx.shared(), substs, &item_ty);
if let Some(&llfn) = ccx.instances().borrow().get(&instance) { if let Some(&llfn) = ccx.instances().borrow().get(&instance) {

View File

@ -337,7 +337,7 @@ fn collect_items_rec<'a, 'tcx: 'a>(scx: &SharedCrateContext<'a, 'tcx>,
} }
TransItem::Static(node_id) => { TransItem::Static(node_id) => {
let def_id = scx.tcx().map.local_def_id(node_id); let def_id = scx.tcx().map.local_def_id(node_id);
let ty = scx.tcx().lookup_item_type(def_id).ty; let ty = scx.tcx().item_type(def_id);
let ty = glue::get_drop_glue_type(scx.tcx(), ty); let ty = glue::get_drop_glue_type(scx.tcx(), ty);
neighbors.push(TransItem::DropGlue(DropGlueKind::Ty(ty))); neighbors.push(TransItem::DropGlue(DropGlueKind::Ty(ty)));
@ -618,7 +618,7 @@ impl<'a, 'tcx> MirVisitor<'tcx> for MirNeighborCollector<'a, 'tcx> {
fn can_result_in_trans_item<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, fn can_result_in_trans_item<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
def_id: DefId) def_id: DefId)
-> bool { -> bool {
match tcx.lookup_item_type(def_id).ty.sty { match tcx.item_type(def_id).sty {
ty::TyFnDef(def_id, _, f) => { ty::TyFnDef(def_id, _, f) => {
// Some constructors also have type TyFnDef but they are // Some constructors also have type TyFnDef but they are
// always instantiated inline and don't result in // always instantiated inline and don't result in
@ -1077,13 +1077,12 @@ impl<'b, 'a, 'v> hir_visit::Visitor<'v> for RootCollector<'b, 'a, 'v> {
hir::ItemStruct(_, ref generics) | hir::ItemStruct(_, ref generics) |
hir::ItemUnion(_, ref generics) => { hir::ItemUnion(_, ref generics) => {
if !generics.is_parameterized() { if !generics.is_parameterized() {
let ty = self.scx.tcx().tables().node_types[&item.id];
if self.mode == TransItemCollectionMode::Eager { if self.mode == TransItemCollectionMode::Eager {
let def_id = self.scx.tcx().map.local_def_id(item.id);
debug!("RootCollector: ADT drop-glue for {}", debug!("RootCollector: ADT drop-glue for {}",
def_id_to_string(self.scx.tcx(), def_id_to_string(self.scx.tcx(), def_id));
self.scx.tcx().map.local_def_id(item.id)));
let ty = self.scx.tcx().item_type(def_id);
let ty = glue::get_drop_glue_type(self.scx.tcx(), ty); let ty = glue::get_drop_glue_type(self.scx.tcx(), ty);
self.output.push(TransItem::DropGlue(DropGlueKind::Ty(ty))); self.output.push(TransItem::DropGlue(DropGlueKind::Ty(ty)));
} }
@ -1182,7 +1181,7 @@ fn create_trans_items_for_default_impls<'a, 'tcx>(scx: &SharedCrateContext<'a, '
continue; continue;
} }
if !tcx.lookup_generics(method.def_id).types.is_empty() { if !tcx.item_generics(method.def_id).types.is_empty() {
continue; continue;
} }
@ -1201,7 +1200,7 @@ fn create_trans_items_for_default_impls<'a, 'tcx>(scx: &SharedCrateContext<'a, '
callee_substs, callee_substs,
&impl_data); &impl_data);
let predicates = tcx.lookup_predicates(def_id).predicates let predicates = tcx.item_predicates(def_id).predicates
.subst(tcx, substs); .subst(tcx, substs);
if !traits::normalize_and_test_predicates(tcx, predicates) { if !traits::normalize_and_test_predicates(tcx, predicates) {
continue; continue;

View File

@ -84,7 +84,7 @@ pub fn get_static(ccx: &CrateContext, def_id: DefId) -> ValueRef {
return g; return g;
} }
let ty = ccx.tcx().lookup_item_type(def_id).ty; let ty = ccx.tcx().item_type(def_id);
let g = if let Some(id) = ccx.tcx().map.as_local_node_id(def_id) { let g = if let Some(id) = ccx.tcx().map.as_local_node_id(def_id) {
let llty = type_of::type_of(ccx, ty); let llty = type_of::type_of(ccx, ty);
@ -226,7 +226,7 @@ pub fn trans_static(ccx: &CrateContext,
v v
}; };
let ty = ccx.tcx().lookup_item_type(def_id).ty; let ty = ccx.tcx().item_type(def_id);
let llty = type_of::type_of(ccx, ty); let llty = type_of::type_of(ccx, ty);
let g = if val_llty == llty { let g = if val_llty == llty {
g g

View File

@ -1765,7 +1765,7 @@ pub fn create_global_var_metadata(cx: &CrateContext,
}; };
let is_local_to_unit = is_node_local_to_unit(cx, node_id); let is_local_to_unit = is_node_local_to_unit(cx, node_id);
let variable_type = tcx.erase_regions(&tcx.tables().node_id_to_type(node_id)); let variable_type = tcx.erase_regions(&tcx.item_type(node_def_id));
let type_metadata = type_metadata(cx, variable_type, span); let type_metadata = type_metadata(cx, variable_type, span);
let var_name = tcx.item_name(node_def_id).to_string(); let var_name = tcx.item_name(node_def_id).to_string();
let linkage_name = mangled_name_of_item(cx, node_def_id, ""); let linkage_name = mangled_name_of_item(cx, node_def_id, "");

View File

@ -259,7 +259,7 @@ pub fn create_function_debug_context<'a, 'tcx>(cx: &CrateContext<'a, 'tcx>,
// Get_template_parameters() will append a `<...>` clause to the function // Get_template_parameters() will append a `<...>` clause to the function
// name if necessary. // name if necessary.
let generics = cx.tcx().lookup_generics(fn_def_id); let generics = cx.tcx().item_generics(fn_def_id);
let template_parameters = get_template_parameters(cx, let template_parameters = get_template_parameters(cx,
&generics, &generics,
instance.substs, instance.substs,
@ -397,7 +397,7 @@ pub fn create_function_debug_context<'a, 'tcx>(cx: &CrateContext<'a, 'tcx>,
generics: &ty::Generics<'tcx>) generics: &ty::Generics<'tcx>)
-> Vec<ast::Name> { -> Vec<ast::Name> {
let mut names = generics.parent.map_or(vec![], |def_id| { let mut names = generics.parent.map_or(vec![], |def_id| {
get_type_parameter_names(cx, cx.tcx().lookup_generics(def_id)) get_type_parameter_names(cx, cx.tcx().item_generics(def_id))
}); });
names.extend(generics.types.iter().map(|param| param.name)); names.extend(generics.types.iter().map(|param| param.name));
names names
@ -412,7 +412,7 @@ pub fn create_function_debug_context<'a, 'tcx>(cx: &CrateContext<'a, 'tcx>,
let self_type = cx.tcx().impl_of_method(instance.def).and_then(|impl_def_id| { let self_type = cx.tcx().impl_of_method(instance.def).and_then(|impl_def_id| {
// If the method does *not* belong to a trait, proceed // If the method does *not* belong to a trait, proceed
if cx.tcx().trait_id_of_impl(impl_def_id).is_none() { if cx.tcx().trait_id_of_impl(impl_def_id).is_none() {
let impl_self_ty = cx.tcx().lookup_item_type(impl_def_id).ty; let impl_self_ty = cx.tcx().item_type(impl_def_id);
let impl_self_ty = cx.tcx().erase_regions(&impl_self_ty); let impl_self_ty = cx.tcx().erase_regions(&impl_self_ty);
let impl_self_ty = monomorphize::apply_param_substs(cx.shared(), let impl_self_ty = monomorphize::apply_param_substs(cx.shared(),
instance.substs, instance.substs,

View File

@ -495,7 +495,7 @@ fn characteristic_def_id_of_trans_item<'a, 'tcx>(scx: &SharedCrateContext<'a, 't
if let Some(impl_def_id) = tcx.impl_of_method(instance.def) { if let Some(impl_def_id) = tcx.impl_of_method(instance.def) {
// This is a method within an inherent impl, find out what the // This is a method within an inherent impl, find out what the
// self-type is: // self-type is:
let impl_self_ty = tcx.lookup_item_type(impl_def_id).ty; let impl_self_ty = tcx.item_type(impl_def_id);
let impl_self_ty = tcx.erase_regions(&impl_self_ty); let impl_self_ty = tcx.erase_regions(&impl_self_ty);
let impl_self_ty = monomorphize::apply_param_substs(scx, let impl_self_ty = monomorphize::apply_param_substs(scx,
instance.substs, instance.substs,

View File

@ -131,7 +131,7 @@ impl<'a, 'tcx> TransItem<'tcx> {
linkage: llvm::Linkage, linkage: llvm::Linkage,
symbol_name: &str) { symbol_name: &str) {
let def_id = ccx.tcx().map.local_def_id(node_id); let def_id = ccx.tcx().map.local_def_id(node_id);
let ty = ccx.tcx().lookup_item_type(def_id).ty; let ty = ccx.tcx().item_type(def_id);
let llty = type_of::type_of(ccx, ty); let llty = type_of::type_of(ccx, ty);
let g = declare::define_global(ccx, symbol_name, llty).unwrap_or_else(|| { let g = declare::define_global(ccx, symbol_name, llty).unwrap_or_else(|| {
@ -153,7 +153,7 @@ impl<'a, 'tcx> TransItem<'tcx> {
assert!(!instance.substs.needs_infer() && assert!(!instance.substs.needs_infer() &&
!instance.substs.has_param_types()); !instance.substs.has_param_types());
let item_ty = ccx.tcx().lookup_item_type(instance.def).ty; let item_ty = ccx.tcx().item_type(instance.def);
let item_ty = ccx.tcx().erase_regions(&item_ty); let item_ty = ccx.tcx().erase_regions(&item_ty);
let mono_ty = monomorphize::apply_param_substs(ccx.shared(), instance.substs, &item_ty); let mono_ty = monomorphize::apply_param_substs(ccx.shared(), instance.substs, &item_ty);

View File

@ -16,12 +16,12 @@
//! somewhat differently during the collect and check phases, //! somewhat differently during the collect and check phases,
//! particularly with respect to looking up the types of top-level //! particularly with respect to looking up the types of top-level
//! items. In the collect phase, the crate context is used as the //! items. In the collect phase, the crate context is used as the
//! `AstConv` instance; in this phase, the `get_item_type_scheme()` //! `AstConv` instance; in this phase, the `get_item_type()`
//! function triggers a recursive call to `type_scheme_of_item()` //! function triggers a recursive call to `type_of_item()`
//! (note that `ast_ty_to_ty()` will detect recursive types and report //! (note that `ast_ty_to_ty()` will detect recursive types and report
//! an error). In the check phase, when the FnCtxt is used as the //! an error). In the check phase, when the FnCtxt is used as the
//! `AstConv`, `get_item_type_scheme()` just looks up the item type in //! `AstConv`, `get_item_type()` just looks up the item type in
//! `tcx.tcache` (using `ty::lookup_item_type`). //! `tcx.types` (using `TyCtxt::item_type`).
//! //!
//! The `RegionScope` trait controls what happens when the user does //! The `RegionScope` trait controls what happens when the user does
//! not specify a region in some location where a region is required //! not specify a region in some location where a region is required
@ -85,11 +85,8 @@ pub trait AstConv<'gcx, 'tcx> {
fn get_generics(&self, span: Span, id: DefId) fn get_generics(&self, span: Span, id: DefId)
-> Result<&'tcx ty::Generics<'tcx>, ErrorReported>; -> Result<&'tcx ty::Generics<'tcx>, ErrorReported>;
/// Identify the type scheme for an item with a type, like a type /// Identify the type for an item, like a type alias, fn, or struct.
/// alias, fn, or struct. This allows you to figure out the set of fn get_item_type(&self, span: Span, id: DefId) -> Result<Ty<'tcx>, ErrorReported>;
/// type parameters defined on the item.
fn get_item_type_scheme(&self, span: Span, id: DefId)
-> Result<ty::TypeScheme<'tcx>, ErrorReported>;
/// Returns the `TraitDef` for a given trait. This allows you to /// Returns the `TraitDef` for a given trait. This allows you to
/// figure out the set of type parameters defined on the trait. /// figure out the set of type parameters defined on the trait.
@ -938,8 +935,8 @@ impl<'o, 'gcx: 'tcx, 'tcx> AstConv<'gcx, 'tcx>+'o {
-> Ty<'tcx> -> Ty<'tcx>
{ {
let tcx = self.tcx(); let tcx = self.tcx();
let decl_ty = match self.get_item_type_scheme(span, did) { let decl_ty = match self.get_item_type(span, did) {
Ok(type_scheme) => type_scheme.ty, Ok(ty) => ty,
Err(ErrorReported) => { Err(ErrorReported) => {
return tcx.types.err; return tcx.types.err;
} }
@ -1521,8 +1518,7 @@ impl<'o, 'gcx: 'tcx, 'tcx> AstConv<'gcx, 'tcx>+'o {
// Self in impl (we know the concrete type). // Self in impl (we know the concrete type).
tcx.prohibit_type_params(base_segments); tcx.prohibit_type_params(base_segments);
let impl_id = tcx.map.as_local_node_id(def_id).unwrap(); let ty = tcx.item_type(def_id);
let ty = tcx.tables().node_id_to_type(impl_id);
if let Some(free_substs) = self.get_free_substs() { if let Some(free_substs) = self.get_free_substs() {
ty.subst(tcx, free_substs) ty.subst(tcx, free_substs)
} else { } else {

View File

@ -174,10 +174,10 @@ fn compare_predicate_entailment<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>,
debug!("compare_impl_method: trait_to_skol_substs={:?}", debug!("compare_impl_method: trait_to_skol_substs={:?}",
trait_to_skol_substs); trait_to_skol_substs);
let impl_m_generics = tcx.lookup_generics(impl_m.def_id); let impl_m_generics = tcx.item_generics(impl_m.def_id);
let trait_m_generics = tcx.lookup_generics(trait_m.def_id); let trait_m_generics = tcx.item_generics(trait_m.def_id);
let impl_m_predicates = tcx.lookup_predicates(impl_m.def_id); let impl_m_predicates = tcx.item_predicates(impl_m.def_id);
let trait_m_predicates = tcx.lookup_predicates(trait_m.def_id); let trait_m_predicates = tcx.item_predicates(trait_m.def_id);
// Check region bounds. // Check region bounds.
check_region_bounds_on_impl_method(ccx, check_region_bounds_on_impl_method(ccx,
@ -193,7 +193,7 @@ fn compare_predicate_entailment<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>,
// environment. We can't just use `impl_env.caller_bounds`, // environment. We can't just use `impl_env.caller_bounds`,
// however, because we want to replace all late-bound regions with // however, because we want to replace all late-bound regions with
// region variables. // region variables.
let impl_predicates = tcx.lookup_predicates(impl_m_predicates.parent.unwrap()); let impl_predicates = tcx.item_predicates(impl_m_predicates.parent.unwrap());
let mut hybrid_preds = impl_predicates.instantiate(tcx, impl_to_skol_substs); let mut hybrid_preds = impl_predicates.instantiate(tcx, impl_to_skol_substs);
debug!("compare_impl_method: impl_bounds={:?}", hybrid_preds); debug!("compare_impl_method: impl_bounds={:?}", hybrid_preds);
@ -269,7 +269,7 @@ fn compare_predicate_entailment<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>,
let origin = TypeOrigin::MethodCompatCheck(impl_m_span); let origin = TypeOrigin::MethodCompatCheck(impl_m_span);
let m_fty = |method: &ty::AssociatedItem| { let m_fty = |method: &ty::AssociatedItem| {
match tcx.lookup_item_type(method.def_id).ty.sty { match tcx.item_type(method.def_id).sty {
ty::TyFnDef(_, _, f) => f, ty::TyFnDef(_, _, f) => f,
_ => bug!() _ => bug!()
} }
@ -542,7 +542,7 @@ fn compare_self_type<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>,
ty::ImplContainer(_) => impl_trait_ref.self_ty(), ty::ImplContainer(_) => impl_trait_ref.self_ty(),
ty::TraitContainer(_) => tcx.mk_self_type() ty::TraitContainer(_) => tcx.mk_self_type()
}; };
let method_ty = tcx.lookup_item_type(method.def_id).ty; let method_ty = tcx.item_type(method.def_id);
let self_arg_ty = *method_ty.fn_sig().input(0).skip_binder(); let self_arg_ty = *method_ty.fn_sig().input(0).skip_binder();
match ExplicitSelf::determine(untransformed_self_ty, self_arg_ty) { match ExplicitSelf::determine(untransformed_self_ty, self_arg_ty) {
ExplicitSelf::ByValue => "self".to_string(), ExplicitSelf::ByValue => "self".to_string(),
@ -601,8 +601,8 @@ fn compare_number_of_generics<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>,
trait_item_span: Option<Span>) trait_item_span: Option<Span>)
-> Result<(), ErrorReported> { -> Result<(), ErrorReported> {
let tcx = ccx.tcx; let tcx = ccx.tcx;
let impl_m_generics = tcx.lookup_generics(impl_m.def_id); let impl_m_generics = tcx.item_generics(impl_m.def_id);
let trait_m_generics = tcx.lookup_generics(trait_m.def_id); let trait_m_generics = tcx.item_generics(trait_m.def_id);
let num_impl_m_type_params = impl_m_generics.types.len(); let num_impl_m_type_params = impl_m_generics.types.len();
let num_trait_m_type_params = trait_m_generics.types.len(); let num_trait_m_type_params = trait_m_generics.types.len();
if num_impl_m_type_params != num_trait_m_type_params { if num_impl_m_type_params != num_trait_m_type_params {
@ -672,7 +672,7 @@ fn compare_number_of_method_arguments<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>,
-> Result<(), ErrorReported> { -> Result<(), ErrorReported> {
let tcx = ccx.tcx; let tcx = ccx.tcx;
let m_fty = |method: &ty::AssociatedItem| { let m_fty = |method: &ty::AssociatedItem| {
match tcx.lookup_item_type(method.def_id).ty.sty { match tcx.item_type(method.def_id).sty {
ty::TyFnDef(_, _, f) => f, ty::TyFnDef(_, _, f) => f,
_ => bug!() _ => bug!()
} }
@ -785,8 +785,8 @@ pub fn compare_const_impl<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>,
trait_to_skol_substs); trait_to_skol_substs);
// Compute skolemized form of impl and trait const tys. // Compute skolemized form of impl and trait const tys.
let impl_ty = tcx.lookup_item_type(impl_c.def_id).ty.subst(tcx, impl_to_skol_substs); let impl_ty = tcx.item_type(impl_c.def_id).subst(tcx, impl_to_skol_substs);
let trait_ty = tcx.lookup_item_type(trait_c.def_id).ty.subst(tcx, trait_to_skol_substs); let trait_ty = tcx.item_type(trait_c.def_id).subst(tcx, trait_to_skol_substs);
let mut origin = TypeOrigin::Misc(impl_c_span); let mut origin = TypeOrigin::Misc(impl_c_span);
let err = infcx.commit_if_ok(|_| { let err = infcx.commit_if_ok(|_| {

View File

@ -41,8 +41,8 @@ use syntax_pos::{self, Span};
/// cannot do `struct S<T>; impl<T:Clone> Drop for S<T> { ... }`). /// cannot do `struct S<T>; impl<T:Clone> Drop for S<T> { ... }`).
/// ///
pub fn check_drop_impl(ccx: &CrateCtxt, drop_impl_did: DefId) -> Result<(), ()> { pub fn check_drop_impl(ccx: &CrateCtxt, drop_impl_did: DefId) -> Result<(), ()> {
let dtor_self_type = ccx.tcx.lookup_item_type(drop_impl_did).ty; let dtor_self_type = ccx.tcx.item_type(drop_impl_did);
let dtor_predicates = ccx.tcx.lookup_predicates(drop_impl_did); let dtor_predicates = ccx.tcx.item_predicates(drop_impl_did);
match dtor_self_type.sty { match dtor_self_type.sty {
ty::TyAdt(adt_def, self_to_impl_substs) => { ty::TyAdt(adt_def, self_to_impl_substs) => {
ensure_drop_params_and_item_params_correspond(ccx, ensure_drop_params_and_item_params_correspond(ccx,
@ -85,7 +85,7 @@ fn ensure_drop_params_and_item_params_correspond<'a, 'tcx>(
let tcx = infcx.tcx; let tcx = infcx.tcx;
let mut fulfillment_cx = traits::FulfillmentContext::new(); let mut fulfillment_cx = traits::FulfillmentContext::new();
let named_type = tcx.lookup_item_type(self_type_did).ty; let named_type = tcx.item_type(self_type_did);
let named_type = named_type.subst(tcx, &infcx.parameter_environment.free_substs); let named_type = named_type.subst(tcx, &infcx.parameter_environment.free_substs);
let drop_impl_span = tcx.map.def_id_span(drop_impl_did, syntax_pos::DUMMY_SP); let drop_impl_span = tcx.map.def_id_span(drop_impl_did, syntax_pos::DUMMY_SP);
@ -177,7 +177,7 @@ fn ensure_drop_predicates_are_implied_by_item_defn<'a, 'tcx>(
// We can assume the predicates attached to struct/enum definition // We can assume the predicates attached to struct/enum definition
// hold. // hold.
let generic_assumptions = tcx.lookup_predicates(self_type_did); let generic_assumptions = tcx.item_predicates(self_type_did);
let assumptions_in_impl_context = generic_assumptions.instantiate(tcx, &self_to_impl_substs); let assumptions_in_impl_context = generic_assumptions.instantiate(tcx, &self_to_impl_substs);
let assumptions_in_impl_context = assumptions_in_impl_context.predicates; let assumptions_in_impl_context = assumptions_in_impl_context.predicates;
@ -570,30 +570,30 @@ fn has_dtor_of_interest<'a, 'gcx, 'tcx>(tcx: TyCtxt<'a, 'gcx, 'tcx>,
// Constructs new Ty just like the type defined by `adt_def` coupled // Constructs new Ty just like the type defined by `adt_def` coupled
// with `substs`, except each type and lifetime parameter marked as // with `substs`, except each type and lifetime parameter marked as
// `#[may_dangle]` in the Drop impl (identified by `impl_id`) is // `#[may_dangle]` in the Drop impl (identified by `impl_def_id`) is
// respectively mapped to `()` or `'static`. // respectively mapped to `()` or `'static`.
// //
// For example: If the `adt_def` maps to: // For example: If the `adt_def` maps to:
// //
// enum Foo<'a, X, Y> { ... } // enum Foo<'a, X, Y> { ... }
// //
// and the `impl_id` maps to: // and the `impl_def_id` maps to:
// //
// impl<#[may_dangle] 'a, X, #[may_dangle] Y> Drop for Foo<'a, X, Y> { ... } // impl<#[may_dangle] 'a, X, #[may_dangle] Y> Drop for Foo<'a, X, Y> { ... }
// //
// then revises input: `Foo<'r,i64,&'r i64>` to: `Foo<'static,i64,()>` // then revises input: `Foo<'r,i64,&'r i64>` to: `Foo<'static,i64,()>`
fn revise_self_ty<'a, 'gcx, 'tcx>(tcx: TyCtxt<'a, 'gcx, 'tcx>, fn revise_self_ty<'a, 'gcx, 'tcx>(tcx: TyCtxt<'a, 'gcx, 'tcx>,
adt_def: ty::AdtDef<'tcx>, adt_def: ty::AdtDef<'tcx>,
impl_id: DefId, impl_def_id: DefId,
substs: &Substs<'tcx>) substs: &Substs<'tcx>)
-> Ty<'tcx> { -> Ty<'tcx> {
// Get generics for `impl Drop` to query for `#[may_dangle]` attr. // Get generics for `impl Drop` to query for `#[may_dangle]` attr.
let impl_bindings = tcx.lookup_generics(impl_id); let impl_bindings = tcx.item_generics(impl_def_id);
// Get Substs attached to Self on `impl Drop`; process in parallel // Get Substs attached to Self on `impl Drop`; process in parallel
// with `substs`, replacing dangling entries as appropriate. // with `substs`, replacing dangling entries as appropriate.
let self_substs = { let self_substs = {
let impl_self_ty: Ty<'tcx> = tcx.lookup_item_type(impl_id).ty; let impl_self_ty: Ty<'tcx> = tcx.item_type(impl_def_id);
if let ty::TyAdt(self_adt_def, self_substs) = impl_self_ty.sty { if let ty::TyAdt(self_adt_def, self_substs) = impl_self_ty.sty {
assert_eq!(adt_def, self_adt_def); assert_eq!(adt_def, self_adt_def);
self_substs self_substs
@ -648,5 +648,5 @@ fn revise_self_ty<'a, 'gcx, 'tcx>(tcx: TyCtxt<'a, 'gcx, 'tcx>,
t t
}); });
return tcx.mk_adt(adt_def, &substs); tcx.mk_adt(adt_def, &substs)
} }

View File

@ -34,7 +34,6 @@ fn equate_intrinsic_type<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>,
output: Ty<'tcx>) { output: Ty<'tcx>) {
let tcx = ccx.tcx; let tcx = ccx.tcx;
let def_id = tcx.map.local_def_id(it.id); let def_id = tcx.map.local_def_id(it.id);
let i_ty = tcx.lookup_item_type(def_id);
let substs = Substs::for_item(tcx, def_id, let substs = Substs::for_item(tcx, def_id,
|_, _| tcx.mk_region(ty::ReErased), |_, _| tcx.mk_region(ty::ReErased),
@ -49,7 +48,7 @@ fn equate_intrinsic_type<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>,
variadic: false, variadic: false,
}), }),
})); }));
let i_n_tps = i_ty.generics.types.len(); let i_n_tps = tcx.item_generics(def_id).types.len();
if i_n_tps != n_tps { if i_n_tps != n_tps {
let span = match it.node { let span = match it.node {
hir::ForeignItemFn(_, ref generics) => generics.span, hir::ForeignItemFn(_, ref generics) => generics.span,
@ -65,7 +64,7 @@ fn equate_intrinsic_type<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>,
} else { } else {
require_same_types(ccx, require_same_types(ccx,
TypeOrigin::IntrinsicType(it.span), TypeOrigin::IntrinsicType(it.span),
i_ty.ty, tcx.item_type(def_id),
fty); fty);
} }
} }
@ -330,8 +329,8 @@ pub fn check_platform_intrinsic_type(ccx: &CrateCtxt,
}; };
let tcx = ccx.tcx; let tcx = ccx.tcx;
let i_ty = tcx.lookup_item_type(tcx.map.local_def_id(it.id)); let def_id = tcx.map.local_def_id(it.id);
let i_n_tps = i_ty.generics.types.len(); let i_n_tps = tcx.item_generics(def_id).types.len();
let name = it.name.as_str(); let name = it.name.as_str();
let (n_tps, inputs, output) = match &*name { let (n_tps, inputs, output) = match &*name {
@ -374,7 +373,8 @@ pub fn check_platform_intrinsic_type(ccx: &CrateCtxt,
let mut structural_to_nomimal = FxHashMap(); let mut structural_to_nomimal = FxHashMap();
let sig = tcx.no_late_bound_regions(i_ty.ty.fn_sig()).unwrap(); let sig = tcx.item_type(def_id).fn_sig();
let sig = tcx.no_late_bound_regions(sig).unwrap();
if intr.inputs.len() != sig.inputs.len() { if intr.inputs.len() != sig.inputs.len() {
span_err!(tcx.sess, it.span, E0444, span_err!(tcx.sess, it.span, E0444,
"platform-specific intrinsic has invalid number of \ "platform-specific intrinsic has invalid number of \

View File

@ -276,7 +276,7 @@ impl<'a, 'gcx, 'tcx> ConfirmContext<'a, 'gcx, 'tcx> {
// If they were not explicitly supplied, just construct fresh // If they were not explicitly supplied, just construct fresh
// variables. // variables.
let num_supplied_types = supplied_method_types.len(); let num_supplied_types = supplied_method_types.len();
let method_generics = self.tcx.lookup_generics(pick.item.def_id); let method_generics = self.tcx.item_generics(pick.item.def_id);
let num_method_types = method_generics.types.len(); let num_method_types = method_generics.types.len();
if num_supplied_types > 0 && num_supplied_types != num_method_types { if num_supplied_types > 0 && num_supplied_types != num_method_types {
@ -359,14 +359,14 @@ impl<'a, 'gcx, 'tcx> ConfirmContext<'a, 'gcx, 'tcx> {
// type/early-bound-regions substitutions performed. There can // type/early-bound-regions substitutions performed. There can
// be no late-bound regions appearing here. // be no late-bound regions appearing here.
let def_id = pick.item.def_id; let def_id = pick.item.def_id;
let method_predicates = self.tcx.lookup_predicates(def_id) let method_predicates = self.tcx.item_predicates(def_id)
.instantiate(self.tcx, all_substs); .instantiate(self.tcx, all_substs);
let method_predicates = self.normalize_associated_types_in(self.span, let method_predicates = self.normalize_associated_types_in(self.span,
&method_predicates); &method_predicates);
debug!("method_predicates after subst = {:?}", method_predicates); debug!("method_predicates after subst = {:?}", method_predicates);
let fty = match self.tcx.lookup_item_type(def_id).ty.sty { let fty = match self.tcx.item_type(def_id).sty {
ty::TyFnDef(_, _, f) => f, ty::TyFnDef(_, _, f) => f,
_ => bug!() _ => bug!()
}; };

View File

@ -230,7 +230,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
let tcx = self.tcx; let tcx = self.tcx;
let method_item = self.associated_item(trait_def_id, m_name).unwrap(); let method_item = self.associated_item(trait_def_id, m_name).unwrap();
let def_id = method_item.def_id; let def_id = method_item.def_id;
let generics = tcx.lookup_generics(def_id); let generics = tcx.item_generics(def_id);
assert_eq!(generics.types.len(), 0); assert_eq!(generics.types.len(), 0);
assert_eq!(generics.regions.len(), 0); assert_eq!(generics.regions.len(), 0);
@ -242,7 +242,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
// NB: Instantiate late-bound regions first so that // NB: Instantiate late-bound regions first so that
// `instantiate_type_scheme` can normalize associated types that // `instantiate_type_scheme` can normalize associated types that
// may reference those regions. // may reference those regions.
let original_method_ty = tcx.lookup_item_type(def_id).ty; let original_method_ty = tcx.item_type(def_id);
let fty = match original_method_ty.sty { let fty = match original_method_ty.sty {
ty::TyFnDef(_, _, f) => f, ty::TyFnDef(_, _, f) => f,
_ => bug!() _ => bug!()

View File

@ -672,9 +672,9 @@ impl<'a, 'gcx, 'tcx> ProbeContext<'a, 'gcx, 'tcx> {
} }
}; };
let impl_type = self.tcx.lookup_item_type(impl_def_id); let impl_type = self.tcx.item_type(impl_def_id);
let impl_simplified_type = let impl_simplified_type =
match ty::fast_reject::simplify_type(self.tcx, impl_type.ty, false) { match ty::fast_reject::simplify_type(self.tcx, impl_type, false) {
Some(simplified_type) => simplified_type, Some(simplified_type) => simplified_type,
None => { None => {
return true; return true;
@ -771,7 +771,7 @@ impl<'a, 'gcx, 'tcx> ProbeContext<'a, 'gcx, 'tcx> {
def_id, def_id,
substs); substs);
let trait_predicates = self.tcx.lookup_predicates(def_id); let trait_predicates = self.tcx.item_predicates(def_id);
let bounds = trait_predicates.instantiate(self.tcx, substs); let bounds = trait_predicates.instantiate(self.tcx, substs);
let predicates = bounds.predicates; let predicates = bounds.predicates;
debug!("assemble_projection_candidates: predicates={:?}", debug!("assemble_projection_candidates: predicates={:?}",
@ -1070,7 +1070,7 @@ impl<'a, 'gcx, 'tcx> ProbeContext<'a, 'gcx, 'tcx> {
let cause = traits::ObligationCause::misc(self.span, self.body_id); let cause = traits::ObligationCause::misc(self.span, self.body_id);
// Check whether the impl imposes obligations we have to worry about. // Check whether the impl imposes obligations we have to worry about.
let impl_bounds = self.tcx.lookup_predicates(impl_def_id); let impl_bounds = self.tcx.item_predicates(impl_def_id);
let impl_bounds = impl_bounds.instantiate(self.tcx, substs); let impl_bounds = impl_bounds.instantiate(self.tcx, substs);
let traits::Normalized { value: impl_bounds, obligations: norm_obligations } = let traits::Normalized { value: impl_bounds, obligations: norm_obligations } =
traits::normalize(selcx, cause.clone(), &impl_bounds); traits::normalize(selcx, cause.clone(), &impl_bounds);
@ -1171,7 +1171,7 @@ impl<'a, 'gcx, 'tcx> ProbeContext<'a, 'gcx, 'tcx> {
impl_ty: Ty<'tcx>, impl_ty: Ty<'tcx>,
substs: &Substs<'tcx>) substs: &Substs<'tcx>)
-> Ty<'tcx> { -> Ty<'tcx> {
let self_ty = self.tcx.lookup_item_type(method).ty.fn_sig().input(0); let self_ty = self.tcx.item_type(method).fn_sig().input(0);
debug!("xform_self_ty(impl_ty={:?}, self_ty={:?}, substs={:?})", debug!("xform_self_ty(impl_ty={:?}, self_ty={:?}, substs={:?})",
impl_ty, impl_ty,
self_ty, self_ty,
@ -1184,7 +1184,7 @@ impl<'a, 'gcx, 'tcx> ProbeContext<'a, 'gcx, 'tcx> {
// are given do not include type/lifetime parameters for the // are given do not include type/lifetime parameters for the
// method yet. So create fresh variables here for those too, // method yet. So create fresh variables here for those too,
// if there are any. // if there are any.
let generics = self.tcx.lookup_generics(method); let generics = self.tcx.item_generics(method);
assert_eq!(substs.types().count(), generics.parent_types as usize); assert_eq!(substs.types().count(), generics.parent_types as usize);
assert_eq!(substs.regions().count(), generics.parent_regions as usize); assert_eq!(substs.regions().count(), generics.parent_regions as usize);
@ -1218,7 +1218,7 @@ impl<'a, 'gcx, 'tcx> ProbeContext<'a, 'gcx, 'tcx> {
/// Get the type of an impl and generate substitutions with placeholders. /// Get the type of an impl and generate substitutions with placeholders.
fn impl_ty_and_substs(&self, impl_def_id: DefId) -> (Ty<'tcx>, &'tcx Substs<'tcx>) { fn impl_ty_and_substs(&self, impl_def_id: DefId) -> (Ty<'tcx>, &'tcx Substs<'tcx>) {
let impl_ty = self.tcx.lookup_item_type(impl_def_id).ty; let impl_ty = self.tcx.item_type(impl_def_id);
let substs = Substs::for_item(self.tcx, let substs = Substs::for_item(self.tcx,
impl_def_id, impl_def_id,

View File

@ -598,7 +598,7 @@ fn check_bare_fn<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>,
body: &'tcx hir::Expr, body: &'tcx hir::Expr,
fn_id: ast::NodeId, fn_id: ast::NodeId,
span: Span) { span: Span) {
let raw_fty = ccx.tcx.lookup_item_type(ccx.tcx.map.local_def_id(fn_id)).ty; let raw_fty = ccx.tcx.item_type(ccx.tcx.map.local_def_id(fn_id));
let fn_ty = match raw_fty.sty { let fn_ty = match raw_fty.sty {
ty::TyFnDef(.., f) => f, ty::TyFnDef(.., f) => f,
_ => span_bug!(body.span, "check_bare_fn: function type expected") _ => span_bug!(body.span, "check_bare_fn: function type expected")
@ -781,15 +781,16 @@ fn check_fn<'a, 'gcx, 'tcx>(inherited: &'a Inherited<'a, 'gcx, 'tcx>,
} }
fn check_struct(ccx: &CrateCtxt, id: ast::NodeId, span: Span) { fn check_struct(ccx: &CrateCtxt, id: ast::NodeId, span: Span) {
check_representable(ccx.tcx, span, id); let def_id = ccx.tcx.map.local_def_id(id);
check_representable(ccx.tcx, span, def_id);
if ccx.tcx.lookup_simd(ccx.tcx.map.local_def_id(id)) { if ccx.tcx.lookup_simd(def_id) {
check_simd(ccx.tcx, span, id); check_simd(ccx.tcx, span, def_id);
} }
} }
fn check_union(ccx: &CrateCtxt, id: ast::NodeId, span: Span) { fn check_union(ccx: &CrateCtxt, id: ast::NodeId, span: Span) {
check_representable(ccx.tcx, span, id); check_representable(ccx.tcx, span, ccx.tcx.map.local_def_id(id));
} }
pub fn check_item_type<'a,'tcx>(ccx: &CrateCtxt<'a,'tcx>, it: &'tcx hir::Item) { pub fn check_item_type<'a,'tcx>(ccx: &CrateCtxt<'a,'tcx>, it: &'tcx hir::Item) {
@ -832,7 +833,8 @@ pub fn check_item_type<'a,'tcx>(ccx: &CrateCtxt<'a,'tcx>, it: &'tcx hir::Item) {
check_union(ccx, it.id, it.span); check_union(ccx, it.id, it.span);
} }
hir::ItemTy(_, ref generics) => { hir::ItemTy(_, ref generics) => {
let pty_ty = ccx.tcx.tables().node_id_to_type(it.id); let def_id = ccx.tcx.map.local_def_id(it.id);
let pty_ty = ccx.tcx.item_type(def_id);
check_bounds_are_used(ccx, generics, pty_ty); check_bounds_are_used(ccx, generics, pty_ty);
} }
hir::ItemForeignMod(ref m) => { hir::ItemForeignMod(ref m) => {
@ -848,8 +850,8 @@ pub fn check_item_type<'a,'tcx>(ccx: &CrateCtxt<'a,'tcx>, it: &'tcx hir::Item) {
} }
} else { } else {
for item in &m.items { for item in &m.items {
let pty = ccx.tcx.lookup_item_type(ccx.tcx.map.local_def_id(item.id)); let generics = ccx.tcx.item_generics(ccx.tcx.map.local_def_id(item.id));
if !pty.generics.types.is_empty() { if !generics.types.is_empty() {
let mut err = struct_span_err!(ccx.tcx.sess, item.span, E0044, let mut err = struct_span_err!(ccx.tcx.sess, item.span, E0044,
"foreign items may not have type parameters"); "foreign items may not have type parameters");
span_help!(&mut err, item.span, span_help!(&mut err, item.span,
@ -918,7 +920,7 @@ pub fn check_item_body<'a,'tcx>(ccx: &CrateCtxt<'a,'tcx>, it: &'tcx hir::Item) {
fn check_on_unimplemented<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>, fn check_on_unimplemented<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>,
def_id: DefId, def_id: DefId,
item: &hir::Item) { item: &hir::Item) {
let generics = ccx.tcx.lookup_generics(def_id); let generics = ccx.tcx.item_generics(def_id);
if let Some(ref attr) = item.attrs.iter().find(|a| { if let Some(ref attr) = item.attrs.iter().find(|a| {
a.check_name("rustc_on_unimplemented") a.check_name("rustc_on_unimplemented")
}) { }) {
@ -1144,12 +1146,11 @@ fn check_impl_items_against_trait<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>,
let signature = |item: &ty::AssociatedItem| { let signature = |item: &ty::AssociatedItem| {
match item.kind { match item.kind {
ty::AssociatedKind::Method => { ty::AssociatedKind::Method => {
format!("{}", tcx.lookup_item_type(item.def_id).ty.fn_sig().0) format!("{}", tcx.item_type(item.def_id).fn_sig().0)
} }
ty::AssociatedKind::Type => format!("type {};", item.name.to_string()), ty::AssociatedKind::Type => format!("type {};", item.name.to_string()),
ty::AssociatedKind::Const => { ty::AssociatedKind::Const => {
format!("const {}: {:?};", item.name.to_string(), format!("const {}: {:?};", item.name.to_string(), tcx.item_type(item.def_id))
tcx.lookup_item_type(item.def_id).ty)
} }
} }
}; };
@ -1219,7 +1220,7 @@ fn check_const_with_type<'a, 'tcx>(ccx: &'a CrateCtxt<'a, 'tcx>,
fn check_const<'a, 'tcx>(ccx: &CrateCtxt<'a,'tcx>, fn check_const<'a, 'tcx>(ccx: &CrateCtxt<'a,'tcx>,
expr: &'tcx hir::Expr, expr: &'tcx hir::Expr,
id: ast::NodeId) { id: ast::NodeId) {
let decl_ty = ccx.tcx.lookup_item_type(ccx.tcx.map.local_def_id(id)).ty; let decl_ty = ccx.tcx.item_type(ccx.tcx.map.local_def_id(id));
check_const_with_type(ccx, expr, decl_ty, id); check_const_with_type(ccx, expr, decl_ty, id);
} }
@ -1228,9 +1229,9 @@ fn check_const<'a, 'tcx>(ccx: &CrateCtxt<'a,'tcx>,
/// pointer, which would mean their size is unbounded. /// pointer, which would mean their size is unbounded.
fn check_representable<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, fn check_representable<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
sp: Span, sp: Span,
item_id: ast::NodeId) item_def_id: DefId)
-> bool { -> bool {
let rty = tcx.tables().node_id_to_type(item_id); let rty = tcx.item_type(item_def_id);
// Check that it is possible to represent this type. This call identifies // Check that it is possible to represent this type. This call identifies
// (1) types that contain themselves and (2) types that contain a different // (1) types that contain themselves and (2) types that contain a different
@ -1239,7 +1240,6 @@ fn check_representable<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
// caught by case 1. // caught by case 1.
match rty.is_representable(tcx, sp) { match rty.is_representable(tcx, sp) {
Representability::SelfRecursive => { Representability::SelfRecursive => {
let item_def_id = tcx.map.local_def_id(item_id);
tcx.recursive_type_with_infinite_size_error(item_def_id).emit(); tcx.recursive_type_with_infinite_size_error(item_def_id).emit();
return false return false
} }
@ -1248,8 +1248,8 @@ fn check_representable<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
return true return true
} }
pub fn check_simd<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, sp: Span, id: ast::NodeId) { pub fn check_simd<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, sp: Span, def_id: DefId) {
let t = tcx.tables().node_id_to_type(id); let t = tcx.item_type(def_id);
match t.sty { match t.sty {
ty::TyAdt(def, substs) if def.is_struct() => { ty::TyAdt(def, substs) if def.is_struct() => {
let fields = &def.struct_variant().fields; let fields = &def.struct_variant().fields;
@ -1329,7 +1329,7 @@ pub fn check_enum_variants<'a,'tcx>(ccx: &CrateCtxt<'a,'tcx>,
disr_vals.push(current_disr_val); disr_vals.push(current_disr_val);
} }
check_representable(ccx.tcx, sp, id); check_representable(ccx.tcx, sp, def_id);
} }
impl<'a, 'gcx, 'tcx> AstConv<'gcx, 'tcx> for FnCtxt<'a, 'gcx, 'tcx> { impl<'a, 'gcx, 'tcx> AstConv<'gcx, 'tcx> for FnCtxt<'a, 'gcx, 'tcx> {
@ -1342,13 +1342,12 @@ impl<'a, 'gcx, 'tcx> AstConv<'gcx, 'tcx> for FnCtxt<'a, 'gcx, 'tcx> {
fn get_generics(&self, _: Span, id: DefId) fn get_generics(&self, _: Span, id: DefId)
-> Result<&'tcx ty::Generics<'tcx>, ErrorReported> -> Result<&'tcx ty::Generics<'tcx>, ErrorReported>
{ {
Ok(self.tcx().lookup_generics(id)) Ok(self.tcx().item_generics(id))
} }
fn get_item_type_scheme(&self, _: Span, id: DefId) fn get_item_type(&self, _: Span, id: DefId) -> Result<Ty<'tcx>, ErrorReported>
-> Result<ty::TypeScheme<'tcx>, ErrorReported>
{ {
Ok(self.tcx().lookup_item_type(id)) Ok(self.tcx().item_type(id))
} }
fn get_trait_def(&self, _: Span, id: DefId) fn get_trait_def(&self, _: Span, id: DefId)
@ -1663,7 +1662,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
/// generic type scheme. /// generic type scheme.
fn instantiate_bounds(&self, span: Span, def_id: DefId, substs: &Substs<'tcx>) fn instantiate_bounds(&self, span: Span, def_id: DefId, substs: &Substs<'tcx>)
-> ty::InstantiatedPredicates<'tcx> { -> ty::InstantiatedPredicates<'tcx> {
let bounds = self.tcx.lookup_predicates(def_id); let bounds = self.tcx.item_predicates(def_id);
let result = bounds.instantiate(self.tcx, substs); let result = bounds.instantiate(self.tcx, substs);
let result = self.normalize_associated_types_in(span, &result.predicates); let result = self.normalize_associated_types_in(span, &result.predicates);
debug!("instantiate_bounds(bounds={:?}, substs={:?}) = {:?}", debug!("instantiate_bounds(bounds={:?}, substs={:?}) = {:?}",
@ -1688,7 +1687,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
let ty_var = self.next_ty_var(); let ty_var = self.next_ty_var();
self.anon_types.borrow_mut().insert(def_id, ty_var); self.anon_types.borrow_mut().insert(def_id, ty_var);
let item_predicates = self.tcx.lookup_predicates(def_id); let item_predicates = self.tcx.item_predicates(def_id);
let bounds = item_predicates.instantiate(self.tcx, substs); let bounds = item_predicates.instantiate(self.tcx, substs);
let span = self.tcx.map.def_id_span(def_id, codemap::DUMMY_SP); let span = self.tcx.map.def_id_span(def_id, codemap::DUMMY_SP);
@ -2743,11 +2742,11 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
span: Span, // (potential) receiver for this impl span: Span, // (potential) receiver for this impl
did: DefId) did: DefId)
-> TypeAndSubsts<'tcx> { -> TypeAndSubsts<'tcx> {
let ity = self.tcx.lookup_item_type(did); let ity = self.tcx.item_type(did);
debug!("impl_self_ty: ity={:?}", ity); debug!("impl_self_ty: ity={:?}", ity);
let substs = self.fresh_substs_for_item(span, did); let substs = self.fresh_substs_for_item(span, did);
let substd_ty = self.instantiate_type_scheme(span, &substs, &ity.ty); let substd_ty = self.instantiate_type_scheme(span, &substs, &ity);
TypeAndSubsts { substs: substs, ty: substd_ty } TypeAndSubsts { substs: substs, ty: substd_ty }
} }
@ -4185,11 +4184,11 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
Def::VariantCtor(def_id, ..) => { Def::VariantCtor(def_id, ..) => {
// Everything but the final segment should have no // Everything but the final segment should have no
// parameters at all. // parameters at all.
let mut generics = self.tcx.lookup_generics(def_id); let mut generics = self.tcx.item_generics(def_id);
if let Some(def_id) = generics.parent { if let Some(def_id) = generics.parent {
// Variant and struct constructors use the // Variant and struct constructors use the
// generics of their parent type definition. // generics of their parent type definition.
generics = self.tcx.lookup_generics(def_id); generics = self.tcx.item_generics(def_id);
} }
type_segment = Some((segments.last().unwrap(), generics)); type_segment = Some((segments.last().unwrap(), generics));
} }
@ -4199,7 +4198,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
Def::Const(def_id) | Def::Const(def_id) |
Def::Static(def_id, _) => { Def::Static(def_id, _) => {
fn_segment = Some((segments.last().unwrap(), fn_segment = Some((segments.last().unwrap(),
self.tcx.lookup_generics(def_id))); self.tcx.item_generics(def_id)));
} }
// Case 3. Reference to a method or associated const. // Case 3. Reference to a method or associated const.
@ -4213,9 +4212,9 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
ty::ImplContainer(_) => {} ty::ImplContainer(_) => {}
} }
let generics = self.tcx.lookup_generics(def_id); let generics = self.tcx.item_generics(def_id);
if segments.len() >= 2 { if segments.len() >= 2 {
let parent_generics = self.tcx.lookup_generics(generics.parent.unwrap()); let parent_generics = self.tcx.item_generics(generics.parent.unwrap());
type_segment = Some((&segments[segments.len() - 2], parent_generics)); type_segment = Some((&segments[segments.len() - 2], parent_generics));
} else { } else {
// `<T>::assoc` will end up here, and so can `T::assoc`. // `<T>::assoc` will end up here, and so can `T::assoc`.
@ -4345,9 +4344,9 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
// The things we are substituting into the type should not contain // The things we are substituting into the type should not contain
// escaping late-bound regions, and nor should the base type scheme. // escaping late-bound regions, and nor should the base type scheme.
let scheme = self.tcx.lookup_item_type(def.def_id()); let ty = self.tcx.item_type(def.def_id());
assert!(!substs.has_escaping_regions()); assert!(!substs.has_escaping_regions());
assert!(!scheme.ty.has_escaping_regions()); assert!(!ty.has_escaping_regions());
// Add all the obligations that are required, substituting and // Add all the obligations that are required, substituting and
// normalized appropriately. // normalized appropriately.
@ -4358,16 +4357,16 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
// Substitute the values for the type parameters into the type of // Substitute the values for the type parameters into the type of
// the referenced item. // the referenced item.
let ty_substituted = self.instantiate_type_scheme(span, &substs, &scheme.ty); let ty_substituted = self.instantiate_type_scheme(span, &substs, &ty);
if let Some((ty::ImplContainer(impl_def_id), self_ty)) = ufcs_associated { if let Some((ty::ImplContainer(impl_def_id), self_ty)) = ufcs_associated {
// In the case of `Foo<T>::method` and `<Foo<T>>::method`, if `method` // In the case of `Foo<T>::method` and `<Foo<T>>::method`, if `method`
// is inherent, there is no `Self` parameter, instead, the impl needs // is inherent, there is no `Self` parameter, instead, the impl needs
// type parameters, which we can infer by unifying the provided `Self` // type parameters, which we can infer by unifying the provided `Self`
// with the substituted impl type. // with the substituted impl type.
let impl_scheme = self.tcx.lookup_item_type(impl_def_id); let ty = self.tcx.item_type(impl_def_id);
let impl_ty = self.instantiate_type_scheme(span, &substs, &impl_scheme.ty); let impl_ty = self.instantiate_type_scheme(span, &substs, &ty);
match self.sub_types(false, TypeOrigin::Misc(span), self_ty, impl_ty) { match self.sub_types(false, TypeOrigin::Misc(span), self_ty, impl_ty) {
Ok(InferOk { obligations, .. }) => { Ok(InferOk { obligations, .. }) => {
// FIXME(#32730) propagate obligations // FIXME(#32730) propagate obligations

View File

@ -1729,7 +1729,7 @@ impl<'a, 'gcx, 'tcx> RegionCtxt<'a, 'gcx, 'tcx> {
// ``` // ```
// //
// we can thus deduce that `<T as SomeTrait<'a>>::SomeType : 'a`. // we can thus deduce that `<T as SomeTrait<'a>>::SomeType : 'a`.
let trait_predicates = self.tcx.lookup_predicates(projection_ty.trait_ref.def_id); let trait_predicates = self.tcx.item_predicates(projection_ty.trait_ref.def_id);
assert_eq!(trait_predicates.parent, None); assert_eq!(trait_predicates.parent, None);
let predicates = trait_predicates.predicates.as_slice().to_vec(); let predicates = trait_predicates.predicates.as_slice().to_vec();
traits::elaborate_predicates(self.tcx, predicates) traits::elaborate_predicates(self.tcx, predicates)

View File

@ -179,18 +179,18 @@ impl<'ccx, 'gcx> CheckTypeWellFormedVisitor<'ccx, 'gcx> {
let (mut implied_bounds, self_ty) = match item.container { let (mut implied_bounds, self_ty) = match item.container {
ty::TraitContainer(_) => (vec![], fcx.tcx.mk_self_type()), ty::TraitContainer(_) => (vec![], fcx.tcx.mk_self_type()),
ty::ImplContainer(def_id) => (fcx.impl_implied_bounds(def_id, span), ty::ImplContainer(def_id) => (fcx.impl_implied_bounds(def_id, span),
fcx.tcx.lookup_item_type(def_id).ty) fcx.tcx.item_type(def_id))
}; };
match item.kind { match item.kind {
ty::AssociatedKind::Const => { ty::AssociatedKind::Const => {
let ty = fcx.tcx.lookup_item_type(item.def_id).ty; let ty = fcx.tcx.item_type(item.def_id);
let ty = fcx.instantiate_type_scheme(span, free_substs, &ty); let ty = fcx.instantiate_type_scheme(span, free_substs, &ty);
fcx.register_wf_obligation(ty, span, code.clone()); fcx.register_wf_obligation(ty, span, code.clone());
} }
ty::AssociatedKind::Method => { ty::AssociatedKind::Method => {
reject_shadowing_type_parameters(fcx.tcx, span, item.def_id); reject_shadowing_type_parameters(fcx.tcx, span, item.def_id);
let method_ty = fcx.tcx.lookup_item_type(item.def_id).ty; let method_ty = fcx.tcx.item_type(item.def_id);
let method_ty = fcx.instantiate_type_scheme(span, free_substs, &method_ty); let method_ty = fcx.instantiate_type_scheme(span, free_substs, &method_ty);
let predicates = fcx.instantiate_bounds(span, item.def_id, free_substs); let predicates = fcx.instantiate_bounds(span, item.def_id, free_substs);
let fty = match method_ty.sty { let fty = match method_ty.sty {
@ -205,7 +205,7 @@ impl<'ccx, 'gcx> CheckTypeWellFormedVisitor<'ccx, 'gcx> {
} }
ty::AssociatedKind::Type => { ty::AssociatedKind::Type => {
if item.has_value { if item.has_value {
let ty = fcx.tcx.lookup_item_type(item.def_id).ty; let ty = fcx.tcx.item_type(item.def_id);
let ty = fcx.instantiate_type_scheme(span, free_substs, &ty); let ty = fcx.instantiate_type_scheme(span, free_substs, &ty);
fcx.register_wf_obligation(ty, span, code.clone()); fcx.register_wf_obligation(ty, span, code.clone());
} }
@ -276,7 +276,7 @@ impl<'ccx, 'gcx> CheckTypeWellFormedVisitor<'ccx, 'gcx> {
// //
// 3) that the trait definition does not have any type parameters // 3) that the trait definition does not have any type parameters
let predicates = self.tcx().lookup_predicates(trait_def_id); let predicates = self.tcx().item_predicates(trait_def_id);
// We must exclude the Self : Trait predicate contained by all // We must exclude the Self : Trait predicate contained by all
// traits. // traits.
@ -353,8 +353,8 @@ impl<'ccx, 'gcx> CheckTypeWellFormedVisitor<'ccx, 'gcx> {
self.for_item(item).with_fcx(|fcx, this| { self.for_item(item).with_fcx(|fcx, this| {
let free_substs = &fcx.parameter_environment.free_substs; let free_substs = &fcx.parameter_environment.free_substs;
let def_id = fcx.tcx.map.local_def_id(item.id); let def_id = fcx.tcx.map.local_def_id(item.id);
let type_scheme = fcx.tcx.lookup_item_type(def_id); let ty = fcx.tcx.item_type(def_id);
let item_ty = fcx.instantiate_type_scheme(item.span, free_substs, &type_scheme.ty); let item_ty = fcx.instantiate_type_scheme(item.span, free_substs, &ty);
let bare_fn_ty = match item_ty.sty { let bare_fn_ty = match item_ty.sty {
ty::TyFnDef(.., ref bare_fn_ty) => bare_fn_ty, ty::TyFnDef(.., ref bare_fn_ty) => bare_fn_ty,
_ => { _ => {
@ -378,11 +378,11 @@ impl<'ccx, 'gcx> CheckTypeWellFormedVisitor<'ccx, 'gcx> {
debug!("check_item_type: {:?}", item); debug!("check_item_type: {:?}", item);
self.for_item(item).with_fcx(|fcx, this| { self.for_item(item).with_fcx(|fcx, this| {
let type_scheme = fcx.tcx.lookup_item_type(fcx.tcx.map.local_def_id(item.id)); let ty = fcx.tcx.item_type(fcx.tcx.map.local_def_id(item.id));
let item_ty = fcx.instantiate_type_scheme(item.span, let item_ty = fcx.instantiate_type_scheme(item.span,
&fcx.parameter_environment &fcx.parameter_environment
.free_substs, .free_substs,
&type_scheme.ty); &ty);
fcx.register_wf_obligation(item_ty, item.span, this.code.clone()); fcx.register_wf_obligation(item_ty, item.span, this.code.clone());
@ -417,7 +417,7 @@ impl<'ccx, 'gcx> CheckTypeWellFormedVisitor<'ccx, 'gcx> {
} }
} }
None => { None => {
let self_ty = fcx.tcx.tables().node_id_to_type(item.id); let self_ty = fcx.tcx.item_type(item_def_id);
let self_ty = fcx.instantiate_type_scheme(item.span, free_substs, &self_ty); let self_ty = fcx.instantiate_type_scheme(item.span, free_substs, &self_ty);
fcx.register_wf_obligation(self_ty, ast_self_ty.span, this.code.clone()); fcx.register_wf_obligation(self_ty, ast_self_ty.span, this.code.clone());
} }
@ -426,7 +426,7 @@ impl<'ccx, 'gcx> CheckTypeWellFormedVisitor<'ccx, 'gcx> {
let predicates = fcx.instantiate_bounds(item.span, item_def_id, free_substs); let predicates = fcx.instantiate_bounds(item.span, item_def_id, free_substs);
this.check_where_clauses(fcx, item.span, &predicates); this.check_where_clauses(fcx, item.span, &predicates);
fcx.impl_implied_bounds(fcx.tcx.map.local_def_id(item.id), item.span) fcx.impl_implied_bounds(item_def_id, item.span)
}); });
} }
@ -492,7 +492,7 @@ impl<'ccx, 'gcx> CheckTypeWellFormedVisitor<'ccx, 'gcx> {
let span = method_sig.decl.inputs[0].pat.span; let span = method_sig.decl.inputs[0].pat.span;
let free_substs = &fcx.parameter_environment.free_substs; let free_substs = &fcx.parameter_environment.free_substs;
let method_ty = fcx.tcx.lookup_item_type(method.def_id).ty; let method_ty = fcx.tcx.item_type(method.def_id);
let fty = fcx.instantiate_type_scheme(span, free_substs, &method_ty); let fty = fcx.instantiate_type_scheme(span, free_substs, &method_ty);
let sig = fcx.tcx.liberate_late_bound_regions(free_id_outlive, &fty.fn_sig()); let sig = fcx.tcx.liberate_late_bound_regions(free_id_outlive, &fty.fn_sig());
@ -523,13 +523,13 @@ impl<'ccx, 'gcx> CheckTypeWellFormedVisitor<'ccx, 'gcx> {
item: &hir::Item, item: &hir::Item,
ast_generics: &hir::Generics) ast_generics: &hir::Generics)
{ {
let ty = self.tcx().tables().node_id_to_type(item.id); let item_def_id = self.tcx().map.local_def_id(item.id);
let ty = self.tcx().item_type(item_def_id);
if self.tcx().has_error_field(ty) { if self.tcx().has_error_field(ty) {
return; return;
} }
let item_def_id = self.tcx().map.local_def_id(item.id); let ty_predicates = self.tcx().item_predicates(item_def_id);
let ty_predicates = self.tcx().lookup_predicates(item_def_id);
assert_eq!(ty_predicates.parent, None); assert_eq!(ty_predicates.parent, None);
let variances = self.tcx().item_variances(item_def_id); let variances = self.tcx().item_variances(item_def_id);
@ -583,8 +583,8 @@ impl<'ccx, 'gcx> CheckTypeWellFormedVisitor<'ccx, 'gcx> {
} }
fn reject_shadowing_type_parameters(tcx: TyCtxt, span: Span, def_id: DefId) { fn reject_shadowing_type_parameters(tcx: TyCtxt, span: Span, def_id: DefId) {
let generics = tcx.lookup_generics(def_id); let generics = tcx.item_generics(def_id);
let parent = tcx.lookup_generics(generics.parent.unwrap()); let parent = tcx.item_generics(generics.parent.unwrap());
let impl_params: FxHashMap<_, _> = parent.types let impl_params: FxHashMap<_, _> = parent.types
.iter() .iter()
.map(|tp| (tp.name, tp.def_id)) .map(|tp| (tp.name, tp.def_id))
@ -654,7 +654,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
let fields = let fields =
struct_def.fields().iter() struct_def.fields().iter()
.map(|field| { .map(|field| {
let field_ty = self.tcx.tables().node_id_to_type(field.id); let field_ty = self.tcx.item_type(self.tcx.map.local_def_id(field.id));
let field_ty = self.instantiate_type_scheme(field.span, let field_ty = self.instantiate_type_scheme(field.span,
&self.parameter_environment &self.parameter_environment
.free_substs, .free_substs,
@ -683,7 +683,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
None => { None => {
// Inherent impl: take implied bounds from the self type. // Inherent impl: take implied bounds from the self type.
let self_ty = self.tcx.lookup_item_type(impl_def_id).ty; let self_ty = self.tcx.item_type(impl_def_id);
let self_ty = self.instantiate_type_scheme(span, free_substs, &self_ty); let self_ty = self.instantiate_type_scheme(span, free_substs, &self_ty);
vec![self_ty] vec![self_ty]
} }

View File

@ -20,8 +20,6 @@ use rustc::ty::adjustment;
use rustc::ty::fold::{TypeFolder,TypeFoldable}; use rustc::ty::fold::{TypeFolder,TypeFoldable};
use rustc::infer::{InferCtxt, FixupError}; use rustc::infer::{InferCtxt, FixupError};
use rustc::util::nodemap::DefIdMap; use rustc::util::nodemap::DefIdMap;
use write_substs_to_tcx;
use write_ty_to_tcx;
use std::cell::Cell; use std::cell::Cell;
@ -67,7 +65,7 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
wbcx.visit_closures(); wbcx.visit_closures();
wbcx.visit_liberated_fn_sigs(); wbcx.visit_liberated_fn_sigs();
wbcx.visit_fru_field_types(); wbcx.visit_fru_field_types();
wbcx.visit_anon_types(item_id); wbcx.visit_anon_types();
wbcx.visit_deferred_obligations(item_id); wbcx.visit_deferred_obligations(item_id);
} }
} }
@ -133,6 +131,12 @@ impl<'cx, 'gcx, 'tcx> WritebackCx<'cx, 'gcx, 'tcx> {
self.fcx.tcx self.fcx.tcx
} }
fn write_ty_to_tcx(&self, node_id: ast::NodeId, ty: Ty<'gcx>) {
debug!("write_ty_to_tcx({}, {:?})", node_id, ty);
assert!(!ty.needs_infer());
self.tcx().tables.borrow_mut().node_types.insert(node_id, ty);
}
// Hacky hack: During type-checking, we treat *all* operators // Hacky hack: During type-checking, we treat *all* operators
// as potentially overloaded. But then, during writeback, if // as potentially overloaded. But then, during writeback, if
// we observe that something like `a+b` is (known to be) // we observe that something like `a+b` is (known to be)
@ -241,7 +245,7 @@ impl<'cx, 'gcx, 'tcx, 'v> Visitor<'v> for WritebackCx<'cx, 'gcx, 'tcx> {
let var_ty = self.fcx.local_ty(l.span, l.id); let var_ty = self.fcx.local_ty(l.span, l.id);
let var_ty = self.resolve(&var_ty, ResolvingLocal(l.span)); let var_ty = self.resolve(&var_ty, ResolvingLocal(l.span));
write_ty_to_tcx(self.fcx.ccx, l.id, var_ty); self.write_ty_to_tcx(l.id, var_ty);
intravisit::walk_local(self, l); intravisit::walk_local(self, l);
} }
@ -249,7 +253,7 @@ impl<'cx, 'gcx, 'tcx, 'v> Visitor<'v> for WritebackCx<'cx, 'gcx, 'tcx> {
match t.node { match t.node {
hir::TyArray(ref ty, ref count_expr) => { hir::TyArray(ref ty, ref count_expr) => {
self.visit_ty(&ty); self.visit_ty(&ty);
write_ty_to_tcx(self.fcx.ccx, count_expr.id, self.tcx().types.usize); self.write_ty_to_tcx(count_expr.id, self.tcx().types.usize);
} }
hir::TyBareFn(ref function_declaration) => { hir::TyBareFn(ref function_declaration) => {
intravisit::walk_fn_decl_nopat(self, &function_declaration.decl); intravisit::walk_fn_decl_nopat(self, &function_declaration.decl);
@ -302,13 +306,11 @@ impl<'cx, 'gcx, 'tcx> WritebackCx<'cx, 'gcx, 'tcx> {
} }
} }
fn visit_anon_types(&self, item_id: ast::NodeId) { fn visit_anon_types(&self) {
if self.fcx.writeback_errors.get() { if self.fcx.writeback_errors.get() {
return return
} }
let item_def_id = self.fcx.tcx.map.local_def_id(item_id);
let gcx = self.tcx().global_tcx(); let gcx = self.tcx().global_tcx();
for (&def_id, &concrete_ty) in self.fcx.anon_types.borrow().iter() { for (&def_id, &concrete_ty) in self.fcx.anon_types.borrow().iter() {
let reason = ResolvingAnonTy(def_id); let reason = ResolvingAnonTy(def_id);
@ -349,10 +351,7 @@ impl<'cx, 'gcx, 'tcx> WritebackCx<'cx, 'gcx, 'tcx> {
} }
}); });
gcx.register_item_type(def_id, ty::TypeScheme { gcx.item_types.borrow_mut().insert(def_id, outside_ty);
ty: outside_ty,
generics: gcx.lookup_generics(item_def_id)
});
} }
} }
@ -363,13 +362,17 @@ impl<'cx, 'gcx, 'tcx> WritebackCx<'cx, 'gcx, 'tcx> {
// Resolve the type of the node with id `id` // Resolve the type of the node with id `id`
let n_ty = self.fcx.node_ty(id); let n_ty = self.fcx.node_ty(id);
let n_ty = self.resolve(&n_ty, reason); let n_ty = self.resolve(&n_ty, reason);
write_ty_to_tcx(self.fcx.ccx, id, n_ty); self.write_ty_to_tcx(id, n_ty);
debug!("Node {} has type {:?}", id, n_ty); debug!("Node {} has type {:?}", id, n_ty);
// Resolve any substitutions // Resolve any substitutions
self.fcx.opt_node_ty_substs(id, |item_substs| { self.fcx.opt_node_ty_substs(id, |item_substs| {
write_substs_to_tcx(self.fcx.ccx, id, let item_substs = self.resolve(item_substs, reason);
self.resolve(item_substs, reason)); if !item_substs.is_noop() {
debug!("write_substs_to_tcx({}, {:?})", id, item_substs);
assert!(!item_substs.substs.needs_infer());
self.tcx().tables.borrow_mut().item_substs.insert(id, item_substs);
}
}); });
} }

View File

@ -106,7 +106,7 @@ impl<'a, 'gcx, 'tcx> CoherenceChecker<'a, 'gcx, 'tcx> {
fn check_implementation(&self, item: &Item) { fn check_implementation(&self, item: &Item) {
let tcx = self.crate_context.tcx; let tcx = self.crate_context.tcx;
let impl_did = tcx.map.local_def_id(item.id); let impl_did = tcx.map.local_def_id(item.id);
let self_type = tcx.lookup_item_type(impl_did); let self_type = tcx.item_type(impl_did);
// If there are no traits, then this implementation must have a // If there are no traits, then this implementation must have a
// base type. // base type.
@ -129,14 +129,14 @@ impl<'a, 'gcx, 'tcx> CoherenceChecker<'a, 'gcx, 'tcx> {
} else { } else {
// Skip inherent impls where the self type is an error // Skip inherent impls where the self type is an error
// type. This occurs with e.g. resolve failures (#30589). // type. This occurs with e.g. resolve failures (#30589).
if self_type.ty.references_error() { if self_type.references_error() {
return; return;
} }
// Add the implementation to the mapping from implementation to base // Add the implementation to the mapping from implementation to base
// type def ID, if there is a base type for this implementation and // type def ID, if there is a base type for this implementation and
// the implementation does not have any associated traits. // the implementation does not have any associated traits.
if let Some(base_def_id) = self.get_base_type_def_id(item.span, self_type.ty) { if let Some(base_def_id) = self.get_base_type_def_id(item.span, self_type) {
self.add_inherent_impl(base_def_id, impl_did); self.add_inherent_impl(base_def_id, impl_did);
} }
} }
@ -175,8 +175,8 @@ impl<'a, 'gcx, 'tcx> CoherenceChecker<'a, 'gcx, 'tcx> {
} }
let method_def_id = items[0]; let method_def_id = items[0];
let self_type = tcx.lookup_item_type(impl_did); let self_type = tcx.item_type(impl_did);
match self_type.ty.sty { match self_type.sty {
ty::TyAdt(type_def, _) => { ty::TyAdt(type_def, _) => {
type_def.set_destructor(method_def_id); type_def.set_destructor(method_def_id);
} }
@ -232,13 +232,13 @@ impl<'a, 'gcx, 'tcx> CoherenceChecker<'a, 'gcx, 'tcx> {
return; return;
}; };
let self_type = tcx.lookup_item_type(impl_did); let self_type = tcx.item_type(impl_did);
debug!("check_implementations_of_copy: self_type={:?} (bound)", debug!("check_implementations_of_copy: self_type={:?} (bound)",
self_type); self_type);
let span = tcx.map.span(impl_node_id); let span = tcx.map.span(impl_node_id);
let param_env = ParameterEnvironment::for_item(tcx, impl_node_id); let param_env = ParameterEnvironment::for_item(tcx, impl_node_id);
let self_type = self_type.ty.subst(tcx, &param_env.free_substs); let self_type = self_type.subst(tcx, &param_env.free_substs);
assert!(!self_type.has_escaping_regions()); assert!(!self_type.has_escaping_regions());
debug!("check_implementations_of_copy: self_type={:?} (free)", debug!("check_implementations_of_copy: self_type={:?} (free)",
@ -326,7 +326,7 @@ impl<'a, 'gcx, 'tcx> CoherenceChecker<'a, 'gcx, 'tcx> {
return; return;
}; };
let source = tcx.lookup_item_type(impl_did).ty; let source = tcx.item_type(impl_did);
let trait_ref = self.crate_context.tcx.impl_trait_ref(impl_did).unwrap(); let trait_ref = self.crate_context.tcx.impl_trait_ref(impl_did).unwrap();
let target = trait_ref.substs.type_at(1); let target = trait_ref.substs.type_at(1);
debug!("check_implementations_of_coerce_unsized: {:?} -> {:?} (bound)", debug!("check_implementations_of_coerce_unsized: {:?} -> {:?} (bound)",

View File

@ -81,7 +81,7 @@ impl<'cx, 'tcx> OrphanChecker<'cx, 'tcx> {
// defined in this crate. // defined in this crate.
debug!("coherence2::orphan check: inherent impl {}", debug!("coherence2::orphan check: inherent impl {}",
self.tcx.map.node_to_string(item.id)); self.tcx.map.node_to_string(item.id));
let self_ty = self.tcx.lookup_item_type(def_id).ty; let self_ty = self.tcx.item_type(def_id);
match self_ty.sty { match self_ty.sty {
ty::TyAdt(def, _) => { ty::TyAdt(def, _) => {
self.check_def_id(item, def.did); self.check_def_id(item, def.did);

View File

@ -13,7 +13,7 @@
# Collect phase # Collect phase
The collect phase of type check has the job of visiting all items, The collect phase of type check has the job of visiting all items,
determining their type, and writing that type into the `tcx.tcache` determining their type, and writing that type into the `tcx.types`
table. Despite its name, this table does not really operate as a table. Despite its name, this table does not really operate as a
*cache*, at least not for the types of items defined within the *cache*, at least not for the types of items defined within the
current crate: we assume that after the collect phase, the types of current crate: we assume that after the collect phase, the types of
@ -22,8 +22,7 @@ all local items will be present in the table.
Unlike most of the types that are present in Rust, the types computed Unlike most of the types that are present in Rust, the types computed
for each item are in fact type schemes. This means that they are for each item are in fact type schemes. This means that they are
generic types that may have type parameters. TypeSchemes are generic types that may have type parameters. TypeSchemes are
represented by an instance of `ty::TypeScheme`. This combines the represented by a pair of `Generics` and `Ty`. Type
core type along with a list of the bounds for each parameter. Type
parameters themselves are represented as `ty_param()` instances. parameters themselves are represented as `ty_param()` instances.
The phasing of type conversion is somewhat complicated. There is no The phasing of type conversion is somewhat complicated. There is no
@ -51,8 +50,8 @@ There are some shortcomings in this design:
- Before walking the set of supertraits for a given trait, you must - Before walking the set of supertraits for a given trait, you must
call `ensure_super_predicates` on that trait def-id. Otherwise, call `ensure_super_predicates` on that trait def-id. Otherwise,
`lookup_super_predicates` will result in ICEs. `item_super_predicates` will result in ICEs.
- Because the type scheme includes defaults, cycles through type - Because the item generics include defaults, cycles through type
parameter defaults are illegal even if those defaults are never parameter defaults are illegal even if those defaults are never
employed. This is not necessarily a bug. employed. This is not necessarily a bug.
@ -67,13 +66,13 @@ use rustc_const_eval::EvalHint::UncheckedExprHint;
use rustc_const_eval::{eval_const_expr_partial, report_const_eval_err}; use rustc_const_eval::{eval_const_expr_partial, report_const_eval_err};
use rustc::ty::subst::Substs; use rustc::ty::subst::Substs;
use rustc::ty::{ToPredicate, ImplContainer, AssociatedItemContainer, TraitContainer}; use rustc::ty::{ToPredicate, ImplContainer, AssociatedItemContainer, TraitContainer};
use rustc::ty::{self, AdtKind, ToPolyTraitRef, Ty, TyCtxt, TypeScheme}; use rustc::ty::{self, AdtKind, ToPolyTraitRef, Ty, TyCtxt};
use rustc::ty::util::IntTypeExt; use rustc::ty::util::IntTypeExt;
use rscope::*; use rscope::*;
use rustc::dep_graph::DepNode; use rustc::dep_graph::DepNode;
use util::common::{ErrorReported, MemoizationMap}; use util::common::{ErrorReported, MemoizationMap};
use util::nodemap::{NodeMap, FxHashMap, FxHashSet}; use util::nodemap::{NodeMap, FxHashMap, FxHashSet};
use {CrateCtxt, write_ty_to_tcx}; use CrateCtxt;
use rustc_const_math::ConstInt; use rustc_const_math::ConstInt;
@ -132,6 +131,15 @@ struct CollectItemTypesVisitor<'a, 'tcx: 'a> {
impl<'a, 'tcx, 'v> intravisit::Visitor<'v> for CollectItemTypesVisitor<'a, 'tcx> { impl<'a, 'tcx, 'v> intravisit::Visitor<'v> for CollectItemTypesVisitor<'a, 'tcx> {
fn visit_item(&mut self, item: &hir::Item) { fn visit_item(&mut self, item: &hir::Item) {
convert_item(self.ccx, item); convert_item(self.ccx, item);
intravisit::walk_item(self, item);
}
fn visit_ty(&mut self, ty: &hir::Ty) {
if let hir::TyImplTrait(..) = ty.node {
let def_id = self.ccx.tcx.map.local_def_id(ty.id);
generics_of_def_id(self.ccx, def_id);
}
intravisit::walk_ty(self, ty);
} }
} }
@ -308,11 +316,9 @@ impl<'a, 'tcx> AstConv<'tcx, 'tcx> for ItemCtxt<'a, 'tcx> {
}) })
} }
fn get_item_type_scheme(&self, span: Span, id: DefId) fn get_item_type(&self, span: Span, id: DefId) -> Result<Ty<'tcx>, ErrorReported> {
-> Result<ty::TypeScheme<'tcx>, ErrorReported>
{
self.ccx.cycle_check(span, AstConvRequest::GetItemTypeScheme(id), || { self.ccx.cycle_check(span, AstConvRequest::GetItemTypeScheme(id), || {
Ok(type_scheme_of_def_id(self.ccx, id)) Ok(type_of_def_id(self.ccx, id))
}) })
} }
@ -447,7 +453,7 @@ impl<'tcx> GetTypeParameterBounds<'tcx> for ty::GenericPredicates<'tcx> {
let def = astconv.tcx().type_parameter_def(node_id); let def = astconv.tcx().type_parameter_def(node_id);
let mut results = self.parent.map_or(vec![], |def_id| { let mut results = self.parent.map_or(vec![], |def_id| {
let parent = astconv.tcx().lookup_predicates(def_id); let parent = astconv.tcx().item_predicates(def_id);
parent.get_type_parameter_bounds(astconv, span, node_id) parent.get_type_parameter_bounds(astconv, span, node_id)
}); });
@ -546,16 +552,11 @@ fn convert_field<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>,
{ {
let tt = ccx.icx(struct_predicates).to_ty(&ExplicitRscope, &field.ty); let tt = ccx.icx(struct_predicates).to_ty(&ExplicitRscope, &field.ty);
ty_f.fulfill_ty(tt); ty_f.fulfill_ty(tt);
write_ty_to_tcx(ccx, field.id, tt);
/* add the field to the tcache */ let def_id = ccx.tcx.map.local_def_id(field.id);
ccx.tcx.register_item_type(ccx.tcx.map.local_def_id(field.id), ccx.tcx.item_types.borrow_mut().insert(def_id, tt);
ty::TypeScheme { ccx.tcx.generics.borrow_mut().insert(def_id, struct_generics);
generics: struct_generics, ccx.tcx.predicates.borrow_mut().insert(def_id, struct_predicates.clone());
ty: tt
});
ccx.tcx.predicates.borrow_mut().insert(ccx.tcx.map.local_def_id(field.id),
struct_predicates.clone());
} }
fn convert_method<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>, fn convert_method<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>,
@ -580,8 +581,7 @@ fn convert_method<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>,
let substs = mk_item_substs(&ccx.icx(&(rcvr_ty_predicates, &sig.generics)), let substs = mk_item_substs(&ccx.icx(&(rcvr_ty_predicates, &sig.generics)),
ccx.tcx.map.span(id), def_id); ccx.tcx.map.span(id), def_id);
let fty = ccx.tcx.mk_fn_def(def_id, substs, fty); let fty = ccx.tcx.mk_fn_def(def_id, substs, fty);
ccx.tcx.tcache.borrow_mut().insert(def_id, fty); ccx.tcx.item_types.borrow_mut().insert(def_id, fty);
write_ty_to_tcx(ccx, id, fty);
ccx.tcx.predicates.borrow_mut().insert(def_id, ty_generic_predicates); ccx.tcx.predicates.borrow_mut().insert(def_id, ty_generic_predicates);
} }
@ -596,9 +596,7 @@ fn convert_associated_const<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>,
}; };
let def_id = ccx.tcx.map.local_def_id(id); let def_id = ccx.tcx.map.local_def_id(id);
ccx.tcx.predicates.borrow_mut().insert(def_id, predicates); ccx.tcx.predicates.borrow_mut().insert(def_id, predicates);
ccx.tcx.tcache.borrow_mut().insert(def_id, ty); ccx.tcx.item_types.borrow_mut().insert(def_id, ty);
write_ty_to_tcx(ccx, id, ty);
} }
fn convert_associated_type<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>, fn convert_associated_type<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>,
@ -614,8 +612,7 @@ fn convert_associated_type<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>,
ccx.tcx.predicates.borrow_mut().insert(def_id, predicates); ccx.tcx.predicates.borrow_mut().insert(def_id, predicates);
if let Some(ty) = ty { if let Some(ty) = ty {
ccx.tcx.tcache.borrow_mut().insert(def_id, ty); ccx.tcx.item_types.borrow_mut().insert(def_id, ty);
write_ty_to_tcx(ccx, id, ty);
} }
} }
@ -662,11 +659,13 @@ fn convert_item(ccx: &CrateCtxt, it: &hir::Item) {
} }
hir::ItemEnum(ref enum_definition, _) => { hir::ItemEnum(ref enum_definition, _) => {
let def_id = ccx.tcx.map.local_def_id(it.id); let def_id = ccx.tcx.map.local_def_id(it.id);
let scheme = type_scheme_of_def_id(ccx, def_id); let ty = type_of_def_id(ccx, def_id);
let generics = generics_of_def_id(ccx, def_id);
let predicates = predicates_of_item(ccx, it); let predicates = predicates_of_item(ccx, it);
convert_enum_variant_types(ccx, convert_enum_variant_types(ccx,
tcx.lookup_adt_def_master(ccx.tcx.map.local_def_id(it.id)), tcx.lookup_adt_def_master(ccx.tcx.map.local_def_id(it.id)),
scheme, ty,
generics,
predicates, predicates,
&enum_definition.variants); &enum_definition.variants);
}, },
@ -690,18 +689,15 @@ fn convert_item(ccx: &CrateCtxt, it: &hir::Item) {
// Create generics from the generics specified in the impl head. // Create generics from the generics specified in the impl head.
debug!("convert: ast_generics={:?}", generics); debug!("convert: ast_generics={:?}", generics);
let def_id = ccx.tcx.map.local_def_id(it.id); let def_id = ccx.tcx.map.local_def_id(it.id);
let ty_generics = generics_of_def_id(ccx, def_id); generics_of_def_id(ccx, def_id);
let mut ty_predicates = let mut ty_predicates =
ty_generic_predicates(ccx, generics, None, vec![], false); ty_generic_predicates(ccx, generics, None, vec![], false);
debug!("convert: impl_bounds={:?}", ty_predicates); debug!("convert: impl_bounds={:?}", ty_predicates);
let selfty = ccx.icx(&ty_predicates).to_ty(&ExplicitRscope, &selfty); let selfty = ccx.icx(&ty_predicates).to_ty(&ExplicitRscope, &selfty);
write_ty_to_tcx(ccx, it.id, selfty); tcx.item_types.borrow_mut().insert(def_id, selfty);
tcx.register_item_type(def_id,
TypeScheme { generics: ty_generics,
ty: selfty });
let trait_ref = opt_trait_ref.as_ref().map(|ast_trait_ref| { let trait_ref = opt_trait_ref.as_ref().map(|ast_trait_ref| {
AstConv::instantiate_mono_trait_ref(&ccx.icx(&ty_predicates), AstConv::instantiate_mono_trait_ref(&ccx.icx(&ty_predicates),
&ExplicitRscope, &ExplicitRscope,
@ -742,14 +738,10 @@ fn convert_item(ccx: &CrateCtxt, it: &hir::Item) {
if let hir::ImplItemKind::Const(ref ty, _) = impl_item.node { if let hir::ImplItemKind::Const(ref ty, _) = impl_item.node {
let const_def_id = ccx.tcx.map.local_def_id(impl_item.id); let const_def_id = ccx.tcx.map.local_def_id(impl_item.id);
let ty_generics = generics_of_def_id(ccx, const_def_id); generics_of_def_id(ccx, const_def_id);
let ty = ccx.icx(&ty_predicates) let ty = ccx.icx(&ty_predicates)
.to_ty(&ExplicitRscope, &ty); .to_ty(&ExplicitRscope, &ty);
tcx.register_item_type(const_def_id, tcx.item_types.borrow_mut().insert(const_def_id, ty);
TypeScheme {
generics: ty_generics,
ty: ty,
});
convert_associated_const(ccx, ImplContainer(def_id), convert_associated_const(ccx, ImplContainer(def_id),
impl_item.id, ty); impl_item.id, ty);
} }
@ -788,7 +780,7 @@ fn convert_item(ccx: &CrateCtxt, it: &hir::Item) {
let _: Result<(), ErrorReported> = // any error is already reported, can ignore let _: Result<(), ErrorReported> = // any error is already reported, can ignore
ccx.ensure_super_predicates(it.span, def_id); ccx.ensure_super_predicates(it.span, def_id);
convert_trait_predicates(ccx, it); convert_trait_predicates(ccx, it);
let trait_predicates = tcx.lookup_predicates(def_id); let trait_predicates = tcx.item_predicates(def_id);
debug!("convert: trait_bounds={:?}", trait_predicates); debug!("convert: trait_bounds={:?}", trait_predicates);
@ -799,14 +791,10 @@ fn convert_item(ccx: &CrateCtxt, it: &hir::Item) {
for trait_item in trait_items { for trait_item in trait_items {
if let hir::ConstTraitItem(ref ty, _) = trait_item.node { if let hir::ConstTraitItem(ref ty, _) = trait_item.node {
let const_def_id = ccx.tcx.map.local_def_id(trait_item.id); let const_def_id = ccx.tcx.map.local_def_id(trait_item.id);
let ty_generics = generics_of_def_id(ccx, const_def_id); generics_of_def_id(ccx, const_def_id);
let ty = ccx.icx(&trait_predicates) let ty = ccx.icx(&trait_predicates)
.to_ty(&ExplicitRscope, ty); .to_ty(&ExplicitRscope, ty);
tcx.register_item_type(const_def_id, tcx.item_types.borrow_mut().insert(const_def_id, ty);
TypeScheme {
generics: ty_generics,
ty: ty,
});
convert_associated_const(ccx, container, trait_item.id, ty) convert_associated_const(ccx, container, trait_item.id, ty)
} }
} }
@ -840,28 +828,31 @@ fn convert_item(ccx: &CrateCtxt, it: &hir::Item) {
hir::ItemStruct(ref struct_def, _) | hir::ItemStruct(ref struct_def, _) |
hir::ItemUnion(ref struct_def, _) => { hir::ItemUnion(ref struct_def, _) => {
let def_id = ccx.tcx.map.local_def_id(it.id); let def_id = ccx.tcx.map.local_def_id(it.id);
let scheme = type_scheme_of_def_id(ccx, def_id); let ty = type_of_def_id(ccx, def_id);
let generics = generics_of_def_id(ccx, def_id);
let predicates = predicates_of_item(ccx, it); let predicates = predicates_of_item(ccx, it);
let variant = tcx.lookup_adt_def_master(def_id).struct_variant(); let variant = tcx.lookup_adt_def_master(def_id).struct_variant();
for (f, ty_f) in struct_def.fields().iter().zip(variant.fields.iter()) { for (f, ty_f) in struct_def.fields().iter().zip(variant.fields.iter()) {
convert_field(ccx, &scheme.generics, &predicates, f, ty_f) convert_field(ccx, generics, &predicates, f, ty_f)
} }
if !struct_def.is_struct() { if !struct_def.is_struct() {
convert_variant_ctor(ccx, struct_def.id(), variant, scheme, predicates); convert_variant_ctor(ccx, struct_def.id(), variant, ty, predicates);
} }
}, },
hir::ItemTy(_, ref generics) => { hir::ItemTy(_, ref generics) => {
ensure_no_ty_param_bounds(ccx, it.span, generics, "type"); ensure_no_ty_param_bounds(ccx, it.span, generics, "type");
let def_id = ccx.tcx.map.local_def_id(it.id); let def_id = ccx.tcx.map.local_def_id(it.id);
type_scheme_of_def_id(ccx, def_id); type_of_def_id(ccx, def_id);
generics_of_def_id(ccx, def_id);
predicates_of_item(ccx, it); predicates_of_item(ccx, it);
}, },
_ => { _ => {
let def_id = ccx.tcx.map.local_def_id(it.id); let def_id = ccx.tcx.map.local_def_id(it.id);
type_scheme_of_def_id(ccx, def_id); type_of_def_id(ccx, def_id);
generics_of_def_id(ccx, def_id);
predicates_of_item(ccx, it); predicates_of_item(ccx, it);
}, },
} }
@ -870,13 +861,13 @@ fn convert_item(ccx: &CrateCtxt, it: &hir::Item) {
fn convert_variant_ctor<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>, fn convert_variant_ctor<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>,
ctor_id: ast::NodeId, ctor_id: ast::NodeId,
variant: ty::VariantDef<'tcx>, variant: ty::VariantDef<'tcx>,
scheme: ty::TypeScheme<'tcx>, ty: Ty<'tcx>,
predicates: ty::GenericPredicates<'tcx>) { predicates: ty::GenericPredicates<'tcx>) {
let tcx = ccx.tcx; let tcx = ccx.tcx;
let def_id = tcx.map.local_def_id(ctor_id); let def_id = tcx.map.local_def_id(ctor_id);
generics_of_def_id(ccx, def_id); generics_of_def_id(ccx, def_id);
let ctor_ty = match variant.ctor_kind { let ctor_ty = match variant.ctor_kind {
CtorKind::Fictive | CtorKind::Const => scheme.ty, CtorKind::Fictive | CtorKind::Const => ty,
CtorKind::Fn => { CtorKind::Fn => {
let inputs: Vec<_> = let inputs: Vec<_> =
variant.fields variant.fields
@ -890,26 +881,26 @@ fn convert_variant_ctor<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>,
abi: abi::Abi::Rust, abi: abi::Abi::Rust,
sig: ty::Binder(ty::FnSig { sig: ty::Binder(ty::FnSig {
inputs: inputs, inputs: inputs,
output: scheme.ty, output: ty,
variadic: false variadic: false
}) })
})) }))
} }
}; };
write_ty_to_tcx(ccx, ctor_id, ctor_ty); tcx.item_types.borrow_mut().insert(def_id, ctor_ty);
tcx.tcache.borrow_mut().insert(def_id, ctor_ty);
tcx.predicates.borrow_mut().insert(tcx.map.local_def_id(ctor_id), predicates); tcx.predicates.borrow_mut().insert(tcx.map.local_def_id(ctor_id), predicates);
} }
fn convert_enum_variant_types<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>, fn convert_enum_variant_types<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>,
def: ty::AdtDefMaster<'tcx>, def: ty::AdtDefMaster<'tcx>,
scheme: ty::TypeScheme<'tcx>, ty: Ty<'tcx>,
generics: &'tcx ty::Generics<'tcx>,
predicates: ty::GenericPredicates<'tcx>, predicates: ty::GenericPredicates<'tcx>,
variants: &[hir::Variant]) { variants: &[hir::Variant]) {
// fill the field types // fill the field types
for (variant, ty_variant) in variants.iter().zip(def.variants.iter()) { for (variant, ty_variant) in variants.iter().zip(def.variants.iter()) {
for (f, ty_f) in variant.node.data.fields().iter().zip(ty_variant.fields.iter()) { for (f, ty_f) in variant.node.data.fields().iter().zip(ty_variant.fields.iter()) {
convert_field(ccx, &scheme.generics, &predicates, f, ty_f) convert_field(ccx, generics, &predicates, f, ty_f)
} }
// Convert the ctor, if any. This also registers the variant as // Convert the ctor, if any. This also registers the variant as
@ -918,7 +909,7 @@ fn convert_enum_variant_types<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>,
ccx, ccx,
variant.node.data.id(), variant.node.data.id(),
ty_variant, ty_variant,
scheme.clone(), ty,
predicates.clone() predicates.clone()
); );
} }
@ -1216,7 +1207,7 @@ fn convert_trait_predicates<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>, it: &hir::Item)
} }
}; };
let super_predicates = ccx.tcx.lookup_super_predicates(def_id); let super_predicates = ccx.tcx.item_super_predicates(def_id);
// `ty_generic_predicates` below will consider the bounds on the type // `ty_generic_predicates` below will consider the bounds on the type
// parameters (including `Self`) and the explicit where-clauses, // parameters (including `Self`) and the explicit where-clauses,
@ -1283,7 +1274,7 @@ fn generics_of_def_id<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>,
let node_id = if let Some(id) = tcx.map.as_local_node_id(def_id) { let node_id = if let Some(id) = tcx.map.as_local_node_id(def_id) {
id id
} else { } else {
return tcx.lookup_generics(def_id); return tcx.item_generics(def_id);
}; };
tcx.generics.memoize(def_id, || { tcx.generics.memoize(def_id, || {
use rustc::hir::map::*; use rustc::hir::map::*;
@ -1298,6 +1289,18 @@ fn generics_of_def_id<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>,
let parent_id = tcx.map.get_parent(node_id); let parent_id = tcx.map.get_parent(node_id);
Some(tcx.map.local_def_id(parent_id)) Some(tcx.map.local_def_id(parent_id))
} }
NodeTy(&hir::Ty { node: hir::TyImplTrait(..), .. }) => {
let mut parent_id = node_id;
loop {
match tcx.map.get(parent_id) {
NodeItem(_) | NodeImplItem(_) | NodeTraitItem(_) => break,
_ => {
parent_id = tcx.map.get_parent_node(parent_id);
}
}
}
Some(tcx.map.local_def_id(parent_id))
}
_ => None _ => None
}; };
@ -1377,13 +1380,11 @@ fn generics_of_def_id<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>,
let mut own_start = has_self as u32; let mut own_start = has_self as u32;
let (parent_regions, parent_types) = parent_def_id.map_or((0, 0), |def_id| { let (parent_regions, parent_types) = parent_def_id.map_or((0, 0), |def_id| {
let generics = generics_of_def_id(ccx, def_id); let generics = generics_of_def_id(ccx, def_id);
assert_eq!(generics.parent, None);
assert_eq!(generics.parent_regions, 0);
assert_eq!(generics.parent_types, 0);
assert_eq!(has_self, false); assert_eq!(has_self, false);
parent_has_self = generics.has_self; parent_has_self = generics.has_self;
own_start = generics.count() as u32; own_start = generics.count() as u32;
(generics.regions.len() as u32, generics.types.len() as u32) (generics.parent_regions + generics.regions.len() as u32,
generics.parent_types + generics.types.len() as u32)
}); });
let early_lifetimes = early_bound_lifetimes_from_generics(ccx, ast_generics); let early_lifetimes = early_bound_lifetimes_from_generics(ccx, ast_generics);
@ -1436,12 +1437,15 @@ fn type_of_def_id<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>,
let node_id = if let Some(id) = ccx.tcx.map.as_local_node_id(def_id) { let node_id = if let Some(id) = ccx.tcx.map.as_local_node_id(def_id) {
id id
} else { } else {
return ccx.tcx.lookup_item_type(def_id).ty; return ccx.tcx.item_type(def_id);
}; };
ccx.tcx.tcache.memoize(def_id, || { ccx.tcx.item_types.memoize(def_id, || {
use rustc::hir::map::*; use rustc::hir::map::*;
use rustc::hir::*; use rustc::hir::*;
// Alway bring in generics, as computing the type needs them.
generics_of_def_id(ccx, def_id);
let ty = match ccx.tcx.map.get(node_id) { let ty = match ccx.tcx.map.get(node_id) {
NodeItem(item) => { NodeItem(item) => {
match item.node { match item.node {
@ -1505,24 +1509,10 @@ fn type_of_def_id<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>,
} }
}; };
write_ty_to_tcx(ccx, node_id, ty);
ty ty
}) })
} }
fn type_scheme_of_def_id<'a, 'tcx>(ccx: &CrateCtxt<'a,'tcx>,
def_id: DefId)
-> ty::TypeScheme<'tcx> {
if def_id.is_local() {
ty::TypeScheme {
generics: generics_of_def_id(ccx, def_id),
ty: type_of_def_id(ccx, def_id)
}
} else {
ccx.tcx.lookup_item_type(def_id)
}
}
fn predicates_of_item<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>, fn predicates_of_item<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>,
it: &hir::Item) it: &hir::Item)
-> ty::GenericPredicates<'tcx> { -> ty::GenericPredicates<'tcx> {
@ -1554,7 +1544,8 @@ fn convert_foreign_item<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>,
// moral failing, but at the moment it seems like the only // moral failing, but at the moment it seems like the only
// convenient way to extract the ABI. - ndm // convenient way to extract the ABI. - ndm
let def_id = ccx.tcx.map.local_def_id(it.id); let def_id = ccx.tcx.map.local_def_id(it.id);
type_scheme_of_def_id(ccx, def_id); type_of_def_id(ccx, def_id);
generics_of_def_id(ccx, def_id);
let no_generics = hir::Generics::empty(); let no_generics = hir::Generics::empty();
let generics = match it.node { let generics = match it.node {
@ -1648,7 +1639,7 @@ fn ty_generic_predicates<'a,'tcx>(ccx: &CrateCtxt<'a,'tcx>,
let ref base_predicates = match parent { let ref base_predicates = match parent {
Some(def_id) => { Some(def_id) => {
assert_eq!(super_predicates, vec![]); assert_eq!(super_predicates, vec![]);
tcx.lookup_predicates(def_id) tcx.item_predicates(def_id)
} }
None => { None => {
ty::GenericPredicates { ty::GenericPredicates {
@ -2035,14 +2026,14 @@ fn enforce_impl_params_are_constrained<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>,
impl_predicates: &mut ty::GenericPredicates<'tcx>, impl_predicates: &mut ty::GenericPredicates<'tcx>,
impl_def_id: DefId) impl_def_id: DefId)
{ {
let impl_scheme = ccx.tcx.lookup_item_type(impl_def_id); let impl_ty = ccx.tcx.item_type(impl_def_id);
let impl_trait_ref = ccx.tcx.impl_trait_ref(impl_def_id); let impl_trait_ref = ccx.tcx.impl_trait_ref(impl_def_id);
// The trait reference is an input, so find all type parameters // The trait reference is an input, so find all type parameters
// reachable from there, to start (if this is an inherent impl, // reachable from there, to start (if this is an inherent impl,
// then just examine the self type). // then just examine the self type).
let mut input_parameters: FxHashSet<_> = let mut input_parameters: FxHashSet<_> =
ctp::parameters_for(&impl_scheme.ty, false).into_iter().collect(); ctp::parameters_for(&impl_ty, false).into_iter().collect();
if let Some(ref trait_ref) = impl_trait_ref { if let Some(ref trait_ref) = impl_trait_ref {
input_parameters.extend(ctp::parameters_for(trait_ref, false)); input_parameters.extend(ctp::parameters_for(trait_ref, false));
} }
@ -2066,12 +2057,12 @@ fn enforce_impl_lifetimes_are_constrained<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>,
impl_items: &[hir::ImplItem]) impl_items: &[hir::ImplItem])
{ {
// Every lifetime used in an associated type must be constrained. // Every lifetime used in an associated type must be constrained.
let impl_scheme = ccx.tcx.lookup_item_type(impl_def_id); let impl_ty = ccx.tcx.item_type(impl_def_id);
let impl_predicates = ccx.tcx.lookup_predicates(impl_def_id); let impl_predicates = ccx.tcx.item_predicates(impl_def_id);
let impl_trait_ref = ccx.tcx.impl_trait_ref(impl_def_id); let impl_trait_ref = ccx.tcx.impl_trait_ref(impl_def_id);
let mut input_parameters: FxHashSet<_> = let mut input_parameters: FxHashSet<_> =
ctp::parameters_for(&impl_scheme.ty, false).into_iter().collect(); ctp::parameters_for(&impl_ty, false).into_iter().collect();
if let Some(ref trait_ref) = impl_trait_ref { if let Some(ref trait_ref) = impl_trait_ref {
input_parameters.extend(ctp::parameters_for(trait_ref, false)); input_parameters.extend(ctp::parameters_for(trait_ref, false));
} }
@ -2085,10 +2076,10 @@ fn enforce_impl_lifetimes_are_constrained<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>,
item.kind == ty::AssociatedKind::Type && item.has_value item.kind == ty::AssociatedKind::Type && item.has_value
}) })
.flat_map(|def_id| { .flat_map(|def_id| {
ctp::parameters_for(&ccx.tcx.lookup_item_type(def_id).ty, true) ctp::parameters_for(&ccx.tcx.item_type(def_id), true)
}).collect(); }).collect();
for (ty_lifetime, lifetime) in impl_scheme.generics.regions.iter() for (ty_lifetime, lifetime) in ccx.tcx.item_generics(impl_def_id).regions.iter()
.zip(&ast_generics.lifetimes) .zip(&ast_generics.lifetimes)
{ {
let param = ctp::Parameter::from(ty_lifetime.to_early_bound_region_data()); let param = ctp::Parameter::from(ty_lifetime.to_early_bound_region_data());

View File

@ -44,7 +44,7 @@ independently:
into the `ty` representation into the `ty` representation
- collect: computes the types of each top-level item and enters them into - collect: computes the types of each top-level item and enters them into
the `cx.tcache` table for later use the `tcx.types` table for later use
- coherence: enforces coherence rules, builds some tables - coherence: enforces coherence rules, builds some tables
@ -108,7 +108,7 @@ use dep_graph::DepNode;
use hir::map as hir_map; use hir::map as hir_map;
use rustc::infer::{InferOk, TypeOrigin}; use rustc::infer::{InferOk, TypeOrigin};
use rustc::ty::subst::Substs; use rustc::ty::subst::Substs;
use rustc::ty::{self, Ty, TyCtxt, TypeFoldable}; use rustc::ty::{self, Ty, TyCtxt};
use rustc::traits::{self, Reveal}; use rustc::traits::{self, Reveal};
use session::{config, CompileResult}; use session::{config, CompileResult};
use util::common::time; use util::common::time;
@ -159,27 +159,6 @@ pub struct CrateCtxt<'a, 'tcx: 'a> {
pub deferred_obligations: RefCell<NodeMap<Vec<traits::DeferredObligation<'tcx>>>>, pub deferred_obligations: RefCell<NodeMap<Vec<traits::DeferredObligation<'tcx>>>>,
} }
// Functions that write types into the node type table
fn write_ty_to_tcx<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>, node_id: ast::NodeId, ty: Ty<'tcx>) {
debug!("write_ty_to_tcx({}, {:?})", node_id, ty);
assert!(!ty.needs_infer());
ccx.tcx.node_type_insert(node_id, ty);
}
fn write_substs_to_tcx<'a, 'tcx>(ccx: &CrateCtxt<'a, 'tcx>,
node_id: ast::NodeId,
item_substs: ty::ItemSubsts<'tcx>) {
if !item_substs.is_noop() {
debug!("write_substs_to_tcx({}, {:?})",
node_id,
item_substs);
assert!(!item_substs.substs.needs_infer());
ccx.tcx.tables.borrow_mut().item_substs.insert(node_id, item_substs);
}
}
fn require_c_abi_if_variadic(tcx: TyCtxt, fn require_c_abi_if_variadic(tcx: TyCtxt,
decl: &hir::FnDecl, decl: &hir::FnDecl,
abi: Abi, abi: Abi,
@ -216,7 +195,8 @@ fn check_main_fn_ty(ccx: &CrateCtxt,
main_id: ast::NodeId, main_id: ast::NodeId,
main_span: Span) { main_span: Span) {
let tcx = ccx.tcx; let tcx = ccx.tcx;
let main_t = tcx.tables().node_id_to_type(main_id); let main_def_id = tcx.map.local_def_id(main_id);
let main_t = tcx.item_type(main_def_id);
match main_t.sty { match main_t.sty {
ty::TyFnDef(..) => { ty::TyFnDef(..) => {
match tcx.map.find(main_id) { match tcx.map.find(main_id) {
@ -237,7 +217,6 @@ fn check_main_fn_ty(ccx: &CrateCtxt,
} }
_ => () _ => ()
} }
let main_def_id = tcx.map.local_def_id(main_id);
let substs = tcx.intern_substs(&[]); let substs = tcx.intern_substs(&[]);
let se_ty = tcx.mk_fn_def(main_def_id, substs, let se_ty = tcx.mk_fn_def(main_def_id, substs,
tcx.mk_bare_fn(ty::BareFnTy { tcx.mk_bare_fn(ty::BareFnTy {
@ -268,7 +247,8 @@ fn check_start_fn_ty(ccx: &CrateCtxt,
start_id: ast::NodeId, start_id: ast::NodeId,
start_span: Span) { start_span: Span) {
let tcx = ccx.tcx; let tcx = ccx.tcx;
let start_t = tcx.tables().node_id_to_type(start_id); let start_def_id = ccx.tcx.map.local_def_id(start_id);
let start_t = tcx.item_type(start_def_id);
match start_t.sty { match start_t.sty {
ty::TyFnDef(..) => { ty::TyFnDef(..) => {
match tcx.map.find(start_id) { match tcx.map.find(start_id) {
@ -289,7 +269,6 @@ fn check_start_fn_ty(ccx: &CrateCtxt,
_ => () _ => ()
} }
let start_def_id = ccx.tcx.map.local_def_id(start_id);
let substs = tcx.intern_substs(&[]); let substs = tcx.intern_substs(&[]);
let se_ty = tcx.mk_fn_def(start_def_id, substs, let se_ty = tcx.mk_fn_def(start_def_id, substs,
tcx.mk_bare_fn(ty::BareFnTy { tcx.mk_bare_fn(ty::BareFnTy {

View File

@ -82,16 +82,16 @@ impl<'a, 'tcx, 'v> Visitor<'v> for ConstraintContext<'a, 'tcx> {
hir::ItemEnum(..) | hir::ItemEnum(..) |
hir::ItemStruct(..) | hir::ItemStruct(..) |
hir::ItemUnion(..) => { hir::ItemUnion(..) => {
let scheme = tcx.lookup_item_type(did); let generics = tcx.item_generics(did);
// Not entirely obvious: constraints on structs/enums do not // Not entirely obvious: constraints on structs/enums do not
// affect the variance of their type parameters. See discussion // affect the variance of their type parameters. See discussion
// in comment at top of module. // in comment at top of module.
// //
// self.add_constraints_from_generics(&scheme.generics); // self.add_constraints_from_generics(generics);
for field in tcx.lookup_adt_def(did).all_fields() { for field in tcx.lookup_adt_def(did).all_fields() {
self.add_constraints_from_ty(&scheme.generics, self.add_constraints_from_ty(generics,
field.unsubst_ty(), field.unsubst_ty(),
self.covariant); self.covariant);
} }
@ -336,7 +336,7 @@ impl<'a, 'tcx> ConstraintContext<'a, 'tcx> {
} }
ty::TyAdt(def, substs) => { ty::TyAdt(def, substs) => {
let item_type = self.tcx().lookup_item_type(def.did); let adt_generics = self.tcx().item_generics(def.did);
// This edge is actually implied by the call to // This edge is actually implied by the call to
// `lookup_trait_def`, but I'm trying to be future-proof. See // `lookup_trait_def`, but I'm trying to be future-proof. See
@ -345,8 +345,8 @@ impl<'a, 'tcx> ConstraintContext<'a, 'tcx> {
self.add_constraints_from_substs(generics, self.add_constraints_from_substs(generics,
def.did, def.did,
&item_type.generics.types, &adt_generics.types,
&item_type.generics.regions, &adt_generics.regions,
substs, substs,
variance); variance);
} }

View File

@ -164,7 +164,7 @@ pub fn build_external_trait<'a, 'tcx>(cx: &DocContext, tcx: TyCtxt<'a, 'tcx, 'tc
did: DefId) -> clean::Trait { did: DefId) -> clean::Trait {
let def = tcx.lookup_trait_def(did); let def = tcx.lookup_trait_def(did);
let trait_items = tcx.associated_items(did).map(|item| item.clean(cx)).collect(); let trait_items = tcx.associated_items(did).map(|item| item.clean(cx)).collect();
let predicates = tcx.lookup_predicates(did); let predicates = tcx.item_predicates(did);
let generics = (def.generics, &predicates).clean(cx); let generics = (def.generics, &predicates).clean(cx);
let generics = filter_non_trait_generics(did, generics); let generics = filter_non_trait_generics(did, generics);
let (generics, supertrait_bounds) = separate_supertrait_bounds(generics); let (generics, supertrait_bounds) = separate_supertrait_bounds(generics);
@ -178,8 +178,8 @@ pub fn build_external_trait<'a, 'tcx>(cx: &DocContext, tcx: TyCtxt<'a, 'tcx, 'tc
fn build_external_function<'a, 'tcx>(cx: &DocContext, tcx: TyCtxt<'a, 'tcx, 'tcx>, fn build_external_function<'a, 'tcx>(cx: &DocContext, tcx: TyCtxt<'a, 'tcx, 'tcx>,
did: DefId) -> clean::Function { did: DefId) -> clean::Function {
let t = tcx.lookup_item_type(did); let ty = tcx.item_type(did);
let (decl, style, abi) = match t.ty.sty { let (decl, style, abi) = match ty.sty {
ty::TyFnDef(.., ref f) => ((did, &f.sig).clean(cx), f.unsafety, f.abi), ty::TyFnDef(.., ref f) => ((did, &f.sig).clean(cx), f.unsafety, f.abi),
_ => panic!("bad function"), _ => panic!("bad function"),
}; };
@ -190,10 +190,10 @@ fn build_external_function<'a, 'tcx>(cx: &DocContext, tcx: TyCtxt<'a, 'tcx, 'tcx
hir::Constness::NotConst hir::Constness::NotConst
}; };
let predicates = tcx.lookup_predicates(did); let predicates = tcx.item_predicates(did);
clean::Function { clean::Function {
decl: decl, decl: decl,
generics: (t.generics, &predicates).clean(cx), generics: (tcx.item_generics(did), &predicates).clean(cx),
unsafety: style, unsafety: style,
constness: constness, constness: constness,
abi: abi, abi: abi,
@ -202,11 +202,10 @@ fn build_external_function<'a, 'tcx>(cx: &DocContext, tcx: TyCtxt<'a, 'tcx, 'tcx
fn build_enum<'a, 'tcx>(cx: &DocContext, tcx: TyCtxt<'a, 'tcx, 'tcx>, fn build_enum<'a, 'tcx>(cx: &DocContext, tcx: TyCtxt<'a, 'tcx, 'tcx>,
did: DefId) -> clean::Enum { did: DefId) -> clean::Enum {
let t = tcx.lookup_item_type(did); let predicates = tcx.item_predicates(did);
let predicates = tcx.lookup_predicates(did);
clean::Enum { clean::Enum {
generics: (t.generics, &predicates).clean(cx), generics: (tcx.item_generics(did), &predicates).clean(cx),
variants_stripped: false, variants_stripped: false,
variants: tcx.lookup_adt_def(did).variants.clean(cx), variants: tcx.lookup_adt_def(did).variants.clean(cx),
} }
@ -214,8 +213,7 @@ fn build_enum<'a, 'tcx>(cx: &DocContext, tcx: TyCtxt<'a, 'tcx, 'tcx>,
fn build_struct<'a, 'tcx>(cx: &DocContext, tcx: TyCtxt<'a, 'tcx, 'tcx>, fn build_struct<'a, 'tcx>(cx: &DocContext, tcx: TyCtxt<'a, 'tcx, 'tcx>,
did: DefId) -> clean::Struct { did: DefId) -> clean::Struct {
let t = tcx.lookup_item_type(did); let predicates = tcx.item_predicates(did);
let predicates = tcx.lookup_predicates(did);
let variant = tcx.lookup_adt_def(did).struct_variant(); let variant = tcx.lookup_adt_def(did).struct_variant();
clean::Struct { clean::Struct {
@ -224,7 +222,7 @@ fn build_struct<'a, 'tcx>(cx: &DocContext, tcx: TyCtxt<'a, 'tcx, 'tcx>,
CtorKind::Fn => doctree::Tuple, CtorKind::Fn => doctree::Tuple,
CtorKind::Const => doctree::Unit, CtorKind::Const => doctree::Unit,
}, },
generics: (t.generics, &predicates).clean(cx), generics: (tcx.item_generics(did), &predicates).clean(cx),
fields: variant.fields.clean(cx), fields: variant.fields.clean(cx),
fields_stripped: false, fields_stripped: false,
} }
@ -232,13 +230,12 @@ fn build_struct<'a, 'tcx>(cx: &DocContext, tcx: TyCtxt<'a, 'tcx, 'tcx>,
fn build_union<'a, 'tcx>(cx: &DocContext, tcx: TyCtxt<'a, 'tcx, 'tcx>, fn build_union<'a, 'tcx>(cx: &DocContext, tcx: TyCtxt<'a, 'tcx, 'tcx>,
did: DefId) -> clean::Union { did: DefId) -> clean::Union {
let t = tcx.lookup_item_type(did); let predicates = tcx.item_predicates(did);
let predicates = tcx.lookup_predicates(did);
let variant = tcx.lookup_adt_def(did).struct_variant(); let variant = tcx.lookup_adt_def(did).struct_variant();
clean::Union { clean::Union {
struct_type: doctree::Plain, struct_type: doctree::Plain,
generics: (t.generics, &predicates).clean(cx), generics: (tcx.item_generics(did), &predicates).clean(cx),
fields: variant.fields.clean(cx), fields: variant.fields.clean(cx),
fields_stripped: false, fields_stripped: false,
} }
@ -246,12 +243,11 @@ fn build_union<'a, 'tcx>(cx: &DocContext, tcx: TyCtxt<'a, 'tcx, 'tcx>,
fn build_type_alias<'a, 'tcx>(cx: &DocContext, tcx: TyCtxt<'a, 'tcx, 'tcx>, fn build_type_alias<'a, 'tcx>(cx: &DocContext, tcx: TyCtxt<'a, 'tcx, 'tcx>,
did: DefId) -> clean::Typedef { did: DefId) -> clean::Typedef {
let t = tcx.lookup_item_type(did); let predicates = tcx.item_predicates(did);
let predicates = tcx.lookup_predicates(did);
clean::Typedef { clean::Typedef {
type_: t.ty.clean(cx), type_: tcx.item_type(did).clean(cx),
generics: (t.generics, &predicates).clean(cx), generics: (tcx.item_generics(did), &predicates).clean(cx),
} }
} }
@ -354,8 +350,7 @@ pub fn build_impl<'a, 'tcx>(cx: &DocContext,
}); });
} }
let ty = tcx.lookup_item_type(did); let for_ = tcx.item_type(did).clean(cx);
let for_ = ty.ty.clean(cx);
// Only inline impl if the implementing type is // Only inline impl if the implementing type is
// reachable in rustdoc generated documentation // reachable in rustdoc generated documentation
@ -365,11 +360,10 @@ pub fn build_impl<'a, 'tcx>(cx: &DocContext,
} }
} }
let predicates = tcx.lookup_predicates(did); let predicates = tcx.item_predicates(did);
let trait_items = tcx.associated_items(did).filter_map(|item| { let trait_items = tcx.associated_items(did).filter_map(|item| {
match item.kind { match item.kind {
ty::AssociatedKind::Const => { ty::AssociatedKind::Const => {
let type_scheme = tcx.lookup_item_type(item.def_id);
let default = if item.has_value { let default = if item.has_value {
Some(pprust::expr_to_string( Some(pprust::expr_to_string(
lookup_const_by_id(tcx, item.def_id, None).unwrap().0)) lookup_const_by_id(tcx, item.def_id, None).unwrap().0))
@ -379,7 +373,7 @@ pub fn build_impl<'a, 'tcx>(cx: &DocContext,
Some(clean::Item { Some(clean::Item {
name: Some(item.name.clean(cx)), name: Some(item.name.clean(cx)),
inner: clean::AssociatedConstItem( inner: clean::AssociatedConstItem(
type_scheme.ty.clean(cx), tcx.item_type(item.def_id).clean(cx),
default, default,
), ),
source: clean::Span::empty(), source: clean::Span::empty(),
@ -419,7 +413,7 @@ pub fn build_impl<'a, 'tcx>(cx: &DocContext,
} }
ty::AssociatedKind::Type => { ty::AssociatedKind::Type => {
let typedef = clean::Typedef { let typedef = clean::Typedef {
type_: tcx.lookup_item_type(item.def_id).ty.clean(cx), type_: tcx.item_type(item.def_id).clean(cx),
generics: clean::Generics { generics: clean::Generics {
lifetimes: vec![], lifetimes: vec![],
type_params: vec![], type_params: vec![],
@ -463,7 +457,7 @@ pub fn build_impl<'a, 'tcx>(cx: &DocContext,
provided_trait_methods: provided, provided_trait_methods: provided,
trait_: trait_, trait_: trait_,
for_: for_, for_: for_,
generics: (ty.generics, &predicates).clean(cx), generics: (tcx.item_generics(did), &predicates).clean(cx),
items: trait_items, items: trait_items,
polarity: Some(polarity.clean(cx)), polarity: Some(polarity.clean(cx)),
}), }),
@ -514,7 +508,7 @@ fn build_const<'a, 'tcx>(cx: &DocContext, tcx: TyCtxt<'a, 'tcx, 'tcx>,
debug!("got snippet {}", sn); debug!("got snippet {}", sn);
clean::Constant { clean::Constant {
type_: ty.map(|t| t.clean(cx)).unwrap_or_else(|| tcx.lookup_item_type(did).ty.clean(cx)), type_: ty.map(|t| t.clean(cx)).unwrap_or_else(|| tcx.item_type(did).clean(cx)),
expr: sn expr: sn
} }
} }
@ -523,7 +517,7 @@ fn build_static<'a, 'tcx>(cx: &DocContext, tcx: TyCtxt<'a, 'tcx, 'tcx>,
did: DefId, did: DefId,
mutable: bool) -> clean::Static { mutable: bool) -> clean::Static {
clean::Static { clean::Static {
type_: tcx.lookup_item_type(did).ty.clean(cx), type_: tcx.item_type(did).clean(cx),
mutability: if mutable {clean::Mutable} else {clean::Immutable}, mutability: if mutable {clean::Mutable} else {clean::Immutable},
expr: "\n\n\n".to_string(), // trigger the "[definition]" links expr: "\n\n\n".to_string(), // trigger the "[definition]" links
} }

View File

@ -1342,13 +1342,13 @@ impl<'tcx> Clean<Item> for ty::AssociatedItem {
fn clean(&self, cx: &DocContext) -> Item { fn clean(&self, cx: &DocContext) -> Item {
let inner = match self.kind { let inner = match self.kind {
ty::AssociatedKind::Const => { ty::AssociatedKind::Const => {
let ty = cx.tcx().lookup_item_type(self.def_id).ty; let ty = cx.tcx().item_type(self.def_id);
AssociatedConstItem(ty.clean(cx), None) AssociatedConstItem(ty.clean(cx), None)
} }
ty::AssociatedKind::Method => { ty::AssociatedKind::Method => {
let generics = (cx.tcx().lookup_generics(self.def_id), let generics = (cx.tcx().item_generics(self.def_id),
&cx.tcx().lookup_predicates(self.def_id)).clean(cx); &cx.tcx().item_predicates(self.def_id)).clean(cx);
let fty = match cx.tcx().lookup_item_type(self.def_id).ty.sty { let fty = match cx.tcx().item_type(self.def_id).sty {
ty::TyFnDef(_, _, f) => f, ty::TyFnDef(_, _, f) => f,
_ => unreachable!() _ => unreachable!()
}; };
@ -1357,7 +1357,7 @@ impl<'tcx> Clean<Item> for ty::AssociatedItem {
if self.method_has_self_argument { if self.method_has_self_argument {
let self_ty = match self.container { let self_ty = match self.container {
ty::ImplContainer(def_id) => { ty::ImplContainer(def_id) => {
cx.tcx().lookup_item_type(def_id).ty cx.tcx().item_type(def_id)
} }
ty::TraitContainer(_) => cx.tcx().mk_self_type() ty::TraitContainer(_) => cx.tcx().mk_self_type()
}; };
@ -1405,7 +1405,7 @@ impl<'tcx> Clean<Item> for ty::AssociatedItem {
// all of the generics from there and then look for bounds that are // all of the generics from there and then look for bounds that are
// applied to this associated type in question. // applied to this associated type in question.
let def = cx.tcx().lookup_trait_def(did); let def = cx.tcx().lookup_trait_def(did);
let predicates = cx.tcx().lookup_predicates(did); let predicates = cx.tcx().item_predicates(did);
let generics = (def.generics, &predicates).clean(cx); let generics = (def.generics, &predicates).clean(cx);
generics.where_predicates.iter().filter_map(|pred| { generics.where_predicates.iter().filter_map(|pred| {
let (name, self_type, trait_, bounds) = match *pred { let (name, self_type, trait_, bounds) = match *pred {
@ -1441,7 +1441,7 @@ impl<'tcx> Clean<Item> for ty::AssociatedItem {
} }
let ty = if self.has_value { let ty = if self.has_value {
Some(cx.tcx().lookup_item_type(self.def_id).ty) Some(cx.tcx().item_type(self.def_id))
} else { } else {
None None
}; };
@ -1901,7 +1901,7 @@ impl<'tcx> Clean<Type> for ty::Ty<'tcx> {
ty::TyAnon(def_id, substs) => { ty::TyAnon(def_id, substs) => {
// Grab the "TraitA + TraitB" from `impl TraitA + TraitB`, // Grab the "TraitA + TraitB" from `impl TraitA + TraitB`,
// by looking up the projections associated with the def_id. // by looking up the projections associated with the def_id.
let item_predicates = cx.tcx().lookup_predicates(def_id); let item_predicates = cx.tcx().item_predicates(def_id);
let substs = cx.tcx().lift(&substs).unwrap(); let substs = cx.tcx().lift(&substs).unwrap();
let bounds = item_predicates.instantiate(cx.tcx(), substs); let bounds = item_predicates.instantiate(cx.tcx(), substs);
ImplTrait(bounds.predicates.into_iter().filter_map(|predicate| { ImplTrait(bounds.predicates.into_iter().filter_map(|predicate| {

View File

@ -153,7 +153,7 @@ fn trait_is_same_or_supertrait(cx: &DocContext, child: DefId,
if child == trait_ { if child == trait_ {
return true return true
} }
let predicates = cx.tcx().lookup_super_predicates(child).predicates; let predicates = cx.tcx().item_super_predicates(child).predicates;
predicates.iter().filter_map(|pred| { predicates.iter().filter_map(|pred| {
if let ty::Predicate::Trait(ref pred) = *pred { if let ty::Predicate::Trait(ref pred) = *pred {
if pred.0.trait_ref.self_ty().is_self() { if pred.0.trait_ref.self_ty().is_self() {