1
Fork 0

rustc: don't recurse through nested items in decoded HIR fragments.

This commit is contained in:
Eduard Burtescu 2016-09-17 19:06:21 +03:00
parent f2283a7be0
commit b01d4891e2
3 changed files with 10 additions and 12 deletions

View file

@ -27,6 +27,10 @@ pub struct NodeCollector<'ast> {
pub map: Vec<MapEntry<'ast>>, pub map: Vec<MapEntry<'ast>>,
/// The parent of this node /// The parent of this node
pub parent_node: NodeId, pub parent_node: NodeId,
/// If true, completely ignore nested items. We set this when loading
/// HIR from metadata, since in that case we only want the HIR for
/// one specific item (and not the ones nested inside of it).
pub ignore_nested_items: bool
} }
impl<'ast> NodeCollector<'ast> { impl<'ast> NodeCollector<'ast> {
@ -35,6 +39,7 @@ impl<'ast> NodeCollector<'ast> {
krate: krate, krate: krate,
map: vec![], map: vec![],
parent_node: CRATE_NODE_ID, parent_node: CRATE_NODE_ID,
ignore_nested_items: false
}; };
collector.insert_entry(CRATE_NODE_ID, RootCrate); collector.insert_entry(CRATE_NODE_ID, RootCrate);
@ -52,6 +57,7 @@ impl<'ast> NodeCollector<'ast> {
krate: krate, krate: krate,
map: map, map: map,
parent_node: parent_node, parent_node: parent_node,
ignore_nested_items: true
}; };
assert_eq!(parent_def_path.krate, parent_def_id.krate); assert_eq!(parent_def_path.krate, parent_def_id.krate);
@ -88,7 +94,9 @@ impl<'ast> Visitor<'ast> for NodeCollector<'ast> {
/// their outer items. /// their outer items.
fn visit_nested_item(&mut self, item: ItemId) { fn visit_nested_item(&mut self, item: ItemId) {
debug!("visit_nested_item: {:?}", item); debug!("visit_nested_item: {:?}", item);
self.visit_item(self.krate.item(item.id)) if !self.ignore_nested_items {
self.visit_item(self.krate.item(item.id))
}
} }
fn visit_item(&mut self, i: &'ast Item) { fn visit_item(&mut self, i: &'ast Item) {

View file

@ -285,15 +285,6 @@ impl<'ast> visit::Visitor for DefCollector<'ast> {
// We walk the HIR rather than the AST when reading items from metadata. // We walk the HIR rather than the AST when reading items from metadata.
impl<'ast> intravisit::Visitor<'ast> for DefCollector<'ast> { impl<'ast> intravisit::Visitor<'ast> for DefCollector<'ast> {
/// Because we want to track parent items and so forth, enable
/// deep walking so that we walk nested items in the context of
/// their outer items.
fn visit_nested_item(&mut self, item_id: hir::ItemId) {
debug!("visit_nested_item: {:?}", item_id);
let item = self.hir_crate.unwrap().item(item_id.id);
self.visit_item(item)
}
fn visit_item(&mut self, i: &'ast hir::Item) { fn visit_item(&mut self, i: &'ast hir::Item) {
debug!("visit_item: {:?}", i); debug!("visit_item: {:?}", i);

View file

@ -14,11 +14,10 @@ use std::sync::atomic;
pub const C1: usize = 1; pub const C1: usize = 1;
pub const C2: atomic::AtomicUsize = atomic::AtomicUsize::new(0); pub const C2: atomic::AtomicUsize = atomic::AtomicUsize::new(0);
pub const C3: fn() = foo; pub const C3: fn() = { fn foo() {} foo };
pub const C4: usize = C1 * C1 + C1 / C1; pub const C4: usize = C1 * C1 + C1 / C1;
pub const C5: &'static usize = &C4; pub const C5: &'static usize = &C4;
pub static S1: usize = 3; pub static S1: usize = 3;
pub static S2: atomic::AtomicUsize = atomic::AtomicUsize::new(0); pub static S2: atomic::AtomicUsize = atomic::AtomicUsize::new(0);
fn foo() {}