diff options
Diffstat (limited to 'crates/ra_hir/src/ty/autoderef.rs')
-rw-r--r-- | crates/ra_hir/src/ty/autoderef.rs | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/crates/ra_hir/src/ty/autoderef.rs b/crates/ra_hir/src/ty/autoderef.rs index 94f8ecdc9..02492ca14 100644 --- a/crates/ra_hir/src/ty/autoderef.rs +++ b/crates/ra_hir/src/ty/autoderef.rs | |||
@@ -7,7 +7,7 @@ use std::iter::successors; | |||
7 | 7 | ||
8 | use log::{info, warn}; | 8 | use log::{info, warn}; |
9 | 9 | ||
10 | use super::{traits::Solution, Canonical, Ty, TypeWalk}; | 10 | use super::{traits::Solution, Canonical, Substs, Ty, TypeWalk}; |
11 | use crate::{db::HirDatabase, name, HasGenericParams, Resolver}; | 11 | use crate::{db::HirDatabase, name, HasGenericParams, Resolver}; |
12 | 12 | ||
13 | const AUTODEREF_RECURSION_LIMIT: usize = 10; | 13 | const AUTODEREF_RECURSION_LIMIT: usize = 10; |
@@ -44,7 +44,8 @@ fn deref_by_trait( | |||
44 | }; | 44 | }; |
45 | let target = deref_trait.associated_type_by_name(db, &name::TARGET_TYPE)?; | 45 | let target = deref_trait.associated_type_by_name(db, &name::TARGET_TYPE)?; |
46 | 46 | ||
47 | if target.generic_params(db).count_params_including_parent() != 1 { | 47 | let generic_params = target.generic_params(db); |
48 | if generic_params.count_params_including_parent() != 1 { | ||
48 | // the Target type + Deref trait should only have one generic parameter, | 49 | // the Target type + Deref trait should only have one generic parameter, |
49 | // namely Deref's Self type | 50 | // namely Deref's Self type |
50 | return None; | 51 | return None; |
@@ -54,12 +55,13 @@ fn deref_by_trait( | |||
54 | 55 | ||
55 | let env = super::lower::trait_env(db, resolver); | 56 | let env = super::lower::trait_env(db, resolver); |
56 | 57 | ||
58 | let parameters = Substs::build_for_generics(&generic_params) | ||
59 | .push(ty.value.clone().shift_bound_vars(1)) | ||
60 | .build(); | ||
61 | |||
57 | let projection = super::traits::ProjectionPredicate { | 62 | let projection = super::traits::ProjectionPredicate { |
58 | ty: Ty::Bound(0), | 63 | ty: Ty::Bound(0), |
59 | projection_ty: super::ProjectionTy { | 64 | projection_ty: super::ProjectionTy { associated_ty: target, parameters }, |
60 | associated_ty: target, | ||
61 | parameters: vec![ty.value.clone().shift_bound_vars(1)].into(), | ||
62 | }, | ||
63 | }; | 65 | }; |
64 | 66 | ||
65 | let obligation = super::Obligation::Projection(projection); | 67 | let obligation = super::Obligation::Projection(projection); |