aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir_ty
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_hir_ty')
-rw-r--r--crates/ra_hir_ty/Cargo.toml4
-rw-r--r--crates/ra_hir_ty/src/tests/coercion.rs42
-rw-r--r--crates/ra_hir_ty/src/tests/traits.rs8
-rw-r--r--crates/ra_hir_ty/src/traits/chalk.rs86
-rw-r--r--crates/ra_hir_ty/src/traits/chalk/interner.rs1
-rw-r--r--crates/ra_hir_ty/src/traits/chalk/mapping.rs9
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
28scoped-tls = "1" 28scoped-tls = "1"
29 29
30chalk-solve = "0.11" 30chalk-solve = { version = "0.15.0-dev.0", git = "https://github.com/rust-lang/chalk" }
31chalk-ir = "0.11" 31chalk-ir = { version = "0.15.0-dev.0", git = "https://github.com/rust-lang/chalk" }
32 32
33[dev-dependencies] 33[dev-dependencies]
34insta = "0.16.0" 34insta = "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() {
664fn coerce_unsize_trait_object() { 664fn coerce_unsize_trait_object() {
665 assert_snapshot!( 665 assert_snapshot!(
666 infer_with_mismatches(r#" 666 infer_with_mismatches(r#"
667#[lang = "sized"]
668pub trait Sized {}
667#[lang = "unsize"] 669#[lang = "unsize"]
668pub trait Unsize<T> {} 670pub 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() {
710fn coerce_unsize_super_trait_cycle() { 712fn coerce_unsize_super_trait_cycle() {
711 assert_snapshot!( 713 assert_snapshot!(
712 infer_with_mismatches(r#" 714 infer_with_mismatches(r#"
715#[lang = "sized"]
716pub trait Sized {}
713#[lang = "unsize"] 717#[lang = "unsize"]
714pub trait Unsize<T> {} 718pub 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
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
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}