Skip to content

Commit

Permalink
Port the map construction code to use the new visitor.
Browse files Browse the repository at this point in the history
  • Loading branch information
nikomatsakis committed Nov 19, 2015
1 parent 767ee79 commit 25727d7
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 20 deletions.
2 changes: 1 addition & 1 deletion src/librustc/front/map/blocks.rs
Expand Up @@ -29,7 +29,7 @@ use rustc_front::hir::{Block, FnDecl};
use syntax::ast::{Name, NodeId};
use rustc_front::hir as ast;
use syntax::codemap::Span;
use rustc_front::visit::FnKind;
use rustc_front::intravisit::FnKind;

/// An FnLikeNode is a Node that is like a fn, in that it has a decl
/// and a body (as well as a NodeId, a span, etc).
Expand Down
39 changes: 25 additions & 14 deletions src/librustc/front/map/collector.rs
Expand Up @@ -13,7 +13,7 @@ use super::MapEntry::*;

use rustc_front::hir::*;
use rustc_front::util;
use rustc_front::visit::{self, Visitor};
use rustc_front::intravisit::{self, Visitor};
use middle::def_id::{CRATE_DEF_INDEX, DefIndex};
use std::iter::repeat;
use syntax::ast::{NodeId, CRATE_NODE_ID, DUMMY_NODE_ID};
Expand All @@ -22,14 +22,16 @@ use syntax::codemap::Span;
/// A Visitor that walks over an AST and collects Node's into an AST
/// Map.
pub struct NodeCollector<'ast> {
pub krate: &'ast Crate,
pub map: Vec<MapEntry<'ast>>,
pub definitions: Definitions,
pub parent_node: NodeId,
}

impl<'ast> NodeCollector<'ast> {
pub fn root() -> NodeCollector<'ast> {
pub fn root(krate: &'ast Crate) -> NodeCollector<'ast> {
let mut collector = NodeCollector {
krate: krate,
map: vec![],
definitions: Definitions::new(),
parent_node: CRATE_NODE_ID,
Expand All @@ -44,13 +46,15 @@ impl<'ast> NodeCollector<'ast> {
collector
}

pub fn extend(parent: &'ast InlinedParent,
pub fn extend(krate: &'ast Crate,
parent: &'ast InlinedParent,
parent_node: NodeId,
parent_def_path: DefPath,
map: Vec<MapEntry<'ast>>,
definitions: Definitions)
-> NodeCollector<'ast> {
let mut collector = NodeCollector {
krate: krate,
map: map,
parent_node: parent_node,
definitions: definitions,
Expand Down Expand Up @@ -107,6 +111,13 @@ impl<'ast> NodeCollector<'ast> {
}

impl<'ast> Visitor<'ast> for NodeCollector<'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: ItemId) {
self.visit_item(self.krate.item(item.id))
}

fn visit_item(&mut self, i: &'ast Item) {
// Pick the def data. This need not be unique, but the more
// information we encapsulate into
Expand Down Expand Up @@ -173,7 +184,7 @@ impl<'ast> Visitor<'ast> for NodeCollector<'ast> {
}
_ => {}
}
visit::walk_item(self, i);
intravisit::walk_item(self, i);
self.parent_node = parent_node;
}

Expand All @@ -184,7 +195,7 @@ impl<'ast> Visitor<'ast> for NodeCollector<'ast> {

let parent_node = self.parent_node;
self.parent_node = foreign_item.id;
visit::walk_foreign_item(self, foreign_item);
intravisit::walk_foreign_item(self, foreign_item);
self.parent_node = parent_node;
}

Expand All @@ -195,7 +206,7 @@ impl<'ast> Visitor<'ast> for NodeCollector<'ast> {
DefPathData::TypeParam(ty_param.name));
}

visit::walk_generics(self, generics);
intravisit::walk_generics(self, generics);
}

fn visit_trait_item(&mut self, ti: &'ast TraitItem) {
Expand All @@ -217,7 +228,7 @@ impl<'ast> Visitor<'ast> for NodeCollector<'ast> {
_ => { }
}

visit::walk_trait_item(self, ti);
intravisit::walk_trait_item(self, ti);

self.parent_node = parent_node;
}
Expand All @@ -240,7 +251,7 @@ impl<'ast> Visitor<'ast> for NodeCollector<'ast> {
_ => { }
}

visit::walk_impl_item(self, ii);
intravisit::walk_impl_item(self, ii);

self.parent_node = parent_node;
}
Expand All @@ -259,7 +270,7 @@ impl<'ast> Visitor<'ast> for NodeCollector<'ast> {

let parent_node = self.parent_node;
self.parent_node = pat.id;
visit::walk_pat(self, pat);
intravisit::walk_pat(self, pat);
self.parent_node = parent_node;
}

Expand All @@ -273,7 +284,7 @@ impl<'ast> Visitor<'ast> for NodeCollector<'ast> {

let parent_node = self.parent_node;
self.parent_node = expr.id;
visit::walk_expr(self, expr);
intravisit::walk_expr(self, expr);
self.parent_node = parent_node;
}

Expand All @@ -282,21 +293,21 @@ impl<'ast> Visitor<'ast> for NodeCollector<'ast> {
self.insert(id, NodeStmt(stmt));
let parent_node = self.parent_node;
self.parent_node = id;
visit::walk_stmt(self, stmt);
intravisit::walk_stmt(self, stmt);
self.parent_node = parent_node;
}

fn visit_fn(&mut self, fk: visit::FnKind<'ast>, fd: &'ast FnDecl,
fn visit_fn(&mut self, fk: intravisit::FnKind<'ast>, fd: &'ast FnDecl,
b: &'ast Block, s: Span, id: NodeId) {
assert_eq!(self.parent_node, id);
visit::walk_fn(self, fk, fd, b, s);
intravisit::walk_fn(self, fk, fd, b, s);
}

fn visit_block(&mut self, block: &'ast Block) {
self.insert(block.id, NodeBlock(block));
let parent_node = self.parent_node;
self.parent_node = block.id;
visit::walk_block(self, block);
intravisit::walk_block(self, block);
self.parent_node = parent_node;
}

Expand Down
13 changes: 8 additions & 5 deletions src/librustc/front/map/mod.rs
Expand Up @@ -25,7 +25,7 @@ use syntax::parse::token;

use rustc_front::hir::*;
use rustc_front::fold::Folder;
use rustc_front::visit;
use rustc_front::intravisit;
use rustc_front::print::pprust;

use arena::TypedArena;
Expand Down Expand Up @@ -809,9 +809,11 @@ impl<F: FoldOps> Folder for IdAndSpanUpdater<F> {
}

pub fn map_crate<'ast>(forest: &'ast mut Forest) -> Map<'ast> {
let mut collector = NodeCollector::root();
visit::walk_crate(&mut collector, &forest.krate);
let NodeCollector { map, definitions, .. } = collector;
let (map, definitions) = {
let mut collector = NodeCollector::root(&forest.krate);
intravisit::walk_crate(&mut collector, &forest.krate);
(collector.map, collector.definitions)
};

if log_enabled!(::log::DEBUG) {
// This only makes sense for ordered stores; note the
Expand Down Expand Up @@ -847,7 +849,7 @@ pub fn map_decoded_item<'ast, F: FoldOps>(map: &Map<'ast>,
-> &'ast InlinedItem {
let mut fld = IdAndSpanUpdater { fold_ops: fold_ops };
let ii = match ii {
II::Item(i) => II::Item(fld.fold_item(i)),
II::Item(i) => II::Item(i.map(|i| fld.fold_item(i))),
II::TraitItem(d, ti) => {
II::TraitItem(fld.fold_ops.new_def_id(d),
fld.fold_trait_item(ti))
Expand All @@ -867,6 +869,7 @@ pub fn map_decoded_item<'ast, F: FoldOps>(map: &Map<'ast>,
let ii_parent_id = fld.new_id(DUMMY_NODE_ID);
let mut collector =
NodeCollector::extend(
map.krate(),
ii_parent,
ii_parent_id,
def_path,
Expand Down

0 comments on commit 25727d7

Please sign in to comment.