+++ /dev/null
-// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
-// file at the top-level directory of this distribution and at
-// http://rust-lang.org/COPYRIGHT.
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-
-use hir;
-use hir::def_id::DefId;
-use hir::itemlikevisit::ItemLikeVisitor;
-use ty::TyCtxt;
-
-use super::dep_node::DepNode;
-
-/// Visit all the items in the krate in some order. When visiting a
-/// particular item, first create a dep-node by calling `dep_node_fn`
-/// and push that onto the dep-graph stack of tasks, and also create a
-/// read edge from the corresponding AST node. This is used in
-/// compiler passes to automatically record the item that they are
-/// working on.
-pub fn visit_all_item_likes_in_krate<'a, 'tcx, V, F>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
- mut dep_node_fn: F,
- visitor: &mut V)
- where F: FnMut(DefId) -> DepNode<DefId>, V: ItemLikeVisitor<'tcx>
-{
- struct TrackingVisitor<'visit, 'tcx: 'visit, F: 'visit, V: 'visit> {
- tcx: TyCtxt<'visit, 'tcx, 'tcx>,
- dep_node_fn: &'visit mut F,
- visitor: &'visit mut V,
- }
-
- impl<'visit, 'tcx, F, V> ItemLikeVisitor<'tcx> for TrackingVisitor<'visit, 'tcx, F, V>
- where F: FnMut(DefId) -> DepNode<DefId>, V: ItemLikeVisitor<'tcx>
- {
- fn visit_item(&mut self, i: &'tcx hir::Item) {
- let item_def_id = self.tcx.hir.local_def_id(i.id);
- let task_id = (self.dep_node_fn)(item_def_id);
- let _task = self.tcx.dep_graph.in_task(task_id.clone());
- debug!("Started task {:?}", task_id);
- self.tcx.dep_graph.read(DepNode::Hir(item_def_id));
- self.visitor.visit_item(i);
- debug!("Ended task {:?}", task_id);
- }
-
- fn visit_trait_item(&mut self, i: &'tcx hir::TraitItem) {
- let trait_item_def_id = self.tcx.hir.local_def_id(i.id);
- let task_id = (self.dep_node_fn)(trait_item_def_id);
- let _task = self.tcx.dep_graph.in_task(task_id.clone());
- debug!("Started task {:?}", task_id);
- self.tcx.dep_graph.read(DepNode::Hir(trait_item_def_id));
- self.visitor.visit_trait_item(i);
- debug!("Ended task {:?}", task_id);
- }
-
- fn visit_impl_item(&mut self, i: &'tcx hir::ImplItem) {
- let impl_item_def_id = self.tcx.hir.local_def_id(i.id);
- let task_id = (self.dep_node_fn)(impl_item_def_id);
- let _task = self.tcx.dep_graph.in_task(task_id.clone());
- debug!("Started task {:?}", task_id);
- self.tcx.dep_graph.read(DepNode::Hir(impl_item_def_id));
- self.visitor.visit_impl_item(i);
- debug!("Ended task {:?}", task_id);
- }
- }
-
- let krate = tcx.dep_graph.with_ignore(|| tcx.hir.krate());
- let mut tracking_visitor = TrackingVisitor {
- tcx: tcx,
- dep_node_fn: &mut dep_node_fn,
- visitor: visitor,
- };
- krate.visit_all_item_likes(&mut tracking_visitor)
-}
-
///
/// 1. **Shallow visit**: Get a simple callback for every item (or item-like thing) in the HIR.
/// - Example: find all items with a `#[foo]` attribute on them.
-/// - How: Implement `ItemLikeVisitor` and call `tcx.visit_all_item_likes_in_krate()`.
+/// - How: Implement `ItemLikeVisitor` and call `tcx.hir.krate().visit_all_item_likes()`.
/// - Pro: Efficient; just walks the lists of item-like things, not the nodes themselves.
-/// - Pro: Integrates well into dependency tracking.
/// - Con: Don't get information about nesting
/// - Con: Don't have methods for specific bits of HIR, like "on
/// every expr, do this".
/// within one another.
/// - Example: Examine each expression to look for its type and do some check or other.
/// - How: Implement `intravisit::Visitor` and use
-/// `tcx.visit_all_item_likes_in_krate(visitor.as_deep_visitor())`. Within
+/// `tcx.hir.krate().visit_all_item_likes(visitor.as_deep_visitor())`. Within
/// your `intravisit::Visitor` impl, implement methods like
/// `visit_expr()`; don't forget to invoke
/// `intravisit::walk_visit_expr()` to keep walking the subparts.
pub use self::LvaluePreference::*;
pub use self::fold::TypeFoldable;
-use dep_graph::{self, DepNode};
+use dep_graph::DepNode;
use hir::{map as hir_map, FreevarMap, TraitMap};
use hir::def::{Def, CtorKind, ExportMap};
use hir::def_id::{CrateNum, DefId, DefIndex, CRATE_DEF_INDEX, LOCAL_CRATE};
use rustc_data_structures::transitive_relation::TransitiveRelation;
use hir;
-use hir::itemlikevisit::ItemLikeVisitor;
pub use self::sty::{Binder, DebruijnIndex};
pub use self::sty::{FnSig, PolyFnSig};
self.mk_region(ty::ReScope(self.node_extent(id)))
}
- pub fn visit_all_item_likes_in_krate<V,F>(self,
- dep_node_fn: F,
- visitor: &mut V)
- where F: FnMut(DefId) -> DepNode<DefId>, V: ItemLikeVisitor<'gcx>
- {
- dep_graph::visit_all_item_likes_in_krate(self.global_tcx(), dep_node_fn, visitor);
- }
-
/// Looks up the span of `impl_did` if the impl is local; otherwise returns `Err`
/// with the name of the crate containing the impl.
pub fn span_of_impl(self, impl_did: DefId) -> Result<Span, Symbol> {