1
1
use proc_macro2:: { Span , TokenStream } ;
2
2
use quote:: quote;
3
+ use syn:: Generics ;
3
4
4
5
use crate :: {
5
6
any:: models:: { AnyGuard , AnyInnerType } ,
7
+ common:: gen:: { add_bound_to_all_type_params, add_param, strip_trait_bounds_on_generics} ,
6
8
common:: models:: TypeName ,
7
9
} ;
8
10
9
11
pub fn gen_impl_trait_arbitrary (
10
12
type_name : & TypeName ,
13
+ generics : & Generics ,
11
14
inner_type : & AnyInnerType ,
12
15
guard : & AnyGuard ,
13
16
) -> Result < TokenStream , syn:: Error > {
@@ -22,18 +25,24 @@ pub fn gen_impl_trait_arbitrary(
22
25
23
26
// Generate implementation of `Arbitrary` trait, assuming that inner type implements Arbitrary
24
27
// too.
28
+ let generics_without_bounds = strip_trait_bounds_on_generics ( generics) ;
29
+ let generics_with_lifetime = add_param ( & generics_without_bounds, quote ! ( ' nu_arb) ) ;
30
+ let generics_with_bounds = add_bound_to_all_type_params (
31
+ & generics_with_lifetime,
32
+ quote ! ( :: arbitrary:: Arbitrary <' nu_arb>) ,
33
+ ) ;
25
34
Ok ( quote ! (
26
- impl :: arbitrary:: Arbitrary <' _ > for #type_name {
27
- fn arbitrary( u: & mut :: arbitrary:: Unstructured <' _ >) -> :: arbitrary:: Result <Self > {
35
+ impl #generics_with_bounds :: arbitrary:: Arbitrary <' nu_arb > for #type_name #generics_without_bounds {
36
+ fn arbitrary( u: & mut :: arbitrary:: Unstructured <' nu_arb >) -> :: arbitrary:: Result <Self > {
28
37
let inner_value: #inner_type = u. arbitrary( ) ?;
29
38
Ok ( #type_name:: new( inner_value) )
30
39
}
31
- }
32
40
33
- #[ inline]
34
- fn size_hint( _depth: usize ) -> ( usize , Option <usize >) {
35
- let n = :: core:: mem:: size_of:: <#inner_type>( ) ;
36
- ( n, Some ( n) )
41
+ #[ inline]
42
+ fn size_hint( _depth: usize ) -> ( usize , Option <usize >) {
43
+ let n = :: core:: mem:: size_of:: <#inner_type>( ) ;
44
+ ( n, Some ( n) )
45
+ }
37
46
}
38
47
) )
39
48
}
0 commit comments