put ecx into IndexBuilder so we don't have to pass

This commit is contained in:
Niko Matsakis 2016-08-10 14:49:22 -04:00
parent 25bb51d98f
commit 92f269e665
2 changed files with 54 additions and 49 deletions

View file

@ -762,10 +762,10 @@ fn encode_xrefs<'a, 'tcx>(ecx: &EncodeContext<'a, 'tcx>,
rbml_w.end_tag();
}
fn encode_info_for_item<'a, 'tcx>(ecx: &EncodeContext<'a, 'tcx>,
rbml_w: &mut Encoder,
fn encode_info_for_item<'a, 'tcx>(rbml_w: &mut Encoder,
item: &hir::Item,
index: &mut IndexBuilder<'a, 'tcx>) {
let ecx = index.ecx();
let tcx = ecx.tcx;
debug!("encoding info for item at {}",
@ -1234,10 +1234,11 @@ fn encode_info_for_item<'a, 'tcx>(ecx: &EncodeContext<'a, 'tcx>,
}
}
fn encode_info_for_foreign_item<'a, 'tcx>(ecx: &EncodeContext<'a, 'tcx>,
rbml_w: &mut Encoder,
fn encode_info_for_foreign_item<'a, 'tcx>(rbml_w: &mut Encoder,
nitem: &hir::ForeignItem,
index: &mut IndexBuilder<'a, 'tcx>) {
let ecx = index.ecx();
debug!("writing foreign item {}", ecx.tcx.node_path_str(nitem.id));
let def_id = ecx.tcx.map.local_def_id(nitem.id);
let abi = ecx.tcx.map.get_foreign_abi(nitem.id);
@ -1282,10 +1283,50 @@ fn encode_info_for_foreign_item<'a, 'tcx>(ecx: &EncodeContext<'a, 'tcx>,
rbml_w.end_tag();
}
fn my_visit_expr(expr: &hir::Expr,
rbml_w: &mut Encoder,
ecx: &EncodeContext,
index: &mut IndexBuilder) {
struct EncodeVisitor<'a, 'data:'a, 'ecx: 'a, 'tcx: 'ecx> {
rbml_w_for_visit_item: &'a mut Encoder<'data>,
index: &'a mut IndexBuilder<'ecx, 'tcx>,
}
impl<'a, 'data, 'ecx, 'tcx> Visitor<'tcx> for EncodeVisitor<'a, 'data, 'ecx, 'tcx> {
fn visit_expr(&mut self, ex: &'tcx hir::Expr) {
intravisit::walk_expr(self, ex);
encode_info_for_expr(ex, self.rbml_w_for_visit_item, self.index);
}
fn visit_item(&mut self, i: &'tcx hir::Item) {
intravisit::walk_item(self, i);
encode_info_for_item(self.rbml_w_for_visit_item, i, self.index);
}
fn visit_foreign_item(&mut self, ni: &'tcx hir::ForeignItem) {
intravisit::walk_foreign_item(self, ni);
encode_info_for_foreign_item(self.rbml_w_for_visit_item, ni, self.index);
}
fn visit_ty(&mut self, ty: &'tcx hir::Ty) {
intravisit::walk_ty(self, ty);
encode_info_for_ty(ty, self.rbml_w_for_visit_item, self.index);
}
}
fn encode_info_for_ty(ty: &hir::Ty,
rbml_w: &mut Encoder,
index: &mut IndexBuilder) {
let ecx = index.ecx();
if let hir::TyImplTrait(_) = ty.node {
let def_id = ecx.tcx.map.local_def_id(ty.id);
let _task = index.record(def_id, rbml_w);
rbml_w.start_tag(tag_items_data_item);
encode_def_id_and_key(ecx, rbml_w, def_id);
encode_family(rbml_w, 'y');
encode_bounds_and_type_for_item(rbml_w, ecx, index, ty.id);
rbml_w.end_tag();
}
}
fn encode_info_for_expr(expr: &hir::Expr,
rbml_w: &mut Encoder,
index: &mut IndexBuilder) {
let ecx = index.ecx();
match expr.node {
hir::ExprClosure(..) => {
let def_id = ecx.tcx.map.local_def_id(expr.id);
@ -1313,42 +1354,7 @@ fn my_visit_expr(expr: &hir::Expr,
}
}
struct EncodeVisitor<'a, 'b:'a, 'c:'a, 'tcx:'c> {
rbml_w_for_visit_item: &'a mut Encoder<'b>,
ecx: &'a EncodeContext<'c, 'tcx>,
index: &'a mut IndexBuilder<'c, 'tcx>,
}
impl<'a, 'b, 'c, 'tcx> Visitor<'tcx> for EncodeVisitor<'a, 'b, 'c, 'tcx> {
fn visit_expr(&mut self, ex: &'tcx hir::Expr) {
intravisit::walk_expr(self, ex);
my_visit_expr(ex, self.rbml_w_for_visit_item, self.ecx, self.index);
}
fn visit_item(&mut self, i: &'tcx hir::Item) {
intravisit::walk_item(self, i);
encode_info_for_item(self.ecx, self.rbml_w_for_visit_item, i, self.index);
}
fn visit_foreign_item(&mut self, ni: &'tcx hir::ForeignItem) {
intravisit::walk_foreign_item(self, ni);
encode_info_for_foreign_item(self.ecx, self.rbml_w_for_visit_item, ni, self.index);
}
fn visit_ty(&mut self, ty: &'tcx hir::Ty) {
intravisit::walk_ty(self, ty);
if let hir::TyImplTrait(_) = ty.node {
let rbml_w = &mut *self.rbml_w_for_visit_item;
let def_id = self.ecx.tcx.map.local_def_id(ty.id);
let _task = self.index.record(def_id, rbml_w);
rbml_w.start_tag(tag_items_data_item);
encode_def_id_and_key(self.ecx, rbml_w, def_id);
encode_family(rbml_w, 'y');
encode_bounds_and_type_for_item(rbml_w, self.ecx, self.index, ty.id);
rbml_w.end_tag();
}
}
}
fn encode_info_for_items<'a, 'tcx>(ecx: &EncodeContext<'a, 'tcx>,
fn encode_info_for_items<'a, 'tcx>(ecx: &'a EncodeContext<'a, 'tcx>,
rbml_w: &mut Encoder)
-> IndexBuilder<'a, 'tcx> {
let krate = ecx.tcx.map.krate();
@ -1369,7 +1375,6 @@ fn encode_info_for_items<'a, 'tcx>(ecx: &EncodeContext<'a, 'tcx>,
krate.visit_all_items(&mut EncodeVisitor {
index: &mut index,
ecx: ecx,
rbml_w_for_visit_item: &mut *rbml_w,
});

View file

@ -11,12 +11,12 @@
use encoder::EncodeContext;
use index::IndexData;
use rbml::writer::Encoder;
use rustc::dep_graph::{DepGraph, DepNode, DepTask};
use rustc::dep_graph::{DepNode, DepTask};
use rustc::hir::def_id::DefId;
use rustc::ty;
use rustc_data_structures::fnv::FnvHashMap;
pub struct IndexBuilder<'a, 'tcx> {
pub struct IndexBuilder<'a, 'tcx: 'a> {
ecx: &'a EncodeContext<'a, 'tcx>,
items: IndexData,
xrefs: FnvHashMap<XRef<'tcx>, u32>, // sequentially-assigned
@ -27,7 +27,7 @@ pub struct IndexBuilder<'a, 'tcx> {
pub enum XRef<'tcx> { Predicate(ty::Predicate<'tcx>) }
impl<'a, 'tcx> IndexBuilder<'a, 'tcx> {
pub fn new(ecx: &EncodeContext<'a, 'tcx>) -> Self {
pub fn new(ecx: &'a EncodeContext<'a, 'tcx>) -> Self {
IndexBuilder {
ecx: ecx,
items: IndexData::new(ecx.tcx.map.num_local_def_ids()),
@ -35,7 +35,7 @@ impl<'a, 'tcx> IndexBuilder<'a, 'tcx> {
}
}
pub fn ecx(&self) {
pub fn ecx(&self) -> &'a EncodeContext<'a, 'tcx> {
self.ecx
}