@@ -10,18 +10,38 @@ use rustc_span::{Ident, Span};
1010
1111use crate :: { LoweringContext , ResolverAstLoweringExt } ;
1212
13- pub ( super ) enum DelegationGenerics < T > {
13+ #[ derive( Clone , Copy ) ]
14+ pub ( super ) enum DelegationGenericsKind {
1415 /// User-specified args are present: `reuse foo::<String>;`.
1516 UserSpecified ,
1617 /// The default case when no user-specified args are present: `reuse Trait::foo;`.
17- Default ( T ) ,
18+ Default ,
1819 /// In free-to-trait reuse, when user specified args for trait `reuse Trait::<i32>::foo;`
1920 /// in this case we need to both generate `Self` and process user args.
20- SelfAndUserSpecified ( T ) ,
21+ SelfAndUserSpecified ,
2122 /// In delegations from trait impl to other entities like free functions or trait functions,
2223 /// we want to generate a function whose generics matches generics of signature function
2324 /// in trait.
24- TraitImpl ( T , bool /* Has user-specified args */ ) ,
25+ TraitImpl ( bool /* Has user-specified args */ ) ,
26+ }
27+
28+ pub ( super ) struct DelegationGenerics < T > {
29+ generics : T ,
30+ kind : DelegationGenericsKind ,
31+ }
32+
33+ impl < ' hir > DelegationGenerics < & ' hir [ ty:: GenericParamDef ] > {
34+ fn default ( generics : & ' hir [ ty:: GenericParamDef ] ) -> Self {
35+ DelegationGenerics { generics, kind : DelegationGenericsKind :: Default }
36+ }
37+
38+ fn user_specified ( generics : & ' hir [ ty:: GenericParamDef ] ) -> Self {
39+ DelegationGenerics { generics, kind : DelegationGenericsKind :: UserSpecified }
40+ }
41+
42+ fn trait_impl ( generics : & ' hir [ ty:: GenericParamDef ] , user_specified : bool ) -> Self {
43+ DelegationGenerics { generics, kind : DelegationGenericsKind :: TraitImpl ( user_specified) }
44+ }
2545}
2646
2747/// Used for storing either ty generics or their uplifted HIR version. First we obtain
@@ -54,20 +74,19 @@ pub(super) struct GenericArgsPropagationDetails {
5474 pub ( super ) use_args_in_sig_inheritance : bool ,
5575}
5676
57- impl < T > DelegationGenerics < T > {
58- fn args_propagation_details ( & self ) -> GenericArgsPropagationDetails {
77+ impl DelegationGenericsKind {
78+ fn args_propagation_details ( self ) -> GenericArgsPropagationDetails {
5979 match self {
60- DelegationGenerics :: UserSpecified | DelegationGenerics :: SelfAndUserSpecified { .. } => {
61- GenericArgsPropagationDetails {
62- should_propagate : false ,
63- use_args_in_sig_inheritance : true ,
64- }
65- }
66- DelegationGenerics :: TraitImpl ( _, user_specified) => GenericArgsPropagationDetails {
67- should_propagate : !* user_specified,
80+ DelegationGenericsKind :: UserSpecified
81+ | DelegationGenericsKind :: SelfAndUserSpecified => GenericArgsPropagationDetails {
82+ should_propagate : false ,
83+ use_args_in_sig_inheritance : true ,
84+ } ,
85+ DelegationGenericsKind :: TraitImpl ( user_specified) => GenericArgsPropagationDetails {
86+ should_propagate : !user_specified,
6887 use_args_in_sig_inheritance : false ,
6988 } ,
70- DelegationGenerics :: Default ( _ ) => GenericArgsPropagationDetails {
89+ DelegationGenericsKind :: Default => GenericArgsPropagationDetails {
7190 should_propagate : true ,
7291 use_args_in_sig_inheritance : false ,
7392 } ,
@@ -81,25 +100,9 @@ impl<'hir> HirOrTyGenerics<'hir> {
81100 ctx : & mut LoweringContext < ' _ , ' hir , impl ResolverAstLoweringExt < ' hir > > ,
82101 span : Span ,
83102 ) -> & mut HirOrTyGenerics < ' hir > {
84- if let HirOrTyGenerics :: Ty ( params) = self {
85- let mut uplift_params = |generics : & ' hir [ ty:: GenericParamDef ] | {
86- ctx. uplift_delegation_generic_params ( span, generics)
87- } ;
88-
89- let hir_generics = match params {
90- DelegationGenerics :: UserSpecified => DelegationGenerics :: UserSpecified ,
91- DelegationGenerics :: Default ( params) => {
92- DelegationGenerics :: Default ( uplift_params ( params) )
93- }
94- DelegationGenerics :: SelfAndUserSpecified ( params) => {
95- DelegationGenerics :: SelfAndUserSpecified ( uplift_params ( params) )
96- }
97- DelegationGenerics :: TraitImpl ( params, user_specified) => {
98- DelegationGenerics :: TraitImpl ( uplift_params ( params) , * user_specified)
99- }
100- } ;
101-
102- * self = HirOrTyGenerics :: Hir ( hir_generics) ;
103+ if let HirOrTyGenerics :: Ty ( ty) = self {
104+ let params = ctx. uplift_delegation_generic_params ( span, ty. generics ) ;
105+ * self = HirOrTyGenerics :: Hir ( DelegationGenerics { generics : params, kind : ty. kind } ) ;
103106 }
104107
105108 self
@@ -108,12 +111,7 @@ impl<'hir> HirOrTyGenerics<'hir> {
108111 fn hir_generics_or_empty ( & self ) -> & ' hir hir:: Generics < ' hir > {
109112 match self {
110113 HirOrTyGenerics :: Ty ( _) => hir:: Generics :: empty ( ) ,
111- HirOrTyGenerics :: Hir ( hir_generics) => match hir_generics {
112- DelegationGenerics :: UserSpecified => hir:: Generics :: empty ( ) ,
113- DelegationGenerics :: Default ( generics)
114- | DelegationGenerics :: SelfAndUserSpecified ( generics)
115- | DelegationGenerics :: TraitImpl ( generics, _) => generics,
116- } ,
114+ HirOrTyGenerics :: Hir ( hir) => hir. generics ,
117115 }
118116 }
119117
@@ -127,21 +125,16 @@ impl<'hir> HirOrTyGenerics<'hir> {
127125 HirOrTyGenerics :: Ty ( _) => {
128126 bug ! ( "Attempting to get generic args before uplifting to HIR" )
129127 }
130- HirOrTyGenerics :: Hir ( hir_generics) => match hir_generics {
131- DelegationGenerics :: UserSpecified => hir:: GenericArgs :: NONE ,
132- DelegationGenerics :: Default ( generics)
133- | DelegationGenerics :: SelfAndUserSpecified ( generics)
134- | DelegationGenerics :: TraitImpl ( generics, _) => {
135- ctx. create_generics_args_from_params ( generics. params , add_lifetimes, span)
136- }
137- } ,
128+ HirOrTyGenerics :: Hir ( hir) => {
129+ ctx. create_generics_args_from_params ( hir. generics . params , add_lifetimes, span)
130+ }
138131 }
139132 }
140133
141134 pub ( super ) fn args_propagation_details ( & self ) -> GenericArgsPropagationDetails {
142135 match self {
143- HirOrTyGenerics :: Ty ( ty_generics ) => ty_generics . args_propagation_details ( ) ,
144- HirOrTyGenerics :: Hir ( hir_generics ) => hir_generics . args_propagation_details ( ) ,
136+ HirOrTyGenerics :: Ty ( ty ) => ty . kind . args_propagation_details ( ) ,
137+ HirOrTyGenerics :: Hir ( hir ) => hir . kind . args_propagation_details ( ) ,
145138 }
146139 }
147140}
@@ -231,9 +224,10 @@ impl<'hir, R: ResolverAstLoweringExt<'hir>> LoweringContext<'_, 'hir, R> {
231224 if matches ! ( delegation_parent_kind, DefKind :: Impl { of_trait: true } ) {
232225 // Considering parent generics, during signature inheritance
233226 // we will take those args that are in trait impl header trait ref.
234- let parent = GenericsGenerationResult :: new ( DelegationGenerics :: TraitImpl ( & [ ] , true ) ) ;
227+ let parent = DelegationGenerics :: trait_impl ( & [ ] , true ) ;
228+ let parent = GenericsGenerationResult :: new ( parent) ;
235229
236- let child = DelegationGenerics :: TraitImpl ( sig_params, child_user_specified) ;
230+ let child = DelegationGenerics :: trait_impl ( sig_params, child_user_specified) ;
237231 let child = GenericsGenerationResult :: new ( child) ;
238232
239233 return GenericsGenerationResults { parent, child } ;
@@ -257,22 +251,28 @@ impl<'hir, R: ResolverAstLoweringExt<'hir>> LoweringContext<'_, 'hir, R> {
257251 if segments[ len - 2 ] . args . is_some ( ) {
258252 if generate_self {
259253 // Take only first Self parameter, it is trait so Self must be present.
260- DelegationGenerics :: SelfAndUserSpecified ( & sig_parent_params[ ..1 ] )
254+ DelegationGenerics {
255+ kind : DelegationGenericsKind :: SelfAndUserSpecified ,
256+ generics : & sig_parent_params[ ..1 ] ,
257+ }
261258 } else {
262- DelegationGenerics :: UserSpecified
259+ DelegationGenerics :: user_specified ( & [ ] )
263260 }
264261 } else {
265262 let skip_self = usize:: from ( !generate_self) ;
266- DelegationGenerics :: Default ( & sig_parent_params[ skip_self..] )
263+ DelegationGenerics :: default ( & sig_parent_params[ skip_self..] )
267264 }
268265 } else {
269- DelegationGenerics :: < & ' hir [ ty :: GenericParamDef ] > :: Default ( & [ ] )
266+ DelegationGenerics :: default ( & [ ] )
270267 } ;
271268
272269 let child_generics = if child_user_specified {
273- DelegationGenerics :: UserSpecified
270+ let synth_params_index =
271+ sig_params. iter ( ) . position ( |p| p. kind . is_synthetic ( ) ) . unwrap_or ( sig_params. len ( ) ) ;
272+
273+ DelegationGenerics :: user_specified ( & sig_params[ synth_params_index..] )
274274 } else {
275- DelegationGenerics :: Default ( sig_params)
275+ DelegationGenerics :: default ( sig_params)
276276 } ;
277277
278278 GenericsGenerationResults {
0 commit comments