about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorNiko Matsakis <niko@alum.mit.edu>2016-08-10 14:49:22 -0400
committerNiko Matsakis <niko@alum.mit.edu>2016-08-17 08:03:50 -0400
commit92f269e665bd7fdccf83da6f545ee755b211bbb9 (patch)
tree79b90cdd6ed0ab374e1a641028280d83aa7aaf29 /src
parent25bb51d98fee9d991c06169784a48e4533fff035 (diff)
downloadrust-92f269e665bd7fdccf83da6f545ee755b211bbb9.tar.gz
rust-92f269e665bd7fdccf83da6f545ee755b211bbb9.zip
put ecx into IndexBuilder so we don't have to pass
Diffstat (limited to 'src')
-rw-r--r--src/librustc_metadata/encoder.rs95
-rw-r--r--src/librustc_metadata/index_builder.rs8
2 files changed, 54 insertions, 49 deletions
diff --git a/src/librustc_metadata/encoder.rs b/src/librustc_metadata/encoder.rs
index 97c780f84e9..6f0ccf5af99 100644
--- a/src/librustc_metadata/encoder.rs
+++ b/src/librustc_metadata/encoder.rs
@@ -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,
     });
 
diff --git a/src/librustc_metadata/index_builder.rs b/src/librustc_metadata/index_builder.rs
index 0f52252c6a0..1e1ae064436 100644
--- a/src/librustc_metadata/index_builder.rs
+++ b/src/librustc_metadata/index_builder.rs
@@ -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
     }