diff options
Diffstat (limited to 'crates/ra_hir_ty/src/traits/chalk.rs')
-rw-r--r-- | crates/ra_hir_ty/src/traits/chalk.rs | 86 |
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 | ||
191 | pub(crate) fn program_clauses_for_chalk_env_query( | 226 | pub(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 | ||
273 | fn well_known_trait_from_lang_attr(name: &str) -> Option<WellKnownTrait> { | 308 | fn 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 | ||
283 | fn lang_attr_from_well_known_trait(attr: WellKnownTrait) -> &'static str { | 322 | fn 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 | ||