@@ -128,8 +128,7 @@ impl<'a> chalk_solve::RustIrDatabase<Interner> for ChalkContext<'a> {
128
128
well_known_trait : rust_ir:: WellKnownTrait ,
129
129
) -> Option < chalk_ir:: TraitId < Interner > > {
130
130
let lang_attr = lang_attr_from_well_known_trait ( well_known_trait) ;
131
- let lang_items = self . db . crate_lang_items ( self . krate ) ;
132
- let trait_ = match lang_items. target ( lang_attr) {
131
+ let trait_ = match self . db . lang_item ( self . krate , lang_attr. into ( ) ) {
133
132
Some ( LangItemTarget :: TraitId ( trait_) ) => trait_,
134
133
_ => return None ,
135
134
} ;
@@ -186,6 +185,39 @@ impl<'a> chalk_solve::RustIrDatabase<Interner> for ChalkContext<'a> {
186
185
// FIXME: implement actual object safety
187
186
true
188
187
}
188
+
189
+ fn closure_kind (
190
+ & self ,
191
+ _closure_id : chalk_ir:: ClosureId < Interner > ,
192
+ _substs : & chalk_ir:: Substitution < Interner > ,
193
+ ) -> rust_ir:: ClosureKind {
194
+ // FIXME: implement closure support
195
+ unimplemented ! ( )
196
+ }
197
+ fn closure_inputs_and_output (
198
+ & self ,
199
+ _closure_id : chalk_ir:: ClosureId < Interner > ,
200
+ _substs : & chalk_ir:: Substitution < Interner > ,
201
+ ) -> chalk_ir:: Binders < rust_ir:: FnDefInputsAndOutputDatum < Interner > > {
202
+ // FIXME: implement closure support
203
+ unimplemented ! ( )
204
+ }
205
+ fn closure_upvars (
206
+ & self ,
207
+ _closure_id : chalk_ir:: ClosureId < Interner > ,
208
+ _substs : & chalk_ir:: Substitution < Interner > ,
209
+ ) -> chalk_ir:: Binders < chalk_ir:: Ty < Interner > > {
210
+ // FIXME: implement closure support
211
+ unimplemented ! ( )
212
+ }
213
+ fn closure_fn_substitution (
214
+ & self ,
215
+ _closure_id : chalk_ir:: ClosureId < Interner > ,
216
+ _substs : & chalk_ir:: Substitution < Interner > ,
217
+ ) -> chalk_ir:: Substitution < Interner > {
218
+ // FIXME: implement closure support
219
+ unimplemented ! ( )
220
+ }
189
221
}
190
222
191
223
pub ( crate ) fn program_clauses_for_chalk_env_query (
@@ -250,7 +282,7 @@ pub(crate) fn trait_datum_query(
250
282
upstream : trait_. lookup ( db. upcast ( ) ) . container . module ( db. upcast ( ) ) . krate != krate,
251
283
non_enumerable : true ,
252
284
coinductive : false , // only relevant for Chalk testing
253
- // FIXME set these flags correctly
285
+ // FIXME: set these flags correctly
254
286
marker : false ,
255
287
fundamental : false ,
256
288
} ;
@@ -272,20 +304,28 @@ pub(crate) fn trait_datum_query(
272
304
273
305
fn well_known_trait_from_lang_attr ( name : & str ) -> Option < WellKnownTrait > {
274
306
Some ( match name {
275
- "sized" => WellKnownTrait :: SizedTrait ,
276
- "copy" => WellKnownTrait :: CopyTrait ,
277
- "clone" => WellKnownTrait :: CloneTrait ,
278
- "drop" => WellKnownTrait :: DropTrait ,
307
+ "sized" => WellKnownTrait :: Sized ,
308
+ "copy" => WellKnownTrait :: Copy ,
309
+ "clone" => WellKnownTrait :: Clone ,
310
+ "drop" => WellKnownTrait :: Drop ,
311
+ "fn_once" => WellKnownTrait :: FnOnce ,
312
+ "fn_mut" => WellKnownTrait :: FnMut ,
313
+ "fn" => WellKnownTrait :: Fn ,
314
+ "unsize" => WellKnownTrait :: Unsize ,
279
315
_ => return None ,
280
316
} )
281
317
}
282
318
283
319
fn lang_attr_from_well_known_trait ( attr : WellKnownTrait ) -> & ' static str {
284
320
match attr {
285
- WellKnownTrait :: SizedTrait => "sized" ,
286
- WellKnownTrait :: CopyTrait => "copy" ,
287
- WellKnownTrait :: CloneTrait => "clone" ,
288
- WellKnownTrait :: DropTrait => "drop" ,
321
+ WellKnownTrait :: Sized => "sized" ,
322
+ WellKnownTrait :: Copy => "copy" ,
323
+ WellKnownTrait :: Clone => "clone" ,
324
+ WellKnownTrait :: Drop => "drop" ,
325
+ WellKnownTrait :: FnOnce => "fn_once" ,
326
+ WellKnownTrait :: FnMut => "fn_mut" ,
327
+ WellKnownTrait :: Fn => "fn" ,
328
+ WellKnownTrait :: Unsize => "unsize" ,
289
329
}
290
330
}
291
331
@@ -309,8 +349,9 @@ pub(crate) fn struct_datum_query(
309
349
. unwrap_or_else ( Vec :: new) ;
310
350
let flags = rust_ir:: AdtFlags {
311
351
upstream,
312
- // FIXME set fundamental flag correctly
352
+ // FIXME set fundamental and phantom_data flags correctly
313
353
fundamental : false ,
354
+ phantom_data : false ,
314
355
} ;
315
356
let struct_datum_bound = rust_ir:: AdtDatumBound {
316
357
fields : Vec :: new ( ) , // FIXME add fields (only relevant for auto traits)
@@ -448,11 +489,23 @@ pub(crate) fn fn_def_datum_query(
448
489
let where_clauses = convert_where_clauses ( db, callable_def. into ( ) , & bound_vars) ;
449
490
let bound = rust_ir:: FnDefDatumBound {
450
491
// Note: Chalk doesn't actually use this information yet as far as I am aware, but we provide it anyway
451
- argument_types : sig. value . params ( ) . iter ( ) . map ( |ty| ty. clone ( ) . to_chalk ( db) ) . collect ( ) ,
452
- return_type : sig. value . ret ( ) . clone ( ) . to_chalk ( db) ,
492
+ inputs_and_output : make_binders (
493
+ rust_ir:: FnDefInputsAndOutputDatum {
494
+ argument_types : sig
495
+ . value
496
+ . params ( )
497
+ . iter ( )
498
+ . map ( |ty| ty. clone ( ) . to_chalk ( db) )
499
+ . collect ( ) ,
500
+ return_type : sig. value . ret ( ) . clone ( ) . to_chalk ( db) ,
501
+ }
502
+ . shifted_in ( & Interner ) ,
503
+ 0 ,
504
+ ) ,
453
505
where_clauses,
454
506
} ;
455
- let datum = FnDefDatum { id : fn_def_id, binders : make_binders ( bound, sig. num_binders ) } ;
507
+ let datum =
508
+ FnDefDatum { id : fn_def_id, binders : make_binders ( bound, sig. num_binders ) , abi : ( ) } ;
456
509
Arc :: new ( datum)
457
510
}
458
511
0 commit comments