aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir_ty/src/lower.rs
diff options
context:
space:
mode:
authorAleksey Kladov <[email protected]>2019-11-27 19:12:09 +0000
committerAleksey Kladov <[email protected]>2019-11-27 19:12:09 +0000
commit8d3469682681d5b206d5ae31fc63fb97d9cedb3a (patch)
treee575e72ac9a441b5f9d6112087dab201e9a506ac /crates/ra_hir_ty/src/lower.rs
parent27b362b05910c81fd5b28f6cd5d2c075311032f9 (diff)
Memoize impl resolutions
Diffstat (limited to 'crates/ra_hir_ty/src/lower.rs')
-rw-r--r--crates/ra_hir_ty/src/lower.rs35
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};
20use ra_arena::map::ArenaMap; 20use ra_arena::map::ArenaMap;
21use ra_db::CrateId; 21use ra_db::CrateId;
22 22
23use super::{
24 FnSig, GenericPredicate, ProjectionPredicate, ProjectionTy, Substs, TraitEnvironment, TraitRef,
25 Ty, TypeCtor, TypeWalk,
26};
27use crate::{ 23use 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
34impl Ty { 34impl 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
751pub(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}