aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir_ty/src/db.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_hir_ty/src/db.rs')
-rw-r--r--crates/ra_hir_ty/src/db.rs159
1 files changed, 0 insertions, 159 deletions
diff --git a/crates/ra_hir_ty/src/db.rs b/crates/ra_hir_ty/src/db.rs
deleted file mode 100644
index c773adc67..000000000
--- a/crates/ra_hir_ty/src/db.rs
+++ /dev/null
@@ -1,159 +0,0 @@
1//! FIXME: write short doc here
2
3use std::sync::Arc;
4
5use hir_def::{
6 db::DefDatabase, expr::ExprId, DefWithBodyId, FunctionId, GenericDefId, ImplId, LocalFieldId,
7 TypeParamId, VariantId,
8};
9use ra_arena::map::ArenaMap;
10use ra_db::{impl_intern_key, salsa, CrateId, Upcast};
11use ra_prof::profile;
12
13use crate::{
14 method_resolution::{InherentImpls, TraitImpls},
15 traits::chalk,
16 Binders, CallableDefId, GenericPredicate, InferenceResult, OpaqueTyId, PolyFnSig,
17 ReturnTypeImplTraits, TraitRef, Ty, TyDefId, ValueTyDefId,
18};
19use hir_expand::name::Name;
20
21#[salsa::query_group(HirDatabaseStorage)]
22pub trait HirDatabase: DefDatabase + Upcast<dyn DefDatabase> {
23 #[salsa::invoke(infer_wait)]
24 #[salsa::transparent]
25 fn infer(&self, def: DefWithBodyId) -> Arc<InferenceResult>;
26
27 #[salsa::invoke(crate::infer::infer_query)]
28 fn infer_query(&self, def: DefWithBodyId) -> Arc<InferenceResult>;
29
30 #[salsa::invoke(crate::lower::ty_query)]
31 #[salsa::cycle(crate::lower::ty_recover)]
32 fn ty(&self, def: TyDefId) -> Binders<Ty>;
33
34 #[salsa::invoke(crate::lower::value_ty_query)]
35 fn value_ty(&self, def: ValueTyDefId) -> Binders<Ty>;
36
37 #[salsa::invoke(crate::lower::impl_self_ty_query)]
38 #[salsa::cycle(crate::lower::impl_self_ty_recover)]
39 fn impl_self_ty(&self, def: ImplId) -> Binders<Ty>;
40
41 #[salsa::invoke(crate::lower::impl_trait_query)]
42 fn impl_trait(&self, def: ImplId) -> Option<Binders<TraitRef>>;
43
44 #[salsa::invoke(crate::lower::field_types_query)]
45 fn field_types(&self, var: VariantId) -> Arc<ArenaMap<LocalFieldId, Binders<Ty>>>;
46
47 #[salsa::invoke(crate::callable_item_sig)]
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>>>;
55
56 #[salsa::invoke(crate::lower::generic_predicates_for_param_query)]
57 #[salsa::cycle(crate::lower::generic_predicates_for_param_recover)]
58 fn generic_predicates_for_param(
59 &self,
60 param_id: TypeParamId,
61 ) -> Arc<[Binders<GenericPredicate>]>;
62
63 #[salsa::invoke(crate::lower::generic_predicates_query)]
64 fn generic_predicates(&self, def: GenericDefId) -> Arc<[Binders<GenericPredicate>]>;
65
66 #[salsa::invoke(crate::lower::generic_defaults_query)]
67 fn generic_defaults(&self, def: GenericDefId) -> Arc<[Binders<Ty>]>;
68
69 #[salsa::invoke(InherentImpls::inherent_impls_in_crate_query)]
70 fn inherent_impls_in_crate(&self, krate: CrateId) -> Arc<InherentImpls>;
71
72 #[salsa::invoke(TraitImpls::trait_impls_in_crate_query)]
73 fn trait_impls_in_crate(&self, krate: CrateId) -> Arc<TraitImpls>;
74
75 #[salsa::invoke(TraitImpls::trait_impls_in_deps_query)]
76 fn trait_impls_in_deps(&self, krate: CrateId) -> Arc<TraitImpls>;
77
78 // Interned IDs for Chalk integration
79 #[salsa::interned]
80 fn intern_callable_def(&self, callable_def: CallableDefId) -> InternedCallableDefId;
81 #[salsa::interned]
82 fn intern_type_param_id(&self, param_id: TypeParamId) -> GlobalTypeParamId;
83 #[salsa::interned]
84 fn intern_impl_trait_id(&self, id: OpaqueTyId) -> InternedOpaqueTyId;
85 #[salsa::interned]
86 fn intern_closure(&self, id: (DefWithBodyId, ExprId)) -> ClosureId;
87
88 #[salsa::invoke(chalk::associated_ty_data_query)]
89 fn associated_ty_data(&self, id: chalk::AssocTypeId) -> Arc<chalk::AssociatedTyDatum>;
90
91 #[salsa::invoke(chalk::trait_datum_query)]
92 fn trait_datum(&self, krate: CrateId, trait_id: chalk::TraitId) -> Arc<chalk::TraitDatum>;
93
94 #[salsa::invoke(chalk::struct_datum_query)]
95 fn struct_datum(&self, krate: CrateId, struct_id: chalk::AdtId) -> Arc<chalk::StructDatum>;
96
97 #[salsa::invoke(crate::traits::chalk::impl_datum_query)]
98 fn impl_datum(&self, krate: CrateId, impl_id: chalk::ImplId) -> Arc<chalk::ImplDatum>;
99
100 #[salsa::invoke(crate::traits::chalk::fn_def_datum_query)]
101 fn fn_def_datum(&self, krate: CrateId, fn_def_id: chalk::FnDefId) -> Arc<chalk::FnDefDatum>;
102
103 #[salsa::invoke(crate::traits::chalk::associated_ty_value_query)]
104 fn associated_ty_value(
105 &self,
106 krate: CrateId,
107 id: chalk::AssociatedTyValueId,
108 ) -> Arc<chalk::AssociatedTyValue>;
109
110 #[salsa::invoke(crate::traits::trait_solve_query)]
111 fn trait_solve(
112 &self,
113 krate: CrateId,
114 goal: crate::Canonical<crate::InEnvironment<crate::Obligation>>,
115 ) -> Option<crate::traits::Solution>;
116
117 #[salsa::invoke(crate::traits::chalk::program_clauses_for_chalk_env_query)]
118 fn program_clauses_for_chalk_env(
119 &self,
120 krate: CrateId,
121 env: chalk_ir::Environment<chalk::Interner>,
122 ) -> chalk_ir::ProgramClauses<chalk::Interner>;
123}
124
125fn infer_wait(db: &impl HirDatabase, def: DefWithBodyId) -> Arc<InferenceResult> {
126 let _p = profile("infer:wait").detail(|| match def {
127 DefWithBodyId::FunctionId(it) => db.function_data(it).name.to_string(),
128 DefWithBodyId::StaticId(it) => {
129 db.static_data(it).name.clone().unwrap_or_else(Name::missing).to_string()
130 }
131 DefWithBodyId::ConstId(it) => {
132 db.const_data(it).name.clone().unwrap_or_else(Name::missing).to_string()
133 }
134 });
135 db.infer_query(def)
136}
137
138#[test]
139fn hir_database_is_object_safe() {
140 fn _assert_object_safe(_: &dyn HirDatabase) {}
141}
142
143#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
144pub struct GlobalTypeParamId(salsa::InternId);
145impl_intern_key!(GlobalTypeParamId);
146
147#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
148pub struct InternedOpaqueTyId(salsa::InternId);
149impl_intern_key!(InternedOpaqueTyId);
150
151#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
152pub struct ClosureId(salsa::InternId);
153impl_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)]
158pub struct InternedCallableDefId(salsa::InternId);
159impl_intern_key!(InternedCallableDefId);