diff options
Diffstat (limited to 'crates/ra_hir_ty/src/db.rs')
-rw-r--r-- | crates/ra_hir_ty/src/db.rs | 61 |
1 files changed, 38 insertions, 23 deletions
diff --git a/crates/ra_hir_ty/src/db.rs b/crates/ra_hir_ty/src/db.rs index 0a8bb24ac..c773adc67 100644 --- a/crates/ra_hir_ty/src/db.rs +++ b/crates/ra_hir_ty/src/db.rs | |||
@@ -3,23 +3,22 @@ | |||
3 | use std::sync::Arc; | 3 | use std::sync::Arc; |
4 | 4 | ||
5 | use hir_def::{ | 5 | use hir_def::{ |
6 | db::DefDatabase, DefWithBodyId, GenericDefId, ImplId, LocalFieldId, TraitId, TypeParamId, | 6 | db::DefDatabase, expr::ExprId, DefWithBodyId, FunctionId, GenericDefId, ImplId, LocalFieldId, |
7 | VariantId, | 7 | TypeParamId, VariantId, |
8 | }; | 8 | }; |
9 | use ra_arena::map::ArenaMap; | 9 | use ra_arena::map::ArenaMap; |
10 | use ra_db::{impl_intern_key, salsa, CrateId, Upcast}; | 10 | use ra_db::{impl_intern_key, salsa, CrateId, Upcast}; |
11 | use ra_prof::profile; | 11 | use ra_prof::profile; |
12 | 12 | ||
13 | use crate::{ | 13 | use crate::{ |
14 | method_resolution::{CrateImplDefs, TyFingerprint}, | 14 | method_resolution::{InherentImpls, TraitImpls}, |
15 | traits::{chalk, AssocTyValue, Impl}, | 15 | traits::chalk, |
16 | Binders, CallableDef, GenericPredicate, InferenceResult, PolyFnSig, Substs, TraitRef, Ty, | 16 | Binders, CallableDefId, GenericPredicate, InferenceResult, OpaqueTyId, PolyFnSig, |
17 | TyDefId, TypeCtor, ValueTyDefId, | 17 | ReturnTypeImplTraits, TraitRef, Ty, TyDefId, ValueTyDefId, |
18 | }; | 18 | }; |
19 | use hir_expand::name::Name; | 19 | use hir_expand::name::Name; |
20 | 20 | ||
21 | #[salsa::query_group(HirDatabaseStorage)] | 21 | #[salsa::query_group(HirDatabaseStorage)] |
22 | #[salsa::requires(salsa::Database)] | ||
23 | pub trait HirDatabase: DefDatabase + Upcast<dyn DefDatabase> { | 22 | pub trait HirDatabase: DefDatabase + Upcast<dyn DefDatabase> { |
24 | #[salsa::invoke(infer_wait)] | 23 | #[salsa::invoke(infer_wait)] |
25 | #[salsa::transparent] | 24 | #[salsa::transparent] |
@@ -46,7 +45,13 @@ pub trait HirDatabase: DefDatabase + Upcast<dyn DefDatabase> { | |||
46 | fn field_types(&self, var: VariantId) -> Arc<ArenaMap<LocalFieldId, Binders<Ty>>>; | 45 | fn field_types(&self, var: VariantId) -> Arc<ArenaMap<LocalFieldId, Binders<Ty>>>; |
47 | 46 | ||
48 | #[salsa::invoke(crate::callable_item_sig)] | 47 | #[salsa::invoke(crate::callable_item_sig)] |
49 | fn callable_item_signature(&self, def: CallableDef) -> PolyFnSig; | 48 | fn callable_item_signature(&self, def: CallableDefId) -> PolyFnSig; |
49 | |||
50 | #[salsa::invoke(crate::lower::return_type_impl_traits)] | ||
51 | fn return_type_impl_traits( | ||
52 | &self, | ||
53 | def: FunctionId, | ||
54 | ) -> Option<Arc<Binders<ReturnTypeImplTraits>>>; | ||
50 | 55 | ||
51 | #[salsa::invoke(crate::lower::generic_predicates_for_param_query)] | 56 | #[salsa::invoke(crate::lower::generic_predicates_for_param_query)] |
52 | #[salsa::cycle(crate::lower::generic_predicates_for_param_recover)] | 57 | #[salsa::cycle(crate::lower::generic_predicates_for_param_recover)] |
@@ -59,30 +64,26 @@ pub trait HirDatabase: DefDatabase + Upcast<dyn DefDatabase> { | |||
59 | fn generic_predicates(&self, def: GenericDefId) -> Arc<[Binders<GenericPredicate>]>; | 64 | fn generic_predicates(&self, def: GenericDefId) -> Arc<[Binders<GenericPredicate>]>; |
60 | 65 | ||
61 | #[salsa::invoke(crate::lower::generic_defaults_query)] | 66 | #[salsa::invoke(crate::lower::generic_defaults_query)] |
62 | fn generic_defaults(&self, def: GenericDefId) -> Substs; | 67 | fn generic_defaults(&self, def: GenericDefId) -> Arc<[Binders<Ty>]>; |
63 | 68 | ||
64 | #[salsa::invoke(crate::method_resolution::CrateImplDefs::impls_in_crate_query)] | 69 | #[salsa::invoke(InherentImpls::inherent_impls_in_crate_query)] |
65 | fn impls_in_crate(&self, krate: CrateId) -> Arc<CrateImplDefs>; | 70 | fn inherent_impls_in_crate(&self, krate: CrateId) -> Arc<InherentImpls>; |
66 | 71 | ||
67 | #[salsa::invoke(crate::traits::impls_for_trait_query)] | 72 | #[salsa::invoke(TraitImpls::trait_impls_in_crate_query)] |
68 | fn impls_for_trait( | 73 | fn trait_impls_in_crate(&self, krate: CrateId) -> Arc<TraitImpls>; |
69 | &self, | 74 | |
70 | krate: CrateId, | 75 | #[salsa::invoke(TraitImpls::trait_impls_in_deps_query)] |
71 | trait_: TraitId, | 76 | fn trait_impls_in_deps(&self, krate: CrateId) -> Arc<TraitImpls>; |
72 | self_ty_fp: Option<TyFingerprint>, | ||
73 | ) -> Arc<[ImplId]>; | ||
74 | 77 | ||
75 | // Interned IDs for Chalk integration | 78 | // Interned IDs for Chalk integration |
76 | #[salsa::interned] | 79 | #[salsa::interned] |
77 | fn intern_type_ctor(&self, type_ctor: TypeCtor) -> crate::TypeCtorId; | 80 | fn intern_callable_def(&self, callable_def: CallableDefId) -> InternedCallableDefId; |
78 | #[salsa::interned] | ||
79 | fn intern_callable_def(&self, callable_def: CallableDef) -> crate::CallableDefId; | ||
80 | #[salsa::interned] | 81 | #[salsa::interned] |
81 | fn intern_type_param_id(&self, param_id: TypeParamId) -> GlobalTypeParamId; | 82 | fn intern_type_param_id(&self, param_id: TypeParamId) -> GlobalTypeParamId; |
82 | #[salsa::interned] | 83 | #[salsa::interned] |
83 | fn intern_chalk_impl(&self, impl_: Impl) -> crate::traits::GlobalImplId; | 84 | fn intern_impl_trait_id(&self, id: OpaqueTyId) -> InternedOpaqueTyId; |
84 | #[salsa::interned] | 85 | #[salsa::interned] |
85 | fn intern_assoc_ty_value(&self, assoc_ty_value: AssocTyValue) -> crate::traits::AssocTyValueId; | 86 | fn intern_closure(&self, id: (DefWithBodyId, ExprId)) -> ClosureId; |
86 | 87 | ||
87 | #[salsa::invoke(chalk::associated_ty_data_query)] | 88 | #[salsa::invoke(chalk::associated_ty_data_query)] |
88 | fn associated_ty_data(&self, id: chalk::AssocTypeId) -> Arc<chalk::AssociatedTyDatum>; | 89 | fn associated_ty_data(&self, id: chalk::AssocTypeId) -> Arc<chalk::AssociatedTyDatum>; |
@@ -142,3 +143,17 @@ fn hir_database_is_object_safe() { | |||
142 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] | 143 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] |
143 | pub struct GlobalTypeParamId(salsa::InternId); | 144 | pub struct GlobalTypeParamId(salsa::InternId); |
144 | impl_intern_key!(GlobalTypeParamId); | 145 | impl_intern_key!(GlobalTypeParamId); |
146 | |||
147 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] | ||
148 | pub struct InternedOpaqueTyId(salsa::InternId); | ||
149 | impl_intern_key!(InternedOpaqueTyId); | ||
150 | |||
151 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] | ||
152 | pub struct ClosureId(salsa::InternId); | ||
153 | impl_intern_key!(ClosureId); | ||
154 | |||
155 | /// This exists just for Chalk, because Chalk just has a single `FnDefId` where | ||
156 | /// we have different IDs for struct and enum variant constructors. | ||
157 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Ord, PartialOrd)] | ||
158 | pub struct InternedCallableDefId(salsa::InternId); | ||
159 | impl_intern_key!(InternedCallableDefId); | ||