]> git.proxmox.com Git - rustc.git/blame - src/tools/rust-analyzer/crates/hir-ty/src/db.rs
New upstream version 1.76.0+dfsg1
[rustc.git] / src / tools / rust-analyzer / crates / hir-ty / src / db.rs
CommitLineData
064997fb
FG
1//! The home of `HirDatabase`, which is the Salsa database containing all the
2//! type inference-related queries.
3
fe692bf9 4use std::sync;
064997fb 5
064997fb
FG
6use base_db::{impl_intern_key, salsa, CrateId, Upcast};
7use 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};
12use la_arena::ArenaMap;
9c376795 13use smallvec::SmallVec;
fe692bf9 14use triomphe::Arc;
064997fb
FG
15
16use 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};
26use hir_expand::name::Name;
27
28#[salsa::query_group(HirDatabaseStorage)]
29pub 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
277fn 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
298fn 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]
309fn hir_database_is_object_safe() {
310 fn _assert_object_safe(_: &dyn HirDatabase) {}
311}
312
313#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
314pub struct InternedTypeOrConstParamId(salsa::InternId);
315impl_intern_key!(InternedTypeOrConstParamId);
316
317#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
318pub struct InternedLifetimeParamId(salsa::InternId);
319impl_intern_key!(InternedLifetimeParamId);
320
321#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
322pub struct InternedConstParamId(salsa::InternId);
323impl_intern_key!(InternedConstParamId);
324
325#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
326pub struct InternedOpaqueTyId(salsa::InternId);
327impl_intern_key!(InternedOpaqueTyId);
328
329#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
330pub struct InternedClosureId(salsa::InternId);
331impl_intern_key!(InternedClosureId);
332
2b03887a
FG
333#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
334pub struct InternedGeneratorId(salsa::InternId);
335impl_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)]
340pub struct InternedCallableDefId(salsa::InternId);
341impl_intern_key!(InternedCallableDefId);