@@ -20,7 +20,7 @@ impl<'a> GenericSettersCtx<'a> {
2020 for ( index, param) in generics. iter ( ) . enumerate ( ) {
2121 match param {
2222 syn:: GenericParam :: Type ( type_param) => {
23- methods. push ( self . generic_setter_method ( index, & type_param. ident ) ) ;
23+ methods. push ( self . generic_setter_method ( index, type_param) ) ;
2424 }
2525 syn:: GenericParam :: Const ( const_param) => {
2626 bail ! (
@@ -40,11 +40,16 @@ impl<'a> GenericSettersCtx<'a> {
4040 } )
4141 }
4242
43- fn generic_setter_method ( & self , param_index : usize , param_ident : & syn:: Ident ) -> TokenStream {
43+ fn generic_setter_method (
44+ & self ,
45+ param_index : usize ,
46+ type_param : & syn:: TypeParam ,
47+ ) -> TokenStream {
4448 let builder_ident = & self . base . builder_type . ident ;
4549 let state_var = & self . base . state_var ;
4650 let where_clause = & self . base . generics . where_clause ;
4751
52+ let param_ident = & type_param. ident ;
4853 let method_name = self . method_name ( param_ident) ;
4954
5055 let vis = self
@@ -59,6 +64,15 @@ impl<'a> GenericSettersCtx<'a> {
5964 // Build the generic arguments for the output type, where the current parameter
6065 // is replaced with a new type variable
6166 let new_type_var = self . base . namespace . unique_ident ( param_ident. to_string ( ) ) ;
67+
68+ // Copy the bounds from the original type parameter to the new one
69+ let bounds = & type_param. bounds ;
70+ let new_type_param = if bounds. is_empty ( ) {
71+ quote ! ( #new_type_var)
72+ } else {
73+ quote ! ( #new_type_var: #bounds)
74+ } ;
75+
6276 let output_generic_args = self
6377 . base
6478 . generics
@@ -117,7 +131,7 @@ impl<'a> GenericSettersCtx<'a> {
117131 quote ! {
118132 #( #docs) *
119133 #[ inline( always) ]
120- #vis fn #method_name<#new_type_var >(
134+ #vis fn #method_name<#new_type_param >(
121135 self
122136 ) -> #builder_ident<#( #output_generic_args, ) * #state_var>
123137 #where_clause
@@ -204,6 +218,20 @@ fn type_uses_generic_param(ty: &syn::Type, param_ident: &syn::Ident) -> bool {
204218 return ;
205219 }
206220
221+ // For qualified paths like T::Assoc or <T as Trait>::Assoc,
222+ // check if the first segment (or qself) uses the generic parameter
223+
224+ if let Some ( qself) = & type_path. qself {
225+ // For <T as Trait>::Assoc syntax
226+ self . visit_type ( & qself. ty ) ;
227+ } else if let Some ( segment) = type_path. path . segments . first ( ) {
228+ // For T::Assoc syntax
229+ if segment. ident == * self . param_ident {
230+ self . found = true ;
231+ return ;
232+ }
233+ }
234+
207235 // Continue visiting the rest of the type path
208236 syn:: visit:: visit_type_path ( self , type_path) ;
209237 }
0 commit comments