about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorvarkor <github@varkor.com>2018-07-03 17:20:20 +0100
committervarkor <github@varkor.com>2018-08-19 20:02:32 +0100
commit35ddd46a2d679b471b7c30bc4eb97de03396e838 (patch)
treeaaadd5d66a32962b4007afa47e5beb5314772089 /src
parent84edc0a089d164ffc121d0566358718046c4a06d (diff)
downloadrust-35ddd46a2d679b471b7c30bc4eb97de03396e838.tar.gz
rust-35ddd46a2d679b471b7c30bc4eb97de03396e838.zip
Refactor confirm.rs
Diffstat (limited to 'src')
-rw-r--r--src/librustc_typeck/check/method/confirm.rs45
1 files changed, 18 insertions, 27 deletions
diff --git a/src/librustc_typeck/check/method/confirm.rs b/src/librustc_typeck/check/method/confirm.rs
index d43169baf5d..aa2147e9450 100644
--- a/src/librustc_typeck/check/method/confirm.rs
+++ b/src/librustc_typeck/check/method/confirm.rs
@@ -322,41 +322,32 @@ impl<'a, 'gcx, 'tcx> ConfirmContext<'a, 'gcx, 'tcx> {
         // Create subst for early-bound lifetime parameters, combining
         // parameters from the type and those from the method.
         assert_eq!(method_generics.parent_count, parent_substs.len());
-        let provided = &segment.args;
-        let own_counts = method_generics.own_counts();
-        // FIXME(varkor): Separating out the parameters is messy.
-        let lifetimes: Vec<_> = provided.iter().flat_map(|data| {
-                data.args.iter().filter_map(|arg| match arg {
-                GenericArg::Lifetime(ty) => Some(ty),
-                _ => None,
-            })
-        }).collect();
-        let types: Vec<_> = provided.iter().flat_map(|data| {
-                data.args.iter().filter_map(|arg| match arg {
-                GenericArg::Type(ty) => Some(ty),
-                _ => None,
-            })
-        }).collect();
+
         Substs::for_item(self.tcx, pick.item.def_id, |param, _| {
             let i = param.index as usize;
             if i < parent_substs.len() {
                 parent_substs[i]
             } else {
-                match param.kind {
-                    GenericParamDefKind::Lifetime => {
-                        let idx = i - parent_substs.len();
-                        if let Some(lifetime) = lifetimes.get(idx) {
-                            return AstConv::ast_region_to_region(
-                                self.fcx, lifetime, Some(param)).into();
-                        }
-                    }
-                    GenericParamDefKind::Type { .. } => {
-                        let idx = i - parent_substs.len() - own_counts.lifetimes;
-                        if let Some(ast_ty) = types.get(idx) {
-                            return self.to_ty(ast_ty).into();
+                let param_idx = i - parent_substs.len();
+
+                if let Some(ref data) = segment.args {
+                    if let Some(arg) = data.args.get(param_idx) {
+                        match param.kind {
+                            GenericParamDefKind::Lifetime => match arg {
+                                GenericArg::Lifetime(lt) => {
+                                    return AstConv::ast_region_to_region(
+                                        self.fcx, lt, Some(param)).into();
+                                }
+                                _ => {}
+                            }
+                            GenericParamDefKind::Type { .. } => match arg {
+                                GenericArg::Type(ty) => return self.to_ty(ty).into(),
+                                _ => {}
+                            }
                         }
                     }
                 }
+
                 self.var_for_def(self.span, param)
             }
         })