diff options
Diffstat (limited to 'crates/ra_hir_ty')
-rw-r--r-- | crates/ra_hir_ty/Cargo.toml | 4 | ||||
-rw-r--r-- | crates/ra_hir_ty/src/tests/coercion.rs | 42 | ||||
-rw-r--r-- | crates/ra_hir_ty/src/tests/traits.rs | 8 | ||||
-rw-r--r-- | crates/ra_hir_ty/src/traits/chalk.rs | 86 | ||||
-rw-r--r-- | crates/ra_hir_ty/src/traits/chalk/interner.rs | 1 | ||||
-rw-r--r-- | crates/ra_hir_ty/src/traits/chalk/mapping.rs | 9 |
6 files changed, 109 insertions, 41 deletions
diff --git a/crates/ra_hir_ty/Cargo.toml b/crates/ra_hir_ty/Cargo.toml index 112fcd07e..407322dc1 100644 --- a/crates/ra_hir_ty/Cargo.toml +++ b/crates/ra_hir_ty/Cargo.toml | |||
@@ -27,8 +27,8 @@ test_utils = { path = "../test_utils" } | |||
27 | 27 | ||
28 | scoped-tls = "1" | 28 | scoped-tls = "1" |
29 | 29 | ||
30 | chalk-solve = "0.11" | 30 | chalk-solve = { version = "0.15.0-dev.0", git = "https://github.com/rust-lang/chalk" } |
31 | chalk-ir = "0.11" | 31 | chalk-ir = { version = "0.15.0-dev.0", git = "https://github.com/rust-lang/chalk" } |
32 | 32 | ||
33 | [dev-dependencies] | 33 | [dev-dependencies] |
34 | insta = "0.16.0" | 34 | insta = "0.16.0" |
diff --git a/crates/ra_hir_ty/src/tests/coercion.rs b/crates/ra_hir_ty/src/tests/coercion.rs index a2601c68a..5a1c6ccc3 100644 --- a/crates/ra_hir_ty/src/tests/coercion.rs +++ b/crates/ra_hir_ty/src/tests/coercion.rs | |||
@@ -664,6 +664,8 @@ fn test() { | |||
664 | fn coerce_unsize_trait_object() { | 664 | fn coerce_unsize_trait_object() { |
665 | assert_snapshot!( | 665 | assert_snapshot!( |
666 | infer_with_mismatches(r#" | 666 | infer_with_mismatches(r#" |
667 | #[lang = "sized"] | ||
668 | pub trait Sized {} | ||
667 | #[lang = "unsize"] | 669 | #[lang = "unsize"] |
668 | pub trait Unsize<T> {} | 670 | pub trait Unsize<T> {} |
669 | #[lang = "coerce_unsized"] | 671 | #[lang = "coerce_unsized"] |
@@ -689,19 +691,19 @@ fn test() { | |||
689 | } | 691 | } |
690 | "#, true), | 692 | "#, true), |
691 | @r###" | 693 | @r###" |
692 | 387..572 '{ ...bj2; }': () | 694 | 424..609 '{ ...bj2; }': () |
693 | 397..400 'obj': &dyn Baz<i8, i16> | 695 | 434..437 'obj': &dyn Baz<i8, i16> |
694 | 422..424 '&S': &S<i8, i16> | 696 | 459..461 '&S': &S<i8, i16> |
695 | 423..424 'S': S<i8, i16> | 697 | 460..461 'S': S<i8, i16> |
696 | 434..437 'obj': &dyn Bar<usize, i8, i16> | 698 | 471..474 'obj': &dyn Bar<usize, i8, i16> |
697 | 459..462 'obj': &dyn Baz<i8, i16> | 699 | 496..499 'obj': &dyn Baz<i8, i16> |
698 | 472..475 'obj': &dyn Foo<i8, usize> | 700 | 509..512 'obj': &dyn Foo<i8, usize> |
699 | 494..497 'obj': &dyn Bar<usize, i8, i16> | 701 | 531..534 'obj': &dyn Bar<usize, i8, i16> |
700 | 507..511 'obj2': &dyn Baz<i8, i16> | 702 | 544..548 'obj2': &dyn Baz<i8, i16> |
701 | 533..535 '&S': &S<i8, i16> | 703 | 570..572 '&S': &S<i8, i16> |
702 | 534..535 'S': S<i8, i16> | 704 | 571..572 'S': S<i8, i16> |
703 | 545..546 '_': &dyn Foo<i8, usize> | 705 | 582..583 '_': &dyn Foo<i8, usize> |
704 | 565..569 'obj2': &dyn Baz<i8, i16> | 706 | 602..606 'obj2': &dyn Baz<i8, i16> |
705 | "### | 707 | "### |
706 | ); | 708 | ); |
707 | } | 709 | } |
@@ -710,6 +712,8 @@ fn test() { | |||
710 | fn coerce_unsize_super_trait_cycle() { | 712 | fn coerce_unsize_super_trait_cycle() { |
711 | assert_snapshot!( | 713 | assert_snapshot!( |
712 | infer_with_mismatches(r#" | 714 | infer_with_mismatches(r#" |
715 | #[lang = "sized"] | ||
716 | pub trait Sized {} | ||
713 | #[lang = "unsize"] | 717 | #[lang = "unsize"] |
714 | pub trait Unsize<T> {} | 718 | pub trait Unsize<T> {} |
715 | #[lang = "coerce_unsized"] | 719 | #[lang = "coerce_unsized"] |
@@ -734,12 +738,12 @@ fn test() { | |||
734 | } | 738 | } |
735 | "#, true), | 739 | "#, true), |
736 | @r###" | 740 | @r###" |
737 | 291..347 '{ ...obj; }': () | 741 | 328..384 '{ ...obj; }': () |
738 | 301..304 'obj': &dyn D | 742 | 338..341 'obj': &dyn D |
739 | 315..317 '&S': &S | 743 | 352..354 '&S': &S |
740 | 316..317 'S': S | 744 | 353..354 'S': S |
741 | 327..330 'obj': &dyn A | 745 | 364..367 'obj': &dyn A |
742 | 341..344 'obj': &dyn D | 746 | 378..381 'obj': &dyn D |
743 | "### | 747 | "### |
744 | ); | 748 | ); |
745 | } | 749 | } |
diff --git a/crates/ra_hir_ty/src/tests/traits.rs b/crates/ra_hir_ty/src/tests/traits.rs index 646e1715c..71c0c2d27 100644 --- a/crates/ra_hir_ty/src/tests/traits.rs +++ b/crates/ra_hir_ty/src/tests/traits.rs | |||
@@ -1753,11 +1753,11 @@ fn test() { | |||
1753 | 384..500 '{ ...(f); }': () | 1753 | 384..500 '{ ...(f); }': () |
1754 | 394..397 'bar': Bar<fn(u8) -> u32> | 1754 | 394..397 'bar': Bar<fn(u8) -> u32> |
1755 | 423..426 'bar': Bar<fn(u8) -> u32> | 1755 | 423..426 'bar': Bar<fn(u8) -> u32> |
1756 | 423..432 'bar.foo()': {unknown} | 1756 | 423..432 'bar.foo()': (u8, u32) |
1757 | 443..446 'opt': Opt<u8> | 1757 | 443..446 'opt': Opt<u8> |
1758 | 465..466 'f': fn(u8) -> u32 | 1758 | 465..466 'f': fn(u8) -> u32 |
1759 | 487..490 'opt': Opt<u8> | 1759 | 487..490 'opt': Opt<u8> |
1760 | 487..497 'opt.map(f)': Opt<FnOnce::Output<fn(u8) -> u32, (u8,)>> | 1760 | 487..497 'opt.map(f)': Opt<u32> |
1761 | 495..496 'f': fn(u8) -> u32 | 1761 | 495..496 'f': fn(u8) -> u32 |
1762 | "### | 1762 | "### |
1763 | ); | 1763 | ); |
@@ -1830,9 +1830,9 @@ fn test() { | |||
1830 | 634..643 'Lazy::new': fn new<Foo, fn() -> Foo>(fn() -> Foo) -> Lazy<Foo, fn() -> Foo> | 1830 | 634..643 'Lazy::new': fn new<Foo, fn() -> Foo>(fn() -> Foo) -> Lazy<Foo, fn() -> Foo> |
1831 | 634..660 'Lazy::...n_ptr)': Lazy<Foo, fn() -> Foo> | 1831 | 634..660 'Lazy::...n_ptr)': Lazy<Foo, fn() -> Foo> |
1832 | 644..659 'make_foo_fn_ptr': fn() -> Foo | 1832 | 644..659 'make_foo_fn_ptr': fn() -> Foo |
1833 | 670..672 'r2': {unknown} | 1833 | 670..672 'r2': usize |
1834 | 675..680 'lazy2': Lazy<Foo, fn() -> Foo> | 1834 | 675..680 'lazy2': Lazy<Foo, fn() -> Foo> |
1835 | 675..686 'lazy2.foo()': {unknown} | 1835 | 675..686 'lazy2.foo()': usize |
1836 | 549..551 '{}': () | 1836 | 549..551 '{}': () |
1837 | "### | 1837 | "### |
1838 | ); | 1838 | ); |
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 | ||
diff --git a/crates/ra_hir_ty/src/traits/chalk/interner.rs b/crates/ra_hir_ty/src/traits/chalk/interner.rs index 56aab640c..15426b022 100644 --- a/crates/ra_hir_ty/src/traits/chalk/interner.rs +++ b/crates/ra_hir_ty/src/traits/chalk/interner.rs | |||
@@ -42,6 +42,7 @@ impl chalk_ir::interner::Interner for Interner { | |||
42 | type DefId = InternId; | 42 | type DefId = InternId; |
43 | type InternedAdtId = crate::TypeCtorId; | 43 | type InternedAdtId = crate::TypeCtorId; |
44 | type Identifier = TypeAliasId; | 44 | type Identifier = TypeAliasId; |
45 | type FnAbi = (); | ||
45 | 46 | ||
46 | fn debug_adt_id(type_kind_id: AdtId, fmt: &mut fmt::Formatter<'_>) -> Option<fmt::Result> { | 47 | fn debug_adt_id(type_kind_id: AdtId, fmt: &mut fmt::Formatter<'_>) -> Option<fmt::Result> { |
47 | tls::with_current_program(|prog| Some(prog?.debug_struct_id(type_kind_id, fmt))) | 48 | tls::with_current_program(|prog| Some(prog?.debug_struct_id(type_kind_id, fmt))) |
diff --git a/crates/ra_hir_ty/src/traits/chalk/mapping.rs b/crates/ra_hir_ty/src/traits/chalk/mapping.rs index 18e5c9c16..ac82ea831 100644 --- a/crates/ra_hir_ty/src/traits/chalk/mapping.rs +++ b/crates/ra_hir_ty/src/traits/chalk/mapping.rs | |||
@@ -65,7 +65,10 @@ impl ToChalk for Ty { | |||
65 | &Interner, | 65 | &Interner, |
66 | predicates.iter().filter(|p| !p.is_error()).cloned().map(|p| p.to_chalk(db)), | 66 | predicates.iter().filter(|p| !p.is_error()).cloned().map(|p| p.to_chalk(db)), |
67 | ); | 67 | ); |
68 | let bounded_ty = chalk_ir::DynTy { bounds: make_binders(where_clauses, 1) }; | 68 | let bounded_ty = chalk_ir::DynTy { |
69 | bounds: make_binders(where_clauses, 1), | ||
70 | lifetime: LIFETIME_PLACEHOLDER.to_lifetime(&Interner), | ||
71 | }; | ||
69 | chalk_ir::TyData::Dyn(bounded_ty).intern(&Interner) | 72 | chalk_ir::TyData::Dyn(bounded_ty).intern(&Interner) |
70 | } | 73 | } |
71 | Ty::Opaque(opaque_ty) => { | 74 | Ty::Opaque(opaque_ty) => { |
@@ -319,6 +322,10 @@ impl ToChalk for TypeCtor { | |||
319 | // this should not be reached, since we don't represent TypeName::Error with TypeCtor | 322 | // this should not be reached, since we don't represent TypeName::Error with TypeCtor |
320 | unreachable!() | 323 | unreachable!() |
321 | } | 324 | } |
325 | TypeName::Closure(_) => { | ||
326 | // FIXME: implement closure support | ||
327 | unreachable!() | ||
328 | } | ||
322 | } | 329 | } |
323 | } | 330 | } |
324 | } | 331 | } |