]>
Commit | Line | Data |
---|---|---|
064997fb FG |
1 | //! The home of `HirDatabase`, which is the Salsa database containing all the |
2 | //! type inference-related queries. | |
3 | ||
fe692bf9 | 4 | use std::sync; |
064997fb | 5 | |
064997fb FG |
6 | use base_db::{impl_intern_key, salsa, CrateId, Upcast}; |
7 | use hir_def::{ | |
fe692bf9 FG |
8 | db::DefDatabase, hir::ExprId, layout::TargetDataLayout, AdtId, BlockId, ConstParamId, |
9 | DefWithBodyId, EnumVariantId, FunctionId, GeneralConstId, GenericDefId, ImplId, | |
10 | LifetimeParamId, LocalFieldId, StaticId, TypeOrConstParamId, VariantId, | |
064997fb FG |
11 | }; |
12 | use la_arena::ArenaMap; | |
9c376795 | 13 | use smallvec::SmallVec; |
fe692bf9 | 14 | use triomphe::Arc; |
064997fb FG |
15 | |
16 | use crate::{ | |
17 | chalk_db, | |
353b0b11 | 18 | consteval::ConstEvalError, |
fe692bf9 | 19 | layout::{Layout, LayoutError}, |
064997fb | 20 | method_resolution::{InherentImpls, TraitImpls, TyFingerprint}, |
353b0b11 | 21 | mir::{BorrowckResult, MirBody, MirLowerError}, |
fe692bf9 | 22 | Binders, CallableDefId, ClosureId, Const, FnDefId, GenericArg, ImplTraitId, InferenceResult, |
4b012472 FG |
23 | Interner, PolyFnSig, QuantifiedWhereClause, ReturnTypeImplTraits, Substitution, |
24 | TraitEnvironment, TraitRef, Ty, TyDefId, ValueTyDefId, | |
064997fb FG |
25 | }; |
26 | use hir_expand::name::Name; | |
27 | ||
28 | #[salsa::query_group(HirDatabaseStorage)] | |
29 | pub trait HirDatabase: DefDatabase + Upcast<dyn DefDatabase> { | |
30 | #[salsa::invoke(infer_wait)] | |
31 | #[salsa::transparent] | |
32 | fn infer(&self, def: DefWithBodyId) -> Arc<InferenceResult>; | |
33 | ||
34 | #[salsa::invoke(crate::infer::infer_query)] | |
35 | fn infer_query(&self, def: DefWithBodyId) -> Arc<InferenceResult>; | |
36 | ||
353b0b11 FG |
37 | #[salsa::invoke(crate::mir::mir_body_query)] |
38 | #[salsa::cycle(crate::mir::mir_body_recover)] | |
39 | fn mir_body(&self, def: DefWithBodyId) -> Result<Arc<MirBody>, MirLowerError>; | |
40 | ||
fe692bf9 FG |
41 | #[salsa::invoke(crate::mir::mir_body_for_closure_query)] |
42 | fn mir_body_for_closure(&self, def: ClosureId) -> Result<Arc<MirBody>, MirLowerError>; | |
43 | ||
44 | #[salsa::invoke(crate::mir::monomorphized_mir_body_query)] | |
45 | #[salsa::cycle(crate::mir::monomorphized_mir_body_recover)] | |
46 | fn monomorphized_mir_body( | |
47 | &self, | |
48 | def: DefWithBodyId, | |
49 | subst: Substitution, | |
4b012472 | 50 | env: Arc<TraitEnvironment>, |
fe692bf9 FG |
51 | ) -> Result<Arc<MirBody>, MirLowerError>; |
52 | ||
53 | #[salsa::invoke(crate::mir::monomorphized_mir_body_for_closure_query)] | |
54 | fn monomorphized_mir_body_for_closure( | |
55 | &self, | |
56 | def: ClosureId, | |
57 | subst: Substitution, | |
4b012472 | 58 | env: Arc<TraitEnvironment>, |
fe692bf9 FG |
59 | ) -> Result<Arc<MirBody>, MirLowerError>; |
60 | ||
353b0b11 | 61 | #[salsa::invoke(crate::mir::borrowck_query)] |
fe692bf9 | 62 | fn borrowck(&self, def: DefWithBodyId) -> Result<Arc<[BorrowckResult]>, MirLowerError>; |
353b0b11 | 63 | |
064997fb FG |
64 | #[salsa::invoke(crate::lower::ty_query)] |
65 | #[salsa::cycle(crate::lower::ty_recover)] | |
66 | fn ty(&self, def: TyDefId) -> Binders<Ty>; | |
67 | ||
68 | #[salsa::invoke(crate::lower::value_ty_query)] | |
69 | fn value_ty(&self, def: ValueTyDefId) -> Binders<Ty>; | |
70 | ||
71 | #[salsa::invoke(crate::lower::impl_self_ty_query)] | |
72 | #[salsa::cycle(crate::lower::impl_self_ty_recover)] | |
73 | fn impl_self_ty(&self, def: ImplId) -> Binders<Ty>; | |
74 | ||
75 | #[salsa::invoke(crate::lower::const_param_ty_query)] | |
76 | fn const_param_ty(&self, def: ConstParamId) -> Ty; | |
77 | ||
353b0b11 | 78 | #[salsa::invoke(crate::consteval::const_eval_query)] |
064997fb | 79 | #[salsa::cycle(crate::consteval::const_eval_recover)] |
add651ee FG |
80 | fn const_eval( |
81 | &self, | |
82 | def: GeneralConstId, | |
83 | subst: Substitution, | |
4b012472 | 84 | trait_env: Option<Arc<TraitEnvironment>>, |
add651ee | 85 | ) -> Result<Const, ConstEvalError>; |
fe692bf9 FG |
86 | |
87 | #[salsa::invoke(crate::consteval::const_eval_static_query)] | |
88 | #[salsa::cycle(crate::consteval::const_eval_static_recover)] | |
89 | fn const_eval_static(&self, def: StaticId) -> Result<Const, ConstEvalError>; | |
064997fb | 90 | |
353b0b11 FG |
91 | #[salsa::invoke(crate::consteval::const_eval_discriminant_variant)] |
92 | #[salsa::cycle(crate::consteval::const_eval_discriminant_recover)] | |
93 | fn const_eval_discriminant(&self, def: EnumVariantId) -> Result<i128, ConstEvalError>; | |
2b03887a | 94 | |
064997fb FG |
95 | #[salsa::invoke(crate::lower::impl_trait_query)] |
96 | fn impl_trait(&self, def: ImplId) -> Option<Binders<TraitRef>>; | |
97 | ||
98 | #[salsa::invoke(crate::lower::field_types_query)] | |
99 | fn field_types(&self, var: VariantId) -> Arc<ArenaMap<LocalFieldId, Binders<Ty>>>; | |
100 | ||
9c376795 FG |
101 | #[salsa::invoke(crate::layout::layout_of_adt_query)] |
102 | #[salsa::cycle(crate::layout::layout_of_adt_recover)] | |
fe692bf9 FG |
103 | fn layout_of_adt( |
104 | &self, | |
105 | def: AdtId, | |
106 | subst: Substitution, | |
4b012472 | 107 | env: Arc<TraitEnvironment>, |
fe692bf9 FG |
108 | ) -> Result<Arc<Layout>, LayoutError>; |
109 | ||
110 | #[salsa::invoke(crate::layout::layout_of_ty_query)] | |
111 | #[salsa::cycle(crate::layout::layout_of_ty_recover)] | |
4b012472 | 112 | fn layout_of_ty(&self, ty: Ty, env: Arc<TraitEnvironment>) -> Result<Arc<Layout>, LayoutError>; |
9c376795 FG |
113 | |
114 | #[salsa::invoke(crate::layout::target_data_layout_query)] | |
9ffffee4 | 115 | fn target_data_layout(&self, krate: CrateId) -> Option<Arc<TargetDataLayout>>; |
9c376795 | 116 | |
add651ee FG |
117 | #[salsa::invoke(crate::method_resolution::lookup_impl_method_query)] |
118 | fn lookup_impl_method( | |
119 | &self, | |
4b012472 | 120 | env: Arc<TraitEnvironment>, |
add651ee FG |
121 | func: FunctionId, |
122 | fn_subst: Substitution, | |
123 | ) -> (FunctionId, Substitution); | |
124 | ||
064997fb FG |
125 | #[salsa::invoke(crate::lower::callable_item_sig)] |
126 | fn callable_item_signature(&self, def: CallableDefId) -> PolyFnSig; | |
127 | ||
128 | #[salsa::invoke(crate::lower::return_type_impl_traits)] | |
129 | fn return_type_impl_traits( | |
130 | &self, | |
131 | def: FunctionId, | |
132 | ) -> Option<Arc<Binders<ReturnTypeImplTraits>>>; | |
133 | ||
134 | #[salsa::invoke(crate::lower::generic_predicates_for_param_query)] | |
135 | #[salsa::cycle(crate::lower::generic_predicates_for_param_recover)] | |
136 | fn generic_predicates_for_param( | |
137 | &self, | |
138 | def: GenericDefId, | |
139 | param_id: TypeOrConstParamId, | |
140 | assoc_name: Option<Name>, | |
141 | ) -> Arc<[Binders<QuantifiedWhereClause>]>; | |
142 | ||
143 | #[salsa::invoke(crate::lower::generic_predicates_query)] | |
144 | fn generic_predicates(&self, def: GenericDefId) -> Arc<[Binders<QuantifiedWhereClause>]>; | |
145 | ||
fe692bf9 FG |
146 | #[salsa::invoke(crate::lower::trait_environment_for_body_query)] |
147 | #[salsa::transparent] | |
4b012472 | 148 | fn trait_environment_for_body(&self, def: DefWithBodyId) -> Arc<TraitEnvironment>; |
fe692bf9 | 149 | |
064997fb | 150 | #[salsa::invoke(crate::lower::trait_environment_query)] |
4b012472 | 151 | fn trait_environment(&self, def: GenericDefId) -> Arc<TraitEnvironment>; |
064997fb FG |
152 | |
153 | #[salsa::invoke(crate::lower::generic_defaults_query)] | |
154 | #[salsa::cycle(crate::lower::generic_defaults_recover)] | |
155 | fn generic_defaults(&self, def: GenericDefId) -> Arc<[Binders<GenericArg>]>; | |
156 | ||
157 | #[salsa::invoke(InherentImpls::inherent_impls_in_crate_query)] | |
158 | fn inherent_impls_in_crate(&self, krate: CrateId) -> Arc<InherentImpls>; | |
159 | ||
160 | #[salsa::invoke(InherentImpls::inherent_impls_in_block_query)] | |
fe692bf9 | 161 | fn inherent_impls_in_block(&self, block: BlockId) -> Arc<InherentImpls>; |
064997fb FG |
162 | |
163 | /// Collects all crates in the dependency graph that have impls for the | |
9c376795 FG |
164 | /// given fingerprint. This is only used for primitive types and types |
165 | /// annotated with `rustc_has_incoherent_inherent_impls`; for other types | |
166 | /// we just look at the crate where the type is defined. | |
167 | #[salsa::invoke(crate::method_resolution::incoherent_inherent_impl_crates)] | |
168 | fn incoherent_inherent_impl_crates( | |
169 | &self, | |
170 | krate: CrateId, | |
171 | fp: TyFingerprint, | |
172 | ) -> SmallVec<[CrateId; 2]>; | |
064997fb FG |
173 | |
174 | #[salsa::invoke(TraitImpls::trait_impls_in_crate_query)] | |
175 | fn trait_impls_in_crate(&self, krate: CrateId) -> Arc<TraitImpls>; | |
176 | ||
177 | #[salsa::invoke(TraitImpls::trait_impls_in_block_query)] | |
fe692bf9 | 178 | fn trait_impls_in_block(&self, block: BlockId) -> Arc<TraitImpls>; |
064997fb FG |
179 | |
180 | #[salsa::invoke(TraitImpls::trait_impls_in_deps_query)] | |
fe692bf9 | 181 | fn trait_impls_in_deps(&self, krate: CrateId) -> Arc<[Arc<TraitImpls>]>; |
064997fb FG |
182 | |
183 | // Interned IDs for Chalk integration | |
184 | #[salsa::interned] | |
185 | fn intern_callable_def(&self, callable_def: CallableDefId) -> InternedCallableDefId; | |
186 | #[salsa::interned] | |
187 | fn intern_type_or_const_param_id( | |
188 | &self, | |
189 | param_id: TypeOrConstParamId, | |
190 | ) -> InternedTypeOrConstParamId; | |
191 | #[salsa::interned] | |
192 | fn intern_lifetime_param_id(&self, param_id: LifetimeParamId) -> InternedLifetimeParamId; | |
193 | #[salsa::interned] | |
194 | fn intern_impl_trait_id(&self, id: ImplTraitId) -> InternedOpaqueTyId; | |
195 | #[salsa::interned] | |
196 | fn intern_closure(&self, id: (DefWithBodyId, ExprId)) -> InternedClosureId; | |
2b03887a FG |
197 | #[salsa::interned] |
198 | fn intern_generator(&self, id: (DefWithBodyId, ExprId)) -> InternedGeneratorId; | |
064997fb FG |
199 | |
200 | #[salsa::invoke(chalk_db::associated_ty_data_query)] | |
fe692bf9 FG |
201 | fn associated_ty_data( |
202 | &self, | |
203 | id: chalk_db::AssocTypeId, | |
204 | ) -> sync::Arc<chalk_db::AssociatedTyDatum>; | |
064997fb FG |
205 | |
206 | #[salsa::invoke(chalk_db::trait_datum_query)] | |
fe692bf9 FG |
207 | fn trait_datum( |
208 | &self, | |
209 | krate: CrateId, | |
210 | trait_id: chalk_db::TraitId, | |
211 | ) -> sync::Arc<chalk_db::TraitDatum>; | |
064997fb FG |
212 | |
213 | #[salsa::invoke(chalk_db::struct_datum_query)] | |
214 | fn struct_datum( | |
215 | &self, | |
216 | krate: CrateId, | |
217 | struct_id: chalk_db::AdtId, | |
fe692bf9 | 218 | ) -> sync::Arc<chalk_db::StructDatum>; |
064997fb FG |
219 | |
220 | #[salsa::invoke(chalk_db::impl_datum_query)] | |
fe692bf9 FG |
221 | fn impl_datum( |
222 | &self, | |
223 | krate: CrateId, | |
224 | impl_id: chalk_db::ImplId, | |
225 | ) -> sync::Arc<chalk_db::ImplDatum>; | |
064997fb FG |
226 | |
227 | #[salsa::invoke(chalk_db::fn_def_datum_query)] | |
fe692bf9 | 228 | fn fn_def_datum(&self, krate: CrateId, fn_def_id: FnDefId) -> sync::Arc<chalk_db::FnDefDatum>; |
064997fb FG |
229 | |
230 | #[salsa::invoke(chalk_db::fn_def_variance_query)] | |
231 | fn fn_def_variance(&self, fn_def_id: FnDefId) -> chalk_db::Variances; | |
232 | ||
233 | #[salsa::invoke(chalk_db::adt_variance_query)] | |
234 | fn adt_variance(&self, adt_id: chalk_db::AdtId) -> chalk_db::Variances; | |
235 | ||
236 | #[salsa::invoke(chalk_db::associated_ty_value_query)] | |
237 | fn associated_ty_value( | |
238 | &self, | |
239 | krate: CrateId, | |
240 | id: chalk_db::AssociatedTyValueId, | |
fe692bf9 | 241 | ) -> sync::Arc<chalk_db::AssociatedTyValue>; |
064997fb | 242 | |
2b03887a FG |
243 | #[salsa::invoke(crate::traits::normalize_projection_query)] |
244 | #[salsa::transparent] | |
245 | fn normalize_projection( | |
246 | &self, | |
247 | projection: crate::ProjectionTy, | |
4b012472 | 248 | env: Arc<TraitEnvironment>, |
2b03887a FG |
249 | ) -> Ty; |
250 | ||
064997fb FG |
251 | #[salsa::invoke(trait_solve_wait)] |
252 | #[salsa::transparent] | |
253 | fn trait_solve( | |
254 | &self, | |
255 | krate: CrateId, | |
fe692bf9 | 256 | block: Option<BlockId>, |
064997fb FG |
257 | goal: crate::Canonical<crate::InEnvironment<crate::Goal>>, |
258 | ) -> Option<crate::Solution>; | |
259 | ||
260 | #[salsa::invoke(crate::traits::trait_solve_query)] | |
261 | fn trait_solve_query( | |
262 | &self, | |
263 | krate: CrateId, | |
fe692bf9 | 264 | block: Option<BlockId>, |
064997fb FG |
265 | goal: crate::Canonical<crate::InEnvironment<crate::Goal>>, |
266 | ) -> Option<crate::Solution>; | |
267 | ||
268 | #[salsa::invoke(chalk_db::program_clauses_for_chalk_env_query)] | |
269 | fn program_clauses_for_chalk_env( | |
270 | &self, | |
271 | krate: CrateId, | |
fe692bf9 | 272 | block: Option<BlockId>, |
064997fb FG |
273 | env: chalk_ir::Environment<Interner>, |
274 | ) -> chalk_ir::ProgramClauses<Interner>; | |
275 | } | |
276 | ||
277 | fn infer_wait(db: &dyn HirDatabase, def: DefWithBodyId) -> Arc<InferenceResult> { | |
278 | let _p = profile::span("infer:wait").detail(|| match def { | |
fe692bf9 FG |
279 | DefWithBodyId::FunctionId(it) => db.function_data(it).name.display(db.upcast()).to_string(), |
280 | DefWithBodyId::StaticId(it) => { | |
281 | db.static_data(it).name.clone().display(db.upcast()).to_string() | |
064997fb | 282 | } |
fe692bf9 FG |
283 | DefWithBodyId::ConstId(it) => db |
284 | .const_data(it) | |
285 | .name | |
286 | .clone() | |
287 | .unwrap_or_else(Name::missing) | |
288 | .display(db.upcast()) | |
289 | .to_string(), | |
2b03887a | 290 | DefWithBodyId::VariantId(it) => { |
fe692bf9 | 291 | db.enum_data(it.parent).variants[it.local_id].name.display(db.upcast()).to_string() |
2b03887a | 292 | } |
fe692bf9 | 293 | DefWithBodyId::InTypeConstId(it) => format!("in type const {it:?}"), |
064997fb FG |
294 | }); |
295 | db.infer_query(def) | |
296 | } | |
297 | ||
298 | fn trait_solve_wait( | |
299 | db: &dyn HirDatabase, | |
300 | krate: CrateId, | |
fe692bf9 | 301 | block: Option<BlockId>, |
064997fb FG |
302 | goal: crate::Canonical<crate::InEnvironment<crate::Goal>>, |
303 | ) -> Option<crate::Solution> { | |
304 | let _p = profile::span("trait_solve::wait"); | |
fe692bf9 | 305 | db.trait_solve_query(krate, block, goal) |
064997fb FG |
306 | } |
307 | ||
308 | #[test] | |
309 | fn hir_database_is_object_safe() { | |
310 | fn _assert_object_safe(_: &dyn HirDatabase) {} | |
311 | } | |
312 | ||
313 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] | |
314 | pub struct InternedTypeOrConstParamId(salsa::InternId); | |
315 | impl_intern_key!(InternedTypeOrConstParamId); | |
316 | ||
317 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] | |
318 | pub struct InternedLifetimeParamId(salsa::InternId); | |
319 | impl_intern_key!(InternedLifetimeParamId); | |
320 | ||
321 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] | |
322 | pub struct InternedConstParamId(salsa::InternId); | |
323 | impl_intern_key!(InternedConstParamId); | |
324 | ||
325 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] | |
326 | pub struct InternedOpaqueTyId(salsa::InternId); | |
327 | impl_intern_key!(InternedOpaqueTyId); | |
328 | ||
329 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] | |
330 | pub struct InternedClosureId(salsa::InternId); | |
331 | impl_intern_key!(InternedClosureId); | |
332 | ||
2b03887a FG |
333 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] |
334 | pub struct InternedGeneratorId(salsa::InternId); | |
335 | impl_intern_key!(InternedGeneratorId); | |
336 | ||
064997fb FG |
337 | /// This exists just for Chalk, because Chalk just has a single `FnDefId` where |
338 | /// we have different IDs for struct and enum variant constructors. | |
339 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Ord, PartialOrd)] | |
340 | pub struct InternedCallableDefId(salsa::InternId); | |
341 | impl_intern_key!(InternedCallableDefId); |