self.local_def_id(self.body_owner(id))
}
+ /// Given a body owner's id, returns the `BodyId` associated with it.
+ pub fn body_owned_by(&self, id: NodeId) -> BodyId {
+ if let Some(entry) = self.find_entry(id) {
+ if let Some(body_id) = entry.associated_body() {
+ // For item-like things and closures, the associated
+ // body has its own distinct id, and that is returned
+ // by `associated_body`.
+ body_id
+ } else {
+ // For some expressions, the expression is its own body.
+ if let EntryExpr(_, expr) = entry {
+ BodyId { node_id: expr.id }
+ } else {
+ span_bug!(self.span(id), "id `{}` has no associated body", id);
+ }
+ }
+ } else {
+ bug!("no entry for id `{}`", id)
+ }
+ }
+
pub fn ty_param_owner(&self, id: NodeId) -> NodeId {
match self.get(id) {
NodeItem(&Item { node: ItemTrait(..), .. }) => id,
use self::InteriorKind::*;
-use rustc::dep_graph::DepNode;
use rustc::hir::map as hir_map;
use rustc::hir::map::blocks::FnLikeNode;
use rustc::cfg;
use rustc::middle::mem_categorization::ImmutabilityBlame;
use rustc::middle::region;
use rustc::ty::{self, TyCtxt};
+use rustc::ty::maps::Providers;
use std::fmt;
use std::rc::Rc;
use std::hash::{Hash, Hasher};
use syntax::ast;
-use syntax_pos::{MultiSpan, Span};
+use syntax_pos::{DUMMY_SP, MultiSpan, Span};
use errors::DiagnosticBuilder;
use rustc::hir;
pub type LoanDataFlow<'a, 'tcx> = DataFlowContext<'a, 'tcx, LoanDataFlowOperator>;
pub fn check_crate<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>) {
- tcx.dep_graph.with_task(DepNode::BorrowCheckKrate, tcx, (), check_crate_task);
-
- fn check_crate_task<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, (): ()) {
- tcx.visit_all_bodies_in_krate(|body_owner_def_id, body_id| {
- tcx.dep_graph.with_task(DepNode::BorrowCheck(body_owner_def_id),
- tcx,
- body_id,
- borrowck_fn);
- });
- }
+ tcx.visit_all_bodies_in_krate(|body_owner_def_id, _body_id| {
+ ty::queries::borrowck::get(tcx, DUMMY_SP, body_owner_def_id);
+ });
+}
+
+pub fn provide(providers: &mut Providers) {
+ *providers = Providers {
+ borrowck: borrowck,
+ ..*providers
+ };
}
/// Collection of conclusions determined via borrow checker analyses.
pub move_data: move_data::FlowedMoveData<'a, 'tcx>,
}
-fn borrowck_fn<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, body_id: hir::BodyId) {
- debug!("borrowck_fn(body_id={:?})", body_id);
+fn borrowck<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, owner_def_id: DefId) {
+ debug!("borrowck(body_owner_def_id={:?})", owner_def_id);
- let owner_id = tcx.hir.body_owner(body_id);
- let owner_def_id = tcx.hir.local_def_id(owner_id);
+ let owner_id = tcx.hir.as_local_node_id(owner_def_id).unwrap();
+ let body_id = tcx.hir.body_owned_by(owner_id);
let attributes = tcx.get_attrs(owner_def_id);
let tables = tcx.item_tables(owner_def_id);