@@ -185,49 +185,103 @@ fn checker(
185
185
fields : & FieldsNamed ,
186
186
) -> TokenStream {
187
187
let proj = format_ident ! ( "__Proj" ) ;
188
- let ( _ , ty_gen , _ ) = generics . split_for_impl ( ) ;
188
+ let storage = format_ident ! ( "__Storage" ) ;
189
189
let mut generics = generics. clone ( ) ;
190
190
generics. lt_token . get_or_insert_default ( ) ;
191
191
generics. gt_token . get_or_insert_default ( ) ;
192
+ let ( _, ident_ty_gen, whr) = generics. split_for_impl ( ) ;
193
+ let mut generics = generics. clone ( ) ;
192
194
// TODO: proper index
193
195
generics. params . insert (
194
196
0 ,
195
- parse_quote ! ( #proj: #compat:: ProjectableExt <Inner = #ident #ty_gen >) ,
197
+ parse_quote ! ( #proj: #compat:: ProjectableExt <Inner = #ident #ident_ty_gen >) ,
196
198
) ;
197
- let field_name = fields. named . iter ( ) . map ( |f| & f. ident ) ;
199
+ let ( checker_impl_gen, _, _) = generics. split_for_impl ( ) ;
200
+ let mut storage_generics = generics. clone ( ) ;
201
+ storage_generics. params . insert ( 0 , parse_quote ! ( #storage) ) ;
202
+ let field_name = fields. named . iter ( ) . map ( |f| & f. ident ) . collect :: < Vec < _ > > ( ) ;
198
203
let fields = fields. named . iter ( ) . map (
199
204
|Field {
200
205
vis,
201
206
ident : name,
202
207
..
203
208
} | {
204
209
quote ! {
205
- #vis #name: #compat:: ProjectedField <#proj, #core_:: marker:: field_of!( #ident #ty_gen , #name) >
210
+ #vis #name: #compat:: ProjectedField <#proj, #core_:: marker:: field_of!( #ident #ident_ty_gen , #name) >
206
211
}
207
212
} ,
208
213
) ;
209
- let ( impl_gen, checker_ty_gen, whr) = generics. split_for_impl ( ) ;
214
+ let checker_lt = quote ! ( ' ___checker) ;
215
+ let ( _, storage_ty_gen, _) = storage_generics. split_for_impl ( ) ;
216
+ let mut val_generics = generics. clone ( ) ;
217
+ val_generics. params . insert ( 0 , parse_quote ! ( #checker_lt) ) ;
218
+ let ( val_impl_gen, _, _) = val_generics. split_for_impl ( ) ;
219
+ let storage_ty_gen = storage_ty_gen. into_token_stream ( ) ;
220
+ let ref_ty_gen: TokenStream = storage_ty_gen
221
+ . clone ( )
222
+ . into_iter ( )
223
+ . map ( |tt| {
224
+ if matches ! ( & tt, TokenTree :: Ident ( i) if i == & storage) {
225
+ quote ! ( #compat:: RawProjectedRef <#checker_lt, #proj, #ident #ident_ty_gen>)
226
+ } else {
227
+ quote ! ( #tt)
228
+ }
229
+ } )
230
+ . collect ( ) ;
231
+ let val_ty_gen: TokenStream = storage_ty_gen
232
+ . into_iter ( )
233
+ . map ( |tt| {
234
+ if matches ! ( & tt, TokenTree :: Ident ( i) if i == & storage) {
235
+ quote ! ( #compat:: RawProjectedVal <#proj, #ident #ident_ty_gen>)
236
+ } else {
237
+ quote ! ( #tt)
238
+ }
239
+ } )
240
+ . collect ( ) ;
210
241
quote ! {
211
- pub struct Checker #generics {
242
+ pub struct Checker #storage_generics {
212
243
#( #fields, ) *
213
- pub ___projection_checker_raw: #compat:: RawProjected <#proj, #ident #ty_gen>,
244
+ pub ___projection_checker_raw: #storage,
245
+ }
246
+
247
+ unsafe impl #val_impl_gen #compat:: ProjectionRefChecker <#checker_lt> for Checker #ref_ty_gen {
248
+ type Proj = #proj;
249
+
250
+ unsafe fn __create(
251
+ proj: #compat:: RawProjectedRef <
252
+ #checker_lt,
253
+ Self :: Proj ,
254
+ <Self :: Proj as #core_:: ops:: Projectable >:: Inner ,
255
+ >,
256
+ ) -> Self {
257
+ Self {
258
+ #( #field_name: unsafe { #compat:: ProjectedField :: __new( ) } , ) *
259
+ ___projection_checker_raw: proj,
260
+ }
261
+ }
214
262
}
215
263
216
- unsafe impl #impl_gen #compat:: ProjectionChecker for Checker #checker_ty_gen {
264
+ unsafe impl #checker_impl_gen #compat:: ProjectionValChecker for Checker #val_ty_gen {
217
265
type Proj = #proj;
218
266
219
- fn start_proj( proj: Self :: Proj ) -> Self {
267
+ unsafe fn __create(
268
+ proj: #compat:: RawProjectedVal <
269
+ Self :: Proj ,
270
+ <Self :: Proj as #core_:: ops:: Projectable >:: Inner ,
271
+ >,
272
+ ) -> Self {
220
273
Self {
221
274
#( #field_name: unsafe { #compat:: ProjectedField :: __new( ) } , ) *
222
- ___projection_checker_raw: unsafe { #compat :: RawProjected :: __new ( proj) } ,
275
+ ___projection_checker_raw: proj,
223
276
}
224
277
}
225
278
}
226
279
227
- unsafe impl #impl_gen #compat:: CheckedProject <#proj> for #ident #ty_gen
280
+ unsafe impl #checker_impl_gen #compat:: CheckedProject <#proj> for #ident #ident_ty_gen
228
281
#whr
229
282
{
230
- type Checker = Checker #checker_ty_gen;
283
+ type RefChecker <#checker_lt> = Checker #ref_ty_gen;
284
+ type ValChecker = Checker #val_ty_gen;
231
285
}
232
286
}
233
287
}
0 commit comments