@@ -14,8 +14,8 @@ use syn::{
14
14
punctuated:: Punctuated ,
15
15
spanned:: Spanned ,
16
16
token:: Comma ,
17
- DeriveInput , Field , GenericParam , Ident , Index , LitInt , Meta , MetaList , NestedMeta , Result ,
18
- Token , TypeParam ,
17
+ ConstParam , DeriveInput , Field , GenericParam , Ident , Index , LitInt , Meta , MetaList , NestedMeta ,
18
+ Result , Token , TypeParam ,
19
19
} ;
20
20
21
21
struct AllTuples {
@@ -416,7 +416,7 @@ pub fn derive_system_param(input: TokenStream) -> TokenStream {
416
416
let lifetimeless_generics: Vec < _ > = generics
417
417
. params
418
418
. iter ( )
419
- . filter ( |g| matches ! ( g, GenericParam :: Type ( _) ) )
419
+ . filter ( |g| ! matches ! ( g, GenericParam :: Lifetime ( _) ) )
420
420
. collect ( ) ;
421
421
422
422
let mut punctuated_generics = Punctuated :: < _ , Token ! [ , ] > :: new ( ) ;
@@ -425,12 +425,32 @@ pub fn derive_system_param(input: TokenStream) -> TokenStream {
425
425
default : None ,
426
426
..g. clone ( )
427
427
} ) ,
428
+ GenericParam :: Const ( g) => GenericParam :: Const ( ConstParam {
429
+ default : None ,
430
+ ..g. clone ( )
431
+ } ) ,
428
432
_ => unreachable ! ( ) ,
429
433
} ) ) ;
430
434
435
+ let mut punctuated_generics_no_bounds = punctuated_generics. clone ( ) ;
436
+ for g in & mut punctuated_generics_no_bounds {
437
+ match g {
438
+ GenericParam :: Type ( g) => g. bounds . clear ( ) ,
439
+ GenericParam :: Lifetime ( g) => g. bounds . clear ( ) ,
440
+ GenericParam :: Const ( _) => { }
441
+ }
442
+ }
443
+
444
+ let mut punctuated_type_generic_idents = Punctuated :: < _ , Token ! [ , ] > :: new ( ) ;
445
+ punctuated_type_generic_idents. extend ( lifetimeless_generics. iter ( ) . filter_map ( |g| match g {
446
+ GenericParam :: Type ( g) => Some ( & g. ident ) ,
447
+ _ => None ,
448
+ } ) ) ;
449
+
431
450
let mut punctuated_generic_idents = Punctuated :: < _ , Token ! [ , ] > :: new ( ) ;
432
451
punctuated_generic_idents. extend ( lifetimeless_generics. iter ( ) . map ( |g| match g {
433
452
GenericParam :: Type ( g) => & g. ident ,
453
+ GenericParam :: Const ( g) => & g. ident ,
434
454
_ => unreachable ! ( ) ,
435
455
} ) ) ;
436
456
@@ -470,15 +490,15 @@ pub fn derive_system_param(input: TokenStream) -> TokenStream {
470
490
}
471
491
472
492
#[ doc( hidden) ]
473
- type State <' w, ' s, #punctuated_generic_idents > = FetchState <
493
+ type State <' w, ' s, #punctuated_generics_no_bounds > = FetchState <
474
494
( #( <#tuple_types as #path:: system:: SystemParam >:: State , ) * ) ,
475
495
#punctuated_generic_idents
476
496
>;
477
497
478
498
#[ doc( hidden) ]
479
- #state_struct_visibility struct FetchState <TSystemParamState , #punctuated_generic_idents > {
499
+ #state_struct_visibility struct FetchState <TSystemParamState , #punctuated_generics > {
480
500
state: TSystemParamState ,
481
- marker: std:: marker:: PhantomData <fn ( ) ->( #punctuated_generic_idents ) >
501
+ marker: std:: marker:: PhantomData <fn ( ) ->( #punctuated_type_generic_idents ) >
482
502
}
483
503
484
504
unsafe impl <' __w, ' __s, #punctuated_generics> #path:: system:: SystemParamState for
0 commit comments