aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir_ty/src/traits/chalk.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_hir_ty/src/traits/chalk.rs')
-rw-r--r--crates/ra_hir_ty/src/traits/chalk.rs86
1 files changed, 71 insertions, 15 deletions
diff --git a/crates/ra_hir_ty/src/traits/chalk.rs b/crates/ra_hir_ty/src/traits/chalk.rs
index 2f35d6d49..8ef4941c0 100644
--- a/crates/ra_hir_ty/src/traits/chalk.rs
+++ b/crates/ra_hir_ty/src/traits/chalk.rs
@@ -48,6 +48,9 @@ impl<'a> chalk_solve::RustIrDatabase<Interner> for ChalkContext<'a> {
48 fn adt_datum(&self, struct_id: AdtId) -> Arc<StructDatum> { 48 fn adt_datum(&self, struct_id: AdtId) -> Arc<StructDatum> {
49 self.db.struct_datum(self.krate, struct_id) 49 self.db.struct_datum(self.krate, struct_id)
50 } 50 }
51 fn adt_repr(&self, _struct_id: AdtId) -> rust_ir::AdtRepr {
52 unreachable!()
53 }
51 fn impl_datum(&self, impl_id: ImplId) -> Arc<ImplDatum> { 54 fn impl_datum(&self, impl_id: ImplId) -> Arc<ImplDatum> {
52 self.db.impl_datum(self.krate, impl_id) 55 self.db.impl_datum(self.krate, impl_id)
53 } 56 }
@@ -128,8 +131,7 @@ impl<'a> chalk_solve::RustIrDatabase<Interner> for ChalkContext<'a> {
128 well_known_trait: rust_ir::WellKnownTrait, 131 well_known_trait: rust_ir::WellKnownTrait,
129 ) -> Option<chalk_ir::TraitId<Interner>> { 132 ) -> Option<chalk_ir::TraitId<Interner>> {
130 let lang_attr = lang_attr_from_well_known_trait(well_known_trait); 133 let lang_attr = lang_attr_from_well_known_trait(well_known_trait);
131 let lang_items = self.db.crate_lang_items(self.krate); 134 let trait_ = match self.db.lang_item(self.krate, lang_attr.into()) {
132 let trait_ = match lang_items.target(lang_attr) {
133 Some(LangItemTarget::TraitId(trait_)) => trait_, 135 Some(LangItemTarget::TraitId(trait_)) => trait_,
134 _ => return None, 136 _ => return None,
135 }; 137 };
@@ -186,6 +188,39 @@ impl<'a> chalk_solve::RustIrDatabase<Interner> for ChalkContext<'a> {
186 // FIXME: implement actual object safety 188 // FIXME: implement actual object safety
187 true 189 true
188 } 190 }
191
192 fn closure_kind(
193 &self,
194 _closure_id: chalk_ir::ClosureId<Interner>,
195 _substs: &chalk_ir::Substitution<Interner>,
196 ) -> rust_ir::ClosureKind {
197 // FIXME: implement closure support
198 unimplemented!()
199 }
200 fn closure_inputs_and_output(
201 &self,
202 _closure_id: chalk_ir::ClosureId<Interner>,
203 _substs: &chalk_ir::Substitution<Interner>,
204 ) -> chalk_ir::Binders<rust_ir::FnDefInputsAndOutputDatum<Interner>> {
205 // FIXME: implement closure support
206 unimplemented!()
207 }
208 fn closure_upvars(
209 &self,
210 _closure_id: chalk_ir::ClosureId<Interner>,
211 _substs: &chalk_ir::Substitution<Interner>,
212 ) -> chalk_ir::Binders<chalk_ir::Ty<Interner>> {
213 // FIXME: implement closure support
214 unimplemented!()
215 }
216 fn closure_fn_substitution(
217 &self,
218 _closure_id: chalk_ir::ClosureId<Interner>,
219 _substs: &chalk_ir::Substitution<Interner>,
220 ) -> chalk_ir::Substitution<Interner> {
221 // FIXME: implement closure support
222 unimplemented!()
223 }
189} 224}
190 225
191pub(crate) fn program_clauses_for_chalk_env_query( 226pub(crate) fn program_clauses_for_chalk_env_query(
@@ -250,7 +285,7 @@ pub(crate) fn trait_datum_query(
250 upstream: trait_.lookup(db.upcast()).container.module(db.upcast()).krate != krate, 285 upstream: trait_.lookup(db.upcast()).container.module(db.upcast()).krate != krate,
251 non_enumerable: true, 286 non_enumerable: true,
252 coinductive: false, // only relevant for Chalk testing 287 coinductive: false, // only relevant for Chalk testing
253 // FIXME set these flags correctly 288 // FIXME: set these flags correctly
254 marker: false, 289 marker: false,
255 fundamental: false, 290 fundamental: false,
256 }; 291 };
@@ -272,20 +307,28 @@ pub(crate) fn trait_datum_query(
272 307
273fn well_known_trait_from_lang_attr(name: &str) -> Option<WellKnownTrait> { 308fn well_known_trait_from_lang_attr(name: &str) -> Option<WellKnownTrait> {
274 Some(match name { 309 Some(match name {
275 "sized" => WellKnownTrait::SizedTrait, 310 "sized" => WellKnownTrait::Sized,
276 "copy" => WellKnownTrait::CopyTrait, 311 "copy" => WellKnownTrait::Copy,
277 "clone" => WellKnownTrait::CloneTrait, 312 "clone" => WellKnownTrait::Clone,
278 "drop" => WellKnownTrait::DropTrait, 313 "drop" => WellKnownTrait::Drop,
314 "fn_once" => WellKnownTrait::FnOnce,
315 "fn_mut" => WellKnownTrait::FnMut,
316 "fn" => WellKnownTrait::Fn,
317 "unsize" => WellKnownTrait::Unsize,
279 _ => return None, 318 _ => return None,
280 }) 319 })
281} 320}
282 321
283fn lang_attr_from_well_known_trait(attr: WellKnownTrait) -> &'static str { 322fn lang_attr_from_well_known_trait(attr: WellKnownTrait) -> &'static str {
284 match attr { 323 match attr {
285 WellKnownTrait::SizedTrait => "sized", 324 WellKnownTrait::Sized => "sized",
286 WellKnownTrait::CopyTrait => "copy", 325 WellKnownTrait::Copy => "copy",
287 WellKnownTrait::CloneTrait => "clone", 326 WellKnownTrait::Clone => "clone",
288 WellKnownTrait::DropTrait => "drop", 327 WellKnownTrait::Drop => "drop",
328 WellKnownTrait::FnOnce => "fn_once",
329 WellKnownTrait::FnMut => "fn_mut",
330 WellKnownTrait::Fn => "fn",
331 WellKnownTrait::Unsize => "unsize",
289 } 332 }
290} 333}
291 334
@@ -309,8 +352,9 @@ pub(crate) fn struct_datum_query(
309 .unwrap_or_else(Vec::new); 352 .unwrap_or_else(Vec::new);
310 let flags = rust_ir::AdtFlags { 353 let flags = rust_ir::AdtFlags {
311 upstream, 354 upstream,
312 // FIXME set fundamental flag correctly 355 // FIXME set fundamental and phantom_data flags correctly
313 fundamental: false, 356 fundamental: false,
357 phantom_data: false,
314 }; 358 };
315 let struct_datum_bound = rust_ir::AdtDatumBound { 359 let struct_datum_bound = rust_ir::AdtDatumBound {
316 fields: Vec::new(), // FIXME add fields (only relevant for auto traits) 360 fields: Vec::new(), // FIXME add fields (only relevant for auto traits)
@@ -448,11 +492,23 @@ pub(crate) fn fn_def_datum_query(
448 let where_clauses = convert_where_clauses(db, callable_def.into(), &bound_vars); 492 let where_clauses = convert_where_clauses(db, callable_def.into(), &bound_vars);
449 let bound = rust_ir::FnDefDatumBound { 493 let bound = rust_ir::FnDefDatumBound {
450 // Note: Chalk doesn't actually use this information yet as far as I am aware, but we provide it anyway 494 // 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(), 495 inputs_and_output: make_binders(
452 return_type: sig.value.ret().clone().to_chalk(db), 496 rust_ir::FnDefInputsAndOutputDatum {
497 argument_types: sig
498 .value
499 .params()
500 .iter()
501 .map(|ty| ty.clone().to_chalk(db))
502 .collect(),
503 return_type: sig.value.ret().clone().to_chalk(db),
504 }
505 .shifted_in(&Interner),
506 0,
507 ),
453 where_clauses, 508 where_clauses,
454 }; 509 };
455 let datum = FnDefDatum { id: fn_def_id, binders: make_binders(bound, sig.num_binders) }; 510 let datum =
511 FnDefDatum { id: fn_def_id, binders: make_binders(bound, sig.num_binders), abi: () };
456 Arc::new(datum) 512 Arc::new(datum)
457} 513}
458 514