@@ -160,13 +160,24 @@ impl InternedStruct {
160
160
data_ident : & syn:: Ident ,
161
161
config_ident : & syn:: Ident ,
162
162
) -> syn:: ItemImpl {
163
+ let the_ident = self . the_ident ( ) ;
163
164
let lt_db = & self . named_db_lifetime ( ) ;
164
165
let ( _, _, _, type_generics, _) = self . the_ident_and_generics ( ) ;
165
166
parse_quote_spanned ! (
166
167
config_ident. span( ) =>
167
168
168
169
impl salsa:: interned:: Configuration for #config_ident {
169
170
type Data <#lt_db> = #data_ident #type_generics;
171
+
172
+ type Struct <#lt_db> = #the_ident < #lt_db >;
173
+
174
+ unsafe fn struct_from_raw<' db>( ptr: std:: ptr:: NonNull <salsa:: interned:: ValueStruct <Self >>) -> Self :: Struct <' db> {
175
+ #the_ident( ptr, std:: marker:: PhantomData )
176
+ }
177
+
178
+ fn deref_struct<' db>( s: Self :: Struct <' db>) -> & ' db salsa:: interned:: ValueStruct <Self > {
179
+ unsafe { s. 0 . as_ref( ) }
180
+ }
170
181
}
171
182
)
172
183
}
@@ -191,21 +202,21 @@ impl InternedStruct {
191
202
192
203
let field_getters: Vec < syn:: ImplItemFn > = self
193
204
. all_fields ( )
194
- . map ( |field| {
205
+ . map ( |field : & crate :: salsa_struct :: SalsaField | {
195
206
let field_name = field. name ( ) ;
196
207
let field_ty = field. ty ( ) ;
197
208
let field_vis = field. vis ( ) ;
198
209
let field_get_name = field. get_name ( ) ;
199
210
if field. is_clone_field ( ) {
200
211
parse_quote_spanned ! { field_get_name. span( ) =>
201
212
#field_vis fn #field_get_name( self , _db: & #db_lt #db_dyn_ty) -> #field_ty {
202
- std:: clone:: Clone :: clone( & unsafe { & * self . 0 } . data( ) . #field_name)
213
+ std:: clone:: Clone :: clone( & unsafe { self . 0 . as_ref ( ) } . data( ) . #field_name)
203
214
}
204
215
}
205
216
} else {
206
217
parse_quote_spanned ! { field_get_name. span( ) =>
207
218
#field_vis fn #field_get_name( self , _db: & #db_lt #db_dyn_ty) -> & #db_lt #field_ty {
208
- & unsafe { & * self . 0 } . data( ) . #field_name
219
+ & unsafe { self . 0 . as_ref ( ) } . data( ) . #field_name
209
220
}
210
221
}
211
222
}
@@ -218,18 +229,15 @@ impl InternedStruct {
218
229
let constructor_name = self . constructor_name ( ) ;
219
230
let new_method: syn:: ImplItemFn = parse_quote_spanned ! { constructor_name. span( ) =>
220
231
#vis fn #constructor_name(
221
- db: & #db_dyn_ty,
232
+ db: & #db_lt # db_dyn_ty,
222
233
#( #field_names: #field_tys, ) *
223
234
) -> Self {
224
235
let ( jar, runtime) = <_ as salsa:: storage:: HasJar <#jar_ty>>:: jar( db) ;
225
236
let ingredients = <#jar_ty as salsa:: storage:: HasIngredientsFor < #the_ident #type_generics >>:: ingredient( jar) ;
226
- Self (
227
- ingredients. intern( runtime, #data_ident {
228
- #( #field_names, ) *
229
- __phantom: std:: marker:: PhantomData ,
230
- } ) ,
231
- std:: marker:: PhantomData ,
232
- )
237
+ ingredients. intern( runtime, #data_ident {
238
+ #( #field_names, ) *
239
+ __phantom: std:: marker:: PhantomData ,
240
+ } )
233
241
}
234
242
} ;
235
243
@@ -262,6 +270,7 @@ impl InternedStruct {
262
270
self . the_ident_and_generics ( ) ;
263
271
let db_dyn_ty = self . db_dyn_ty ( ) ;
264
272
let jar_ty = self . jar_ty ( ) ;
273
+ let db_lt = self . named_db_lifetime ( ) ;
265
274
266
275
let field_getters: Vec < syn:: ImplItemFn > = self
267
276
. all_fields ( )
@@ -296,7 +305,7 @@ impl InternedStruct {
296
305
let constructor_name = self . constructor_name ( ) ;
297
306
let new_method: syn:: ImplItemFn = parse_quote_spanned ! { constructor_name. span( ) =>
298
307
#vis fn #constructor_name(
299
- db: & #db_dyn_ty,
308
+ db: & #db_lt #db_lt #db_dyn_ty,
300
309
#( #field_names: #field_tys, ) *
301
310
) -> Self {
302
311
let ( jar, runtime) = <_ as salsa:: storage:: HasJar <#jar_ty>>:: jar( db) ;
@@ -384,7 +393,7 @@ impl InternedStruct {
384
393
fn lookup_id( id: salsa:: Id , db: & #db_lt DB ) -> Self {
385
394
let ( jar, _) = <_ as salsa:: storage:: HasJar <#jar_ty>>:: jar( db) ;
386
395
let ingredients = <#jar_ty as salsa:: storage:: HasIngredientsFor <#ident #type_generics>>:: ingredient( jar) ;
387
- Self ( ingredients. interned_value( id) , std :: marker :: PhantomData )
396
+ ingredients. interned_value( id)
388
397
}
389
398
}
390
399
} )
0 commit comments