@@ -74,13 +74,23 @@ pub fn derive_query_data_impl(input: TokenStream) -> TokenStream {
7474 let user_generics = ast. generics . clone ( ) ;
7575 let ( user_impl_generics, user_ty_generics, user_where_clauses) = user_generics. split_for_impl ( ) ;
7676 let user_generics_with_world = {
77- let mut generics = ast. generics ;
77+ let mut generics = ast. generics . clone ( ) ;
7878 generics. params . insert ( 0 , parse_quote ! ( ' __w) ) ;
79- generics. params . insert ( 0 , parse_quote ! ( ' __s) ) ;
8079 generics
8180 } ;
8281 let ( user_impl_generics_with_world, user_ty_generics_with_world, user_where_clauses_with_world) =
8382 user_generics_with_world. split_for_impl ( ) ;
83+ let user_generics_with_world_and_state = {
84+ let mut generics = ast. generics ;
85+ generics. params . insert ( 0 , parse_quote ! ( ' __w) ) ;
86+ generics. params . insert ( 0 , parse_quote ! ( ' __s) ) ;
87+ generics
88+ } ;
89+ let (
90+ user_impl_generics_with_world_and_state,
91+ user_ty_generics_with_world_and_state,
92+ user_where_clauses_with_world_and_state,
93+ ) = user_generics_with_world_and_state. split_for_impl ( ) ;
8494
8595 let struct_name = ast. ident ;
8696 let read_only_struct_name = if attributes. is_mutable {
@@ -165,13 +175,13 @@ pub fn derive_query_data_impl(input: TokenStream) -> TokenStream {
165175 & visibility,
166176 & item_struct_name,
167177 & field_types,
168- & user_impl_generics_with_world ,
178+ & user_impl_generics_with_world_and_state ,
169179 & field_attrs,
170180 & field_visibilities,
171181 & field_idents,
172182 & user_ty_generics,
173- & user_ty_generics_with_world ,
174- user_where_clauses_with_world ,
183+ & user_ty_generics_with_world_and_state ,
184+ user_where_clauses_with_world_and_state ,
175185 ) ;
176186 let mutable_world_query_impl = world_query_impl (
177187 & path,
@@ -200,13 +210,13 @@ pub fn derive_query_data_impl(input: TokenStream) -> TokenStream {
200210 & visibility,
201211 & read_only_item_struct_name,
202212 & read_only_field_types,
203- & user_impl_generics_with_world ,
213+ & user_impl_generics_with_world_and_state ,
204214 & field_attrs,
205215 & field_visibilities,
206216 & field_idents,
207217 & user_ty_generics,
208- & user_ty_generics_with_world ,
209- user_where_clauses_with_world ,
218+ & user_ty_generics_with_world_and_state ,
219+ user_where_clauses_with_world_and_state ,
210220 ) ;
211221 let readonly_world_query_impl = world_query_impl (
212222 & path,
@@ -257,7 +267,7 @@ pub fn derive_query_data_impl(input: TokenStream) -> TokenStream {
257267 for #read_only_struct_name #user_ty_generics #user_where_clauses {
258268 const IS_READ_ONLY : bool = true ;
259269 type ReadOnly = #read_only_struct_name #user_ty_generics;
260- type Item <' __w, ' __s> = #read_only_item_struct_name #user_ty_generics_with_world ;
270+ type Item <' __w, ' __s> = #read_only_item_struct_name #user_ty_generics_with_world_and_state ;
261271
262272 fn shrink<' __wlong: ' __wshort, ' __wshort, ' __s>(
263273 item: Self :: Item <' __wlong, ' __s>
@@ -280,12 +290,13 @@ pub fn derive_query_data_impl(input: TokenStream) -> TokenStream {
280290 /// SAFETY: we call `fetch` for each member that implements `Fetch`.
281291 #[ inline( always) ]
282292 unsafe fn fetch<' __w, ' __s>(
283- _fetch: & mut <Self as #path:: query:: WorldQuery >:: Fetch <' __w, ' __s>,
293+ _state: & ' __s Self :: State ,
294+ _fetch: & mut <Self as #path:: query:: WorldQuery >:: Fetch <' __w>,
284295 _entity: #path:: entity:: Entity ,
285296 _table_row: #path:: storage:: TableRow ,
286297 ) -> Self :: Item <' __w, ' __s> {
287298 Self :: Item {
288- #( #field_idents: <#read_only_field_types>:: fetch( & mut _fetch. #named_field_idents, _entity, _table_row) , ) *
299+ #( #field_idents: <#read_only_field_types>:: fetch( & _state . #named_field_idents , & mut _fetch. #named_field_idents, _entity, _table_row) , ) *
289300 }
290301 }
291302 }
@@ -314,7 +325,7 @@ pub fn derive_query_data_impl(input: TokenStream) -> TokenStream {
314325 for #struct_name #user_ty_generics #user_where_clauses {
315326 const IS_READ_ONLY : bool = #is_read_only;
316327 type ReadOnly = #read_only_struct_name #user_ty_generics;
317- type Item <' __w, ' __s> = #item_struct_name #user_ty_generics_with_world ;
328+ type Item <' __w, ' __s> = #item_struct_name #user_ty_generics_with_world_and_state ;
318329
319330 fn shrink<' __wlong: ' __wshort, ' __wshort, ' __s>(
320331 item: Self :: Item <' __wlong, ' __s>
@@ -337,12 +348,13 @@ pub fn derive_query_data_impl(input: TokenStream) -> TokenStream {
337348 /// SAFETY: we call `fetch` for each member that implements `Fetch`.
338349 #[ inline( always) ]
339350 unsafe fn fetch<' __w, ' __s>(
340- _fetch: & mut <Self as #path:: query:: WorldQuery >:: Fetch <' __w, ' __s>,
351+ _state: & ' __s Self :: State ,
352+ _fetch: & mut <Self as #path:: query:: WorldQuery >:: Fetch <' __w>,
341353 _entity: #path:: entity:: Entity ,
342354 _table_row: #path:: storage:: TableRow ,
343355 ) -> Self :: Item <' __w, ' __s> {
344356 Self :: Item {
345- #( #field_idents: <#field_types>:: fetch( & mut _fetch. #named_field_idents, _entity, _table_row) , ) *
357+ #( #field_idents: <#field_types>:: fetch( & _state . #named_field_idents , & mut _fetch. #named_field_idents, _entity, _table_row) , ) *
346358 }
347359 }
348360 }
0 commit comments