about summary refs log tree commit diff
diff options
context:
space:
mode:
authorOliver Schneider <github35764891676564198441@oli-obk.de>2018-06-19 10:09:00 +0200
committerOliver Schneider <github35764891676564198441@oli-obk.de>2018-06-30 11:45:11 +0200
commit6641233b34fd910864131febb22f71777a7add6a (patch)
tree82961eaa88c62e04e5dbc7cbf429e051e821e74a
parent82091d421a06db8e37a20bbbfbc017416fea2a0c (diff)
downloadrust-6641233b34fd910864131febb22f71777a7add6a.tar.gz
rust-6641233b34fd910864131febb22f71777a7add6a.zip
Reduce repetition around `lower_method_sig`
-rw-r--r--src/librustc/hir/lowering.rs67
1 files changed, 29 insertions, 38 deletions
diff --git a/src/librustc/hir/lowering.rs b/src/librustc/hir/lowering.rs
index c4d8100a1ca..30537f41178 100644
--- a/src/librustc/hir/lowering.rs
+++ b/src/librustc/hir/lowering.rs
@@ -2905,17 +2905,14 @@ impl<'a> LoweringContext<'a> {
             ),
             TraitItemKind::Method(ref sig, None) => {
                 let names = self.lower_fn_args_to_names(&sig.decl);
-                self.add_in_band_defs(
+                let (generics, sig) = self.lower_method_sig(
                     &i.generics,
+                    sig,
                     trait_item_def_id,
-                    AnonymousLifetimeMode::PassThrough,
-                    |this| {
-                        hir::TraitItemKind::Method(
-                            this.lower_method_sig(sig, trait_item_def_id, false, None),
-                            hir::TraitMethod::Required(names),
-                        )
-                    },
-                )
+                    false,
+                    None,
+                );
+                (generics, hir::TraitItemKind::Method(sig, hir::TraitMethod::Required(names)))
             }
             TraitItemKind::Method(ref sig, Some(ref body)) => {
                 let body_id = self.lower_body(Some(&sig.decl), |this| {
@@ -2923,17 +2920,15 @@ impl<'a> LoweringContext<'a> {
                     this.expr_block(body, ThinVec::new())
                 });
 
-                self.add_in_band_defs(
+                let (generics, sig) = self.lower_method_sig(
                     &i.generics,
+                    sig,
                     trait_item_def_id,
-                    AnonymousLifetimeMode::PassThrough,
-                    |this| {
-                        hir::TraitItemKind::Method(
-                            this.lower_method_sig(sig, trait_item_def_id, false, None),
-                            hir::TraitMethod::Provided(body_id),
-                        )
-                    },
-                )
+                    false,
+                    None,
+                );
+
+                (generics, hir::TraitItemKind::Method(sig, hir::TraitMethod::Provided(body_id)))
             }
             TraitItemKind::Type(ref bounds, ref default) => (
                 self.lower_generics(&i.generics, ImplTraitContext::Disallowed),
@@ -3001,23 +2996,14 @@ impl<'a> LoweringContext<'a> {
             ImplItemKind::Method(ref sig, ref body) => {
                 let body_id = self.lower_async_body(&sig.decl, sig.header.asyncness, body);
                 let impl_trait_return_allow = !self.is_in_trait_impl;
-
-                self.add_in_band_defs(
+                let (generics, sig) = self.lower_method_sig(
                     &i.generics,
+                    sig,
                     impl_item_def_id,
-                    AnonymousLifetimeMode::PassThrough,
-                    |this| {
-                        hir::ImplItemKind::Method(
-                            this.lower_method_sig(
-                                sig,
-                                impl_item_def_id,
-                                impl_trait_return_allow,
-                                sig.header.asyncness.opt_return_id(),
-                            ),
-                            body_id,
-                        )
-                    },
-                )
+                    impl_trait_return_allow,
+                    sig.header.asyncness.opt_return_id(),
+                );
+                (generics, hir::ImplItemKind::Method(sig, body_id))
             }
             ImplItemKind::Type(ref ty) => (
                 self.lower_generics(&i.generics, ImplTraitContext::Disallowed),
@@ -3231,15 +3217,20 @@ impl<'a> LoweringContext<'a> {
 
     fn lower_method_sig(
         &mut self,
+        generics: &Generics,
         sig: &MethodSig,
         fn_def_id: DefId,
         impl_trait_return_allow: bool,
         is_async: Option<NodeId>,
-    ) -> hir::MethodSig {
-        hir::MethodSig {
-            header: self.lower_fn_header(sig.header),
-            decl: self.lower_fn_decl(&sig.decl, Some(fn_def_id), impl_trait_return_allow, is_async),
-        }
+    ) -> (hir::Generics, hir::MethodSig) {
+        let header = self.lower_fn_header(sig.header);
+        let (generics, decl) = self.add_in_band_defs(
+            generics,
+            fn_def_id,
+            AnonymousLifetimeMode::PassThrough,
+            |cx| cx.lower_fn_decl(&sig.decl, Some(fn_def_id), impl_trait_return_allow, is_async),
+        );
+        (generics, hir::MethodSig { header, decl })
     }
 
     fn lower_is_auto(&mut self, a: IsAuto) -> hir::IsAuto {