]> git.lizzy.rs Git - rust.git/commitdiff
change callback for expr/type to a fn pointer
authorNiko Matsakis <niko@alum.mit.edu>
Mon, 15 Aug 2016 00:25:00 +0000 (20:25 -0400)
committerNiko Matsakis <niko@alum.mit.edu>
Wed, 17 Aug 2016 19:21:45 +0000 (15:21 -0400)
The idea is that, this way, we can cleanly isolate ALL state that is
being passed, since it goes as an argument to the fn pointer.

src/librustc_metadata/encoder.rs
src/librustc_metadata/index_builder.rs

index 9855eeeb97070c5af246b9e4a438e246210a43f7..309347a5e5a7a913bcba1ff1d7897c21360378f2 100644 (file)
@@ -205,16 +205,17 @@ fn encode_enum_variant_infos(&mut self,
         let def = ecx.tcx.lookup_adt_def(enum_did);
         self.encode_fields(enum_did);
         for (i, variant) in def.variants.iter().enumerate() {
-            self.record(variant.did, |this| this.encode_enum_variant_info(enum_did, i, vis));
+            self.record(variant.did,
+                        ItemContentBuilder::encode_enum_variant_info,
+                        (enum_did, i, vis));
         }
     }
 }
 
 impl<'a, 'tcx, 'encoder> ItemContentBuilder<'a, 'tcx, 'encoder> {
     fn encode_enum_variant_info(&mut self,
-                                enum_did: DefId, // enum def-id
-                                index: usize, // variant index
-                                vis: &hir::Visibility) {
+                                (enum_did, index, vis):
+                                (DefId, usize, &hir::Visibility)) {
         let ecx = self.ecx;
         let def = ecx.tcx.lookup_adt_def(enum_did);
         let variant = &def.variants[index];
@@ -293,11 +294,8 @@ fn encode_reexports(ecx: &EncodeContext,
 
 impl<'a, 'tcx, 'encoder> ItemContentBuilder<'a, 'tcx, 'encoder> {
     fn encode_info_for_mod(&mut self,
-                           md: &hir::Mod,
-                           attrs: &[ast::Attribute],
-                           id: NodeId,
-                           name: Name,
-                           vis: &hir::Visibility) {
+                           (md, attrs, id, name, vis):
+                           (&hir::Mod, &[ast::Attribute], NodeId, Name, &hir::Visibility)) {
         let ecx = self.ecx();
 
         encode_def_id_and_key(ecx, self.rbml_w, ecx.tcx.map.local_def_id(id));
@@ -418,9 +416,9 @@ fn encode_fields(&mut self,
         let def = self.ecx.tcx.lookup_adt_def(adt_def_id);
         for (variant_index, variant) in def.variants.iter().enumerate() {
             for (field_index, field) in variant.fields.iter().enumerate() {
-                self.record(field.did, |this| this.encode_field(adt_def_id,
-                                                                variant_index,
-                                                                field_index));
+                self.record(field.did,
+                            ItemContentBuilder::encode_field,
+                            (adt_def_id, variant_index, field_index));
             }
         }
     }
@@ -428,9 +426,8 @@ fn encode_fields(&mut self,
 
 impl<'a, 'tcx, 'encoder> ItemContentBuilder<'a, 'tcx, 'encoder> {
     fn encode_field(&mut self,
-                    adt_def_id: DefId,
-                    variant_index: usize,
-                    field_index: usize) {
+                    (adt_def_id, variant_index, field_index):
+                    (DefId, usize, usize)) {
         let ecx = self.ecx();
         let def = ecx.tcx.lookup_adt_def(adt_def_id);
         let variant = &def.variants[variant_index];
@@ -454,9 +451,8 @@ fn encode_field(&mut self,
 
 impl<'a, 'tcx, 'encoder> ItemContentBuilder<'a, 'tcx, 'encoder> {
     fn encode_struct_ctor(&mut self,
-                          struct_def_id: DefId,
-                          struct_node_id: ast::NodeId,
-                          ctor_node_id: ast::NodeId) {
+                          (struct_def_id, struct_node_id, ctor_node_id):
+                          (DefId, ast::NodeId, ast::NodeId)) {
         let ecx = self.ecx();
         let def = ecx.tcx.lookup_adt_def(struct_def_id);
         let variant = def.struct_variant();
@@ -532,9 +528,8 @@ fn encode_method_ty_fields(&mut self,
 
 impl<'a, 'tcx, 'encoder> ItemContentBuilder<'a, 'tcx, 'encoder> {
     fn encode_info_for_trait_item(&mut self,
-                                  trait_def_id: DefId,
-                                  item_def_id: DefId,
-                                  trait_item: &hir::TraitItem) {
+                                  (trait_def_id, item_def_id, trait_item):
+                                  (DefId, DefId, &hir::TraitItem)) {
         let ecx = self.ecx;
         let tcx = ecx.tcx;
 
@@ -635,9 +630,8 @@ fn encode_info_for_trait_item(&mut self,
     }
 
     fn encode_info_for_impl_item(&mut self,
-                                 impl_id: NodeId,
-                                 impl_item_def_id: DefId,
-                                 ast_item: Option<&hir::ImplItem>) {
+                                 (impl_id, impl_item_def_id, ast_item):
+                                 (NodeId, DefId, Option<&hir::ImplItem>)) {
         match self.ecx.tcx.impl_or_trait_item(impl_item_def_id) {
             ty::ConstTraitItem(ref associated_const) => {
                 self.encode_info_for_associated_const(&associated_const,
@@ -882,8 +876,7 @@ fn encode_xrefs<'a, 'tcx>(ecx: &EncodeContext<'a, 'tcx>,
 
 impl<'a, 'tcx, 'encoder> ItemContentBuilder<'a, 'tcx, 'encoder> {
     fn encode_info_for_item(&mut self,
-                            def_id: DefId,
-                            item: &hir::Item) {
+                            (def_id, item): (DefId, &hir::Item)) {
         let ecx = self.ecx();
         let tcx = ecx.tcx;
 
@@ -943,11 +936,7 @@ fn encode_info_for_item(&mut self,
                 self.encode_method_argument_names(&decl);
             }
             hir::ItemMod(ref m) => {
-                self.encode_info_for_mod(m,
-                                         &item.attrs,
-                                         item.id,
-                                         item.name,
-                                         &item.vis);
+                self.encode_info_for_mod((m, &item.attrs, item.id, item.name, &item.vis));
             }
             hir::ItemForeignMod(ref fm) => {
                 encode_def_id_and_key(ecx, self.rbml_w, def_id);
@@ -1210,9 +1199,9 @@ fn encode_addl_struct_info(&mut self,
                 // there is a value for structs like `struct
                 // Foo()` and `struct Foo`
                 let ctor_def_id = ecx.tcx.map.local_def_id(struct_node_id);
-                self.record(ctor_def_id, |this| this.encode_struct_ctor(def_id,
-                                                                        item.id,
-                                                                        struct_node_id));
+                self.record(ctor_def_id,
+                            ItemContentBuilder::encode_struct_ctor,
+                            (def_id, item.id, struct_node_id));
             }
         }
     }
@@ -1238,9 +1227,9 @@ fn encode_addl_impl_info(&mut self,
             };
 
             let trait_item_def_id = trait_item_def_id.def_id();
-            self.record(trait_item_def_id, |this| {
-                this.encode_info_for_impl_item(impl_id, trait_item_def_id, ast_item)
-            });
+            self.record(trait_item_def_id,
+                        ItemContentBuilder::encode_info_for_impl_item,
+                        (impl_id, trait_item_def_id, ast_item));
         }
     }
 
@@ -1253,17 +1242,16 @@ fn encode_addl_trait_info(&mut self,
         for (item_def_id, trait_item) in r.iter().zip(trait_items) {
             let item_def_id = item_def_id.def_id();
             assert!(item_def_id.is_local());
-            self.record(item_def_id, |this| {
-                this.encode_info_for_trait_item(def_id, item_def_id, trait_item)
-            });
+            self.record(item_def_id,
+                        ItemContentBuilder::encode_info_for_trait_item,
+                        (def_id, item_def_id, trait_item));
         }
     }
 }
 
 impl<'a, 'tcx, 'encoder> ItemContentBuilder<'a, 'tcx, 'encoder> {
     fn encode_info_for_foreign_item(&mut self,
-                                    def_id: DefId,
-                                    nitem: &hir::ForeignItem) {
+                                    (def_id, nitem): (DefId, &hir::ForeignItem)) {
         let ecx = self.ecx();
 
         debug!("writing foreign item {}", ecx.tcx.node_path_str(nitem.id));
@@ -1323,14 +1311,18 @@ fn visit_item(&mut self, item: &'tcx hir::Item) {
         let def_id = self.index.ecx.tcx.map.local_def_id(item.id);
         match item.node {
             hir::ItemExternCrate(_) | hir::ItemUse(_) => (), // ignore these
-            _ => self.index.record(def_id, |index| index.encode_info_for_item(def_id, item)),
+            _ => self.index.record(def_id,
+                                   ItemContentBuilder::encode_info_for_item,
+                                   (def_id, item)),
         }
         self.index.encode_addl_info_for_item(item);
     }
     fn visit_foreign_item(&mut self, ni: &'tcx hir::ForeignItem) {
         intravisit::walk_foreign_item(self, ni);
         let def_id = self.index.ecx.tcx.map.local_def_id(ni.id);
-        self.index.record(def_id, |index| index.encode_info_for_foreign_item(def_id, ni));
+        self.index.record(def_id,
+                          ItemContentBuilder::encode_info_for_foreign_item,
+                          (def_id, ni));
     }
     fn visit_ty(&mut self, ty: &'tcx hir::Ty) {
         intravisit::walk_ty(self, ty);
@@ -1343,11 +1335,9 @@ fn encode_info_for_ty(&mut self, ty: &hir::Ty) {
         let ecx = self.ecx();
         if let hir::TyImplTrait(_) = ty.node {
             let def_id = ecx.tcx.map.local_def_id(ty.id);
-            self.record(def_id, |this| {
-                encode_def_id_and_key(ecx, this.rbml_w, def_id);
-                encode_family(this.rbml_w, 'y');
-                this.encode_bounds_and_type_for_item(ty.id);
-            });
+            self.record(def_id,
+                        ItemContentBuilder::encode_info_for_anon_ty,
+                        (def_id, ty.id));
         }
     }
 
@@ -1357,8 +1347,9 @@ fn encode_info_for_expr(&mut self, expr: &hir::Expr) {
         match expr.node {
             hir::ExprClosure(..) => {
                 let def_id = ecx.tcx.map.local_def_id(expr.id);
-
-                self.record(def_id, |this| this.encode_info_for_closure(def_id, expr.id));
+                self.record(def_id,
+                            ItemContentBuilder::encode_info_for_closure,
+                            (def_id, expr.id));
             }
             _ => { }
         }
@@ -1366,7 +1357,14 @@ fn encode_info_for_expr(&mut self, expr: &hir::Expr) {
 }
 
 impl<'a, 'tcx, 'encoder> ItemContentBuilder<'a, 'tcx, 'encoder> {
-    fn encode_info_for_closure(&mut self, def_id: DefId, expr_id: NodeId) {
+    fn encode_info_for_anon_ty(&mut self, (def_id, ty_id): (DefId, NodeId)) {
+        let ecx = self.ecx;
+        encode_def_id_and_key(ecx, self.rbml_w, def_id);
+        encode_family(self.rbml_w, 'y');
+        self.encode_bounds_and_type_for_item(ty_id);
+    }
+
+    fn encode_info_for_closure(&mut self, (def_id, expr_id): (DefId, NodeId)) {
         let ecx = self.ecx;
         encode_def_id_and_key(ecx, self.rbml_w, def_id);
         encode_name(self.rbml_w, syntax::parse::token::intern("<closure>"));
@@ -1395,13 +1393,13 @@ fn encode_info_for_items<'a, 'tcx>(ecx: &EncodeContext<'a, 'tcx>,
 
     let fields = {
         let mut index = IndexBuilder::new(ecx, rbml_w);
-        index.record(DefId::local(CRATE_DEF_INDEX), |this| {
-            this.encode_info_for_mod(&krate.module,
-                                     &[],
-                                     CRATE_NODE_ID,
-                                     syntax::parse::token::intern(&ecx.link_meta.crate_name),
-                                     &hir::Public);
-        });
+        index.record(DefId::local(CRATE_DEF_INDEX),
+                     ItemContentBuilder::encode_info_for_mod,
+                     (&krate.module,
+                      &[],
+                      CRATE_NODE_ID,
+                      syntax::parse::token::intern(&ecx.link_meta.crate_name),
+                      &hir::Public));
         krate.visit_all_items(&mut EncodeVisitor {
             index: &mut index,
         });
index b591e0a92688bb52539ca5b6952202856ec07980..a971c618a2120e85bb1714e56ec615e6940487bc 100644 (file)
@@ -57,14 +57,16 @@ pub fn new(ecx: &'a EncodeContext<'a, 'tcx>,
     ///
     /// Returns a dep-graph task that you should keep live as long as
     /// the data for this item is being emitted.
-    pub fn record<OP>(&mut self, id: DefId, op: OP)
-        where OP: FnOnce(&mut ItemContentBuilder<'a, 'tcx, 'encoder>)
+    pub fn record<DATA>(&mut self,
+                        id: DefId,
+                        op: fn(&mut ItemContentBuilder<'a, 'tcx, 'encoder>, DATA),
+                        data: DATA)
     {
         let position = self.rbml_w.mark_stable_position();
         self.items.record(id, position);
         let _task = self.ecx.tcx.dep_graph.in_task(DepNode::MetaData(id));
         self.rbml_w.start_tag(tag_items_data_item).unwrap();
-        op(self);
+        op(self, data);
         self.rbml_w.end_tag().unwrap();
     }