@@ -4813,11 +4813,42 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
4813
4813
}
4814
4814
( None , None ) => ( 0 , false )
4815
4815
} ;
4816
+ // FIXME(varkor): Separating out the parameters is messy.
4817
+ let mut lifetimes_type_seg = vec ! [ ] ;
4818
+ let mut types_type_seg = vec ! [ ] ;
4819
+ let mut infer_types_type_seg = true ;
4820
+ if let Some ( ( seg, _) ) = type_segment {
4821
+ if let Some ( ref data) = seg. args {
4822
+ for arg in & data. args {
4823
+ match arg {
4824
+ GenericArg :: Lifetime ( lt) => lifetimes_type_seg. push ( lt) ,
4825
+ GenericArg :: Type ( ty) => types_type_seg. push ( ty) ,
4826
+ }
4827
+ }
4828
+ }
4829
+ infer_types_type_seg = seg. infer_types ;
4830
+ }
4831
+
4832
+ let mut lifetimes_fn_seg = vec ! [ ] ;
4833
+ let mut types_fn_seg = vec ! [ ] ;
4834
+ let mut infer_types_fn_seg = true ;
4835
+ if let Some ( ( seg, _) ) = fn_segment {
4836
+ if let Some ( ref data) = seg. args {
4837
+ for arg in & data. args {
4838
+ match arg {
4839
+ GenericArg :: Lifetime ( lt) => lifetimes_fn_seg. push ( lt) ,
4840
+ GenericArg :: Type ( ty) => types_fn_seg. push ( ty) ,
4841
+ }
4842
+ }
4843
+ }
4844
+ infer_types_fn_seg = seg. infer_types ;
4845
+ }
4846
+
4816
4847
let substs = Substs :: for_item ( self . tcx , def. def_id ( ) , |param, substs| {
4817
4848
let mut i = param. index as usize ;
4818
4849
4819
- let segment = if i < fn_start {
4820
- if let GenericParamDefKind :: Type { .. } = param. kind {
4850
+ let ( segment, lifetimes , types , infer_types ) = if i < fn_start {
4851
+ if let GenericParamDefKind :: Type { .. } = param. kind {
4821
4852
// Handle Self first, so we can adjust the index to match the AST.
4822
4853
if has_self && i == 0 {
4823
4854
return opt_self_ty. map ( |ty| ty. into ( ) ) . unwrap_or_else ( || {
@@ -4826,39 +4857,21 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
4826
4857
}
4827
4858
}
4828
4859
i -= has_self as usize ;
4829
- type_segment
4860
+ ( type_segment, & lifetimes_type_seg , & types_type_seg , infer_types_type_seg )
4830
4861
} else {
4831
4862
i -= fn_start;
4832
- fn_segment
4863
+ ( fn_segment, & lifetimes_fn_seg , & types_fn_seg , infer_types_fn_seg )
4833
4864
} ;
4834
4865
4835
4866
match param. kind {
4836
4867
GenericParamDefKind :: Lifetime => {
4837
- let lifetimes = segment. map_or ( vec ! [ ] , |( s, _) | {
4838
- s. args . as_ref ( ) . map_or ( vec ! [ ] , |data| {
4839
- data. args . iter ( ) . filter_map ( |arg| match arg {
4840
- GenericArg :: Lifetime ( lt) => Some ( lt) ,
4841
- _ => None ,
4842
- } ) . collect ( )
4843
- } )
4844
- } ) ;
4845
-
4846
4868
if let Some ( lifetime) = lifetimes. get ( i) {
4847
4869
AstConv :: ast_region_to_region ( self , lifetime, Some ( param) ) . into ( )
4848
4870
} else {
4849
4871
self . re_infer ( span, Some ( param) ) . unwrap ( ) . into ( )
4850
4872
}
4851
4873
}
4852
- GenericParamDefKind :: Type { ..} => {
4853
- let ( types, infer_types) = segment. map_or ( ( vec ! [ ] , true ) , |( s, _) | {
4854
- ( s. args . as_ref ( ) . map_or ( vec ! [ ] , |data| {
4855
- data. args . iter ( ) . filter_map ( |arg| match arg {
4856
- GenericArg :: Type ( ty) => Some ( ty) ,
4857
- _ => None ,
4858
- } ) . collect ( )
4859
- } ) , s. infer_types )
4860
- } ) ;
4861
-
4874
+ GenericParamDefKind :: Type { .. } => {
4862
4875
// Skip over the lifetimes in the same segment.
4863
4876
if let Some ( ( _, generics) ) = segment {
4864
4877
i -= generics. own_counts ( ) . lifetimes ;
0 commit comments