diff options
-rw-r--r-- | crates/ra_assists/src/handlers/add_new.rs | 1 | ||||
-rw-r--r-- | crates/ra_hir_ty/src/infer.rs | 28 | ||||
-rw-r--r-- | crates/ra_hir_ty/src/infer/expr.rs | 1 | ||||
-rw-r--r-- | crates/ra_hir_ty/src/marks.rs | 1 | ||||
-rw-r--r-- | crates/ra_hir_ty/src/tests/traits.rs | 24 |
5 files changed, 14 insertions, 41 deletions
diff --git a/crates/ra_assists/src/handlers/add_new.rs b/crates/ra_assists/src/handlers/add_new.rs index a08639311..12d63b54d 100644 --- a/crates/ra_assists/src/handlers/add_new.rs +++ b/crates/ra_assists/src/handlers/add_new.rs | |||
@@ -144,6 +144,7 @@ fn find_struct_impl(ctx: &AssistCtx, strukt: &ast::StructDef) -> Option<Option<a | |||
144 | let src = InFile { file_id: ctx.frange.file_id.into(), value: impl_blk.clone() }; | 144 | let src = InFile { file_id: ctx.frange.file_id.into(), value: impl_blk.clone() }; |
145 | let blk = sb.to_def(src)?; | 145 | let blk = sb.to_def(src)?; |
146 | 146 | ||
147 | // TODO this check doesn't work | ||
147 | let same_ty = blk.target_ty(db) == struct_ty; | 148 | let same_ty = blk.target_ty(db) == struct_ty; |
148 | let not_trait_impl = blk.target_trait(db).is_none(); | 149 | let not_trait_impl = blk.target_trait(db).is_none(); |
149 | 150 | ||
diff --git a/crates/ra_hir_ty/src/infer.rs b/crates/ra_hir_ty/src/infer.rs index 8d5b7c943..dec6bd84c 100644 --- a/crates/ra_hir_ty/src/infer.rs +++ b/crates/ra_hir_ty/src/infer.rs | |||
@@ -34,7 +34,6 @@ use hir_expand::{diagnostics::DiagnosticSink, name::name}; | |||
34 | use ra_arena::map::ArenaMap; | 34 | use ra_arena::map::ArenaMap; |
35 | use ra_prof::profile; | 35 | use ra_prof::profile; |
36 | use ra_syntax::SmolStr; | 36 | use ra_syntax::SmolStr; |
37 | use test_utils::tested_by; | ||
38 | 37 | ||
39 | use super::{ | 38 | use super::{ |
40 | primitive::{FloatTy, IntTy}, | 39 | primitive::{FloatTy, IntTy}, |
@@ -289,29 +288,6 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { | |||
289 | self.make_ty_with_mode(type_ref, ImplTraitLoweringMode::Disallowed) | 288 | self.make_ty_with_mode(type_ref, ImplTraitLoweringMode::Disallowed) |
290 | } | 289 | } |
291 | 290 | ||
292 | /// Replaces `impl Trait` in `ty` by type variables and obligations for | ||
293 | /// those variables. This is done for function arguments when calling a | ||
294 | /// function, and for return types when inside the function body, i.e. in | ||
295 | /// the cases where the `impl Trait` is 'transparent'. In other cases, `impl | ||
296 | /// Trait` is represented by `Ty::Opaque`. | ||
297 | fn insert_vars_for_impl_trait(&mut self, ty: Ty) -> Ty { | ||
298 | ty.fold(&mut |ty| match ty { | ||
299 | Ty::Opaque(preds) => { | ||
300 | tested_by!(insert_vars_for_impl_trait); | ||
301 | let var = self.table.new_type_var(); | ||
302 | let var_subst = Substs::builder(1).push(var.clone()).build(); | ||
303 | self.obligations.extend( | ||
304 | preds | ||
305 | .iter() | ||
306 | .map(|pred| pred.clone().subst_bound_vars(&var_subst)) | ||
307 | .filter_map(Obligation::from_predicate), | ||
308 | ); | ||
309 | var | ||
310 | } | ||
311 | _ => ty, | ||
312 | }) | ||
313 | } | ||
314 | |||
315 | /// Replaces Ty::Unknown by a new type var, so we can maybe still infer it. | 291 | /// Replaces Ty::Unknown by a new type var, so we can maybe still infer it. |
316 | fn insert_type_vars_shallow(&mut self, ty: Ty) -> Ty { | 292 | fn insert_type_vars_shallow(&mut self, ty: Ty) -> Ty { |
317 | match ty { | 293 | match ty { |
@@ -487,8 +463,8 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { | |||
487 | 463 | ||
488 | self.infer_pat(*pat, &ty, BindingMode::default()); | 464 | self.infer_pat(*pat, &ty, BindingMode::default()); |
489 | } | 465 | } |
490 | let return_ty = self.make_ty_with_mode(&data.ret_type, ImplTraitLoweringMode::Variable); | 466 | let return_ty = self.make_ty_with_mode(&data.ret_type, ImplTraitLoweringMode::Disallowed); // FIXME implement RPIT |
491 | self.return_ty = self.insert_vars_for_impl_trait(return_ty); | 467 | self.return_ty = return_ty; |
492 | } | 468 | } |
493 | 469 | ||
494 | fn infer_body(&mut self) { | 470 | fn infer_body(&mut self) { |
diff --git a/crates/ra_hir_ty/src/infer/expr.rs b/crates/ra_hir_ty/src/infer/expr.rs index b69785e55..6222bd90e 100644 --- a/crates/ra_hir_ty/src/infer/expr.rs +++ b/crates/ra_hir_ty/src/infer/expr.rs | |||
@@ -635,7 +635,6 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> { | |||
635 | continue; | 635 | continue; |
636 | } | 636 | } |
637 | 637 | ||
638 | let param_ty = self.insert_vars_for_impl_trait(param_ty); | ||
639 | let param_ty = self.normalize_associated_types_in(param_ty); | 638 | let param_ty = self.normalize_associated_types_in(param_ty); |
640 | self.infer_expr_coerce(arg, &Expectation::has_type(param_ty.clone())); | 639 | self.infer_expr_coerce(arg, &Expectation::has_type(param_ty.clone())); |
641 | } | 640 | } |
diff --git a/crates/ra_hir_ty/src/marks.rs b/crates/ra_hir_ty/src/marks.rs index fe74acf11..0f754eb9c 100644 --- a/crates/ra_hir_ty/src/marks.rs +++ b/crates/ra_hir_ty/src/marks.rs | |||
@@ -6,5 +6,4 @@ test_utils::marks!( | |||
6 | type_var_resolves_to_int_var | 6 | type_var_resolves_to_int_var |
7 | match_ergonomics_ref | 7 | match_ergonomics_ref |
8 | coerce_merge_fail_fallback | 8 | coerce_merge_fail_fallback |
9 | insert_vars_for_impl_trait | ||
10 | ); | 9 | ); |
diff --git a/crates/ra_hir_ty/src/tests/traits.rs b/crates/ra_hir_ty/src/tests/traits.rs index bae5eae07..134cea8d8 100644 --- a/crates/ra_hir_ty/src/tests/traits.rs +++ b/crates/ra_hir_ty/src/tests/traits.rs | |||
@@ -1,7 +1,6 @@ | |||
1 | use insta::assert_snapshot; | 1 | use insta::assert_snapshot; |
2 | 2 | ||
3 | use ra_db::fixture::WithFixture; | 3 | use ra_db::fixture::WithFixture; |
4 | use test_utils::covers; | ||
5 | 4 | ||
6 | use super::{infer, infer_with_mismatches, type_at, type_at_pos}; | 5 | use super::{infer, infer_with_mismatches, type_at, type_at_pos}; |
7 | use crate::test_db::TestDB; | 6 | use crate::test_db::TestDB; |
@@ -1650,7 +1649,6 @@ fn test<T, U>() where T: Trait<U::Item>, U: Trait<T::Item> { | |||
1650 | 1649 | ||
1651 | #[test] | 1650 | #[test] |
1652 | fn unify_impl_trait() { | 1651 | fn unify_impl_trait() { |
1653 | covers!(insert_vars_for_impl_trait); | ||
1654 | assert_snapshot!( | 1652 | assert_snapshot!( |
1655 | infer_with_mismatches(r#" | 1653 | infer_with_mismatches(r#" |
1656 | trait Trait<T> {} | 1654 | trait Trait<T> {} |
@@ -1682,26 +1680,26 @@ fn test() -> impl Trait<i32> { | |||
1682 | [172; 183) '{ loop {} }': T | 1680 | [172; 183) '{ loop {} }': T |
1683 | [174; 181) 'loop {}': ! | 1681 | [174; 181) 'loop {}': ! |
1684 | [179; 181) '{}': () | 1682 | [179; 181) '{}': () |
1685 | [214; 310) '{ ...t()) }': S<i32> | 1683 | [214; 310) '{ ...t()) }': S<{unknown}> |
1686 | [224; 226) 's1': S<u32> | 1684 | [224; 226) 's1': S<u32> |
1687 | [229; 230) 'S': S<u32>(T) -> S<T> | 1685 | [229; 230) 'S': S<u32>(u32) -> S<u32> |
1688 | [229; 241) 'S(default())': S<u32> | 1686 | [229; 241) 'S(default())': S<u32> |
1689 | [231; 238) 'default': fn default<u32>() -> T | 1687 | [231; 238) 'default': fn default<u32>() -> u32 |
1690 | [231; 240) 'default()': u32 | 1688 | [231; 240) 'default()': u32 |
1691 | [247; 250) 'foo': fn foo(impl Trait<u32>) -> () | 1689 | [247; 250) 'foo': fn foo<S<u32>>(S<u32>) -> () |
1692 | [247; 254) 'foo(s1)': () | 1690 | [247; 254) 'foo(s1)': () |
1693 | [251; 253) 's1': S<u32> | 1691 | [251; 253) 's1': S<u32> |
1694 | [264; 265) 'x': i32 | 1692 | [264; 265) 'x': i32 |
1695 | [273; 276) 'bar': fn bar<i32>(impl Trait<T>) -> T | 1693 | [273; 276) 'bar': fn bar<i32, S<i32>>(S<i32>) -> i32 |
1696 | [273; 290) 'bar(S(...lt()))': i32 | 1694 | [273; 290) 'bar(S(...lt()))': i32 |
1697 | [277; 278) 'S': S<i32>(T) -> S<T> | 1695 | [277; 278) 'S': S<i32>(i32) -> S<i32> |
1698 | [277; 289) 'S(default())': S<i32> | 1696 | [277; 289) 'S(default())': S<i32> |
1699 | [279; 286) 'default': fn default<i32>() -> T | 1697 | [279; 286) 'default': fn default<i32>() -> i32 |
1700 | [279; 288) 'default()': i32 | 1698 | [279; 288) 'default()': i32 |
1701 | [296; 297) 'S': S<i32>(T) -> S<T> | 1699 | [296; 297) 'S': S<{unknown}>({unknown}) -> S<{unknown}> |
1702 | [296; 308) 'S(default())': S<i32> | 1700 | [296; 308) 'S(default())': S<{unknown}> |
1703 | [298; 305) 'default': fn default<i32>() -> T | 1701 | [298; 305) 'default': fn default<{unknown}>() -> {unknown} |
1704 | [298; 307) 'default()': i32 | 1702 | [298; 307) 'default()': {unknown} |
1705 | "### | 1703 | "### |
1706 | ); | 1704 | ); |
1707 | } | 1705 | } |