aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src/ty/lower.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_hir/src/ty/lower.rs')
-rw-r--r--crates/ra_hir/src/ty/lower.rs32
1 files changed, 17 insertions, 15 deletions
diff --git a/crates/ra_hir/src/ty/lower.rs b/crates/ra_hir/src/ty/lower.rs
index 2d23890a5..805a73ff5 100644
--- a/crates/ra_hir/src/ty/lower.rs
+++ b/crates/ra_hir/src/ty/lower.rs
@@ -28,6 +28,7 @@ use crate::{
28 db::HirDatabase, 28 db::HirDatabase,
29 ty::{ 29 ty::{
30 primitive::{FloatTy, IntTy}, 30 primitive::{FloatTy, IntTy},
31 utils::{all_super_traits, associated_type_by_name_including_super_traits},
31 Adt, 32 Adt,
32 }, 33 },
33 util::make_mut_slice, 34 util::make_mut_slice,
@@ -169,14 +170,16 @@ impl Ty {
169 ); 170 );
170 return if remaining_segments.len() == 1 { 171 return if remaining_segments.len() == 1 {
171 let segment = &remaining_segments[0]; 172 let segment = &remaining_segments[0];
172 match trait_ref 173 let associated_ty = associated_type_by_name_including_super_traits(
173 .trait_ 174 db,
174 .associated_type_by_name_including_super_traits(db, &segment.name) 175 trait_ref.trait_.id,
175 { 176 &segment.name,
177 );
178 match associated_ty {
176 Some(associated_ty) => { 179 Some(associated_ty) => {
177 // FIXME handle type parameters on the segment 180 // FIXME handle type parameters on the segment
178 Ty::Projection(ProjectionTy { 181 Ty::Projection(ProjectionTy {
179 associated_ty: associated_ty.id, 182 associated_ty,
180 parameters: trait_ref.substs, 183 parameters: trait_ref.substs,
181 }) 184 })
182 } 185 }
@@ -260,18 +263,16 @@ impl Ty {
260 GenericPredicate::Implemented(tr) if tr.self_ty() == &self_ty => Some(tr.trait_), 263 GenericPredicate::Implemented(tr) if tr.self_ty() == &self_ty => Some(tr.trait_),
261 _ => None, 264 _ => None,
262 }); 265 });
263 let traits = traits_from_env.flat_map(|t| t.all_super_traits(db)); 266 let traits = traits_from_env.flat_map(|t| all_super_traits(db, t.id)).map(Trait::from);
264 for t in traits { 267 for t in traits {
265 if let Some(associated_ty) = t.associated_type_by_name(db, &segment.name) { 268 if let Some(associated_ty) = db.trait_data(t.id).associated_type_by_name(&segment.name)
269 {
266 let substs = Substs::build_for_def(db, t.id) 270 let substs = Substs::build_for_def(db, t.id)
267 .push(self_ty.clone()) 271 .push(self_ty.clone())
268 .fill_with_unknown() 272 .fill_with_unknown()
269 .build(); 273 .build();
270 // FIXME handle type parameters on the segment 274 // FIXME handle type parameters on the segment
271 return Ty::Projection(ProjectionTy { 275 return Ty::Projection(ProjectionTy { associated_ty, parameters: substs });
272 associated_ty: associated_ty.id,
273 parameters: substs,
274 });
275 } 276 }
276 } 277 }
277 Ty::Unknown 278 Ty::Unknown
@@ -509,10 +510,11 @@ fn assoc_type_bindings_from_type_bound<'a>(
509 .flat_map(|args_and_bindings| args_and_bindings.bindings.iter()) 510 .flat_map(|args_and_bindings| args_and_bindings.bindings.iter())
510 .map(move |(name, type_ref)| { 511 .map(move |(name, type_ref)| {
511 let associated_ty = 512 let associated_ty =
512 match trait_ref.trait_.associated_type_by_name_including_super_traits(db, &name) { 513 associated_type_by_name_including_super_traits(db, trait_ref.trait_.id, &name);
513 None => return GenericPredicate::Error, 514 let associated_ty = match associated_ty {
514 Some(t) => t.id, 515 None => return GenericPredicate::Error,
515 }; 516 Some(t) => t,
517 };
516 let projection_ty = 518 let projection_ty =
517 ProjectionTy { associated_ty, parameters: trait_ref.substs.clone() }; 519 ProjectionTy { associated_ty, parameters: trait_ref.substs.clone() };
518 let ty = Ty::from_hir(db, resolver, type_ref); 520 let ty = Ty::from_hir(db, resolver, type_ref);