diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2019-11-27 19:13:34 +0000 |
---|---|---|
committer | GitHub <[email protected]> | 2019-11-27 19:13:34 +0000 |
commit | 385899d2f084ce688324a3db24e71b8b9f55d6e6 (patch) | |
tree | e575e72ac9a441b5f9d6112087dab201e9a506ac /crates/ra_hir_ty/src/lower.rs | |
parent | 360f6b7bb32d6280ed787075c4a54f4e5b46fcb6 (diff) | |
parent | 8d3469682681d5b206d5ae31fc63fb97d9cedb3a (diff) |
Merge #2431
2431: Memoize impl resolutions r=matklad a=matklad
Co-authored-by: Aleksey Kladov <[email protected]>
Diffstat (limited to 'crates/ra_hir_ty/src/lower.rs')
-rw-r--r-- | crates/ra_hir_ty/src/lower.rs | 35 |
1 files changed, 23 insertions, 12 deletions
diff --git a/crates/ra_hir_ty/src/lower.rs b/crates/ra_hir_ty/src/lower.rs index 53d955a12..f8331d257 100644 --- a/crates/ra_hir_ty/src/lower.rs +++ b/crates/ra_hir_ty/src/lower.rs | |||
@@ -14,21 +14,21 @@ use hir_def::{ | |||
14 | path::{GenericArg, Path, PathKind, PathSegment}, | 14 | path::{GenericArg, Path, PathKind, PathSegment}, |
15 | resolver::{HasResolver, Resolver, TypeNs}, | 15 | resolver::{HasResolver, Resolver, TypeNs}, |
16 | type_ref::{TypeBound, TypeRef}, | 16 | type_ref::{TypeBound, TypeRef}, |
17 | AdtId, AstItemDef, ConstId, EnumId, EnumVariantId, FunctionId, GenericDefId, HasModule, | 17 | AdtId, AstItemDef, ConstId, EnumId, EnumVariantId, FunctionId, GenericDefId, HasModule, ImplId, |
18 | LocalStructFieldId, Lookup, StaticId, StructId, TraitId, TypeAliasId, UnionId, VariantId, | 18 | LocalStructFieldId, Lookup, StaticId, StructId, TraitId, TypeAliasId, UnionId, VariantId, |
19 | }; | 19 | }; |
20 | use ra_arena::map::ArenaMap; | 20 | use ra_arena::map::ArenaMap; |
21 | use ra_db::CrateId; | 21 | use ra_db::CrateId; |
22 | 22 | ||
23 | use super::{ | ||
24 | FnSig, GenericPredicate, ProjectionPredicate, ProjectionTy, Substs, TraitEnvironment, TraitRef, | ||
25 | Ty, TypeCtor, TypeWalk, | ||
26 | }; | ||
27 | use crate::{ | 23 | use crate::{ |
28 | db::HirDatabase, | 24 | db::HirDatabase, |
29 | primitive::{FloatTy, IntTy}, | 25 | primitive::{FloatTy, IntTy}, |
30 | utils::make_mut_slice, | 26 | utils::{ |
31 | utils::{all_super_traits, associated_type_by_name_including_super_traits, variant_data}, | 27 | all_super_traits, associated_type_by_name_including_super_traits, make_mut_slice, |
28 | variant_data, | ||
29 | }, | ||
30 | FnSig, GenericPredicate, ImplTy, ProjectionPredicate, ProjectionTy, Substs, TraitEnvironment, | ||
31 | TraitRef, Ty, TypeCtor, TypeWalk, | ||
32 | }; | 32 | }; |
33 | 33 | ||
34 | impl Ty { | 34 | impl Ty { |
@@ -179,11 +179,7 @@ impl Ty { | |||
179 | let name = resolved_segment.name.clone(); | 179 | let name = resolved_segment.name.clone(); |
180 | Ty::Param { idx, name } | 180 | Ty::Param { idx, name } |
181 | } | 181 | } |
182 | TypeNs::SelfType(impl_id) => { | 182 | TypeNs::SelfType(impl_id) => db.impl_ty(impl_id).self_type().clone(), |
183 | let impl_data = db.impl_data(impl_id); | ||
184 | let resolver = impl_id.resolver(db); | ||
185 | Ty::from_hir(db, &resolver, &impl_data.target_type) | ||
186 | } | ||
187 | TypeNs::AdtSelfType(adt) => db.ty(adt.into()), | 183 | TypeNs::AdtSelfType(adt) => db.ty(adt.into()), |
188 | 184 | ||
189 | TypeNs::AdtId(it) => Ty::from_hir_path_inner(db, resolver, resolved_segment, it.into()), | 185 | TypeNs::AdtId(it) => Ty::from_hir_path_inner(db, resolver, resolved_segment, it.into()), |
@@ -751,3 +747,18 @@ pub(crate) fn value_ty_query(db: &impl HirDatabase, def: ValueTyDefId) -> Ty { | |||
751 | ValueTyDefId::StaticId(it) => type_for_static(db, it), | 747 | ValueTyDefId::StaticId(it) => type_for_static(db, it), |
752 | } | 748 | } |
753 | } | 749 | } |
750 | |||
751 | pub(crate) fn impl_ty_query(db: &impl HirDatabase, impl_id: ImplId) -> ImplTy { | ||
752 | let impl_data = db.impl_data(impl_id); | ||
753 | let resolver = impl_id.resolver(db); | ||
754 | let self_ty = Ty::from_hir(db, &resolver, &impl_data.target_type); | ||
755 | match impl_data.target_trait.as_ref() { | ||
756 | Some(trait_ref) => { | ||
757 | match TraitRef::from_hir(db, &resolver, trait_ref, Some(self_ty.clone())) { | ||
758 | Some(it) => ImplTy::TraitRef(it), | ||
759 | None => ImplTy::Inherent(self_ty), | ||
760 | } | ||
761 | } | ||
762 | None => ImplTy::Inherent(self_ty), | ||
763 | } | ||
764 | } | ||