SystemParam Derive fixes (#2838)
# Objective A user on Discord couldn't derive SystemParam for this Struct: ```rs #[derive(SystemParam)] pub struct SpatialQuery<'w, 's, Q: WorldQuery + Send + Sync + 'static, F: WorldQuery + Send + Sync + 'static = ()> where F::Fetch: FilterFetch, { query: Query<'w, 's, (C, &'static Transform), F>, } ``` ## Solution 1. The `where`-clause is now also copied to the `SystemParamFetch` impl Block. 2. The `SystemParamState` impl Block no longer gets any defaults for generics Co-authored-by: MinerSebas <66798382+MinerSebas@users.noreply.github.com>
This commit is contained in:
parent
b506c30cd3
commit
69e9a47d92
@ -11,7 +11,7 @@ use syn::{
|
|||||||
parse_macro_input,
|
parse_macro_input,
|
||||||
punctuated::Punctuated,
|
punctuated::Punctuated,
|
||||||
token::Comma,
|
token::Comma,
|
||||||
DeriveInput, Field, GenericParam, Ident, Index, LitInt, Result, Token,
|
DeriveInput, Field, GenericParam, Ident, Index, LitInt, Result, Token, TypeParam,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct AllTuples {
|
struct AllTuples {
|
||||||
@ -357,12 +357,18 @@ pub fn derive_system_param(input: TokenStream) -> TokenStream {
|
|||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
let mut punctuated_generics = Punctuated::<_, Token![,]>::new();
|
let mut punctuated_generics = Punctuated::<_, Token![,]>::new();
|
||||||
punctuated_generics.extend(lifetimeless_generics.iter());
|
punctuated_generics.extend(lifetimeless_generics.iter().map(|g| match g {
|
||||||
|
GenericParam::Type(g) => GenericParam::Type(TypeParam {
|
||||||
|
default: None,
|
||||||
|
..g.clone()
|
||||||
|
}),
|
||||||
|
_ => unreachable!(),
|
||||||
|
}));
|
||||||
|
|
||||||
let mut punctuated_generic_idents = Punctuated::<_, Token![,]>::new();
|
let mut punctuated_generic_idents = Punctuated::<_, Token![,]>::new();
|
||||||
punctuated_generic_idents.extend(lifetimeless_generics.iter().map(|g| match g {
|
punctuated_generic_idents.extend(lifetimeless_generics.iter().map(|g| match g {
|
||||||
GenericParam::Type(g) => &g.ident,
|
GenericParam::Type(g) => &g.ident,
|
||||||
_ => panic!(),
|
_ => unreachable!(),
|
||||||
}));
|
}));
|
||||||
|
|
||||||
let struct_name = &ast.ident;
|
let struct_name = &ast.ident;
|
||||||
@ -402,7 +408,7 @@ pub fn derive_system_param(input: TokenStream) -> TokenStream {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl #impl_generics #path::system::SystemParamFetch<'w, 's> for #fetch_struct_name <(#(<#field_types as #path::system::SystemParam>::Fetch,)*), #punctuated_generic_idents> {
|
impl #impl_generics #path::system::SystemParamFetch<'w, 's> for #fetch_struct_name <(#(<#field_types as #path::system::SystemParam>::Fetch,)*), #punctuated_generic_idents> #where_clause {
|
||||||
type Item = #struct_name #ty_generics;
|
type Item = #struct_name #ty_generics;
|
||||||
unsafe fn get_param(
|
unsafe fn get_param(
|
||||||
state: &'s mut Self,
|
state: &'s mut Self,
|
||||||
|
@ -1253,3 +1253,27 @@ pub mod lifetimeless {
|
|||||||
pub type SResMut<T> = super::ResMut<'static, T>;
|
pub type SResMut<T> = super::ResMut<'static, T>;
|
||||||
pub type SCommands = crate::system::Commands<'static, 'static>;
|
pub type SCommands = crate::system::Commands<'static, 'static>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::SystemParam;
|
||||||
|
use crate::{
|
||||||
|
self as bevy_ecs, // Necessary for the `SystemParam` Derive when used inside `bevy_ecs`.
|
||||||
|
query::{FilterFetch, WorldQuery},
|
||||||
|
system::Query,
|
||||||
|
};
|
||||||
|
|
||||||
|
// Compile test for #2838
|
||||||
|
#[derive(SystemParam)]
|
||||||
|
pub struct SpecialQuery<
|
||||||
|
'w,
|
||||||
|
's,
|
||||||
|
Q: WorldQuery + Send + Sync + 'static,
|
||||||
|
F: WorldQuery + Send + Sync + 'static = (),
|
||||||
|
>
|
||||||
|
where
|
||||||
|
F::Fetch: FilterFetch,
|
||||||
|
{
|
||||||
|
_query: Query<'w, 's, Q, F>,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user