diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2019-11-26 14:45:31 +0000 |
---|---|---|
committer | GitHub <[email protected]> | 2019-11-26 14:45:31 +0000 |
commit | 6560e4ff2eae4e54384896d6ae100f1d2df20518 (patch) | |
tree | 4d6767c90e5ac4ec5d6f6149e434ebf09dfa82be /crates/ra_hir/src/ty/lower.rs | |
parent | 4d753fa6f514ea1105c25ace91201c5324ee0b92 (diff) | |
parent | 24b1e79af51f5af76047a5eee2fe90baf100afca (diff) |
Merge #2413
2413: Remove another helper r=matklad a=matklad
Co-authored-by: Aleksey Kladov <[email protected]>
Diffstat (limited to 'crates/ra_hir/src/ty/lower.rs')
-rw-r--r-- | crates/ra_hir/src/ty/lower.rs | 32 |
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); |