1#![allow(clippy::arc_with_non_send_sync)]
2use std::{collections::BTreeMap, rc::Rc};
3
4use fe_analyzer::{
5 db::AnalyzerDbStorage,
6 namespace::{items as analyzer_items, types as analyzer_types},
7 AnalyzerDb,
8};
9use fe_common::db::{SourceDb, SourceDbStorage, Upcast, UpcastMut};
10use smol_str::SmolStr;
11
12use crate::ir::{self, ConstantId, TypeId};
13
14mod queries;
15
16#[salsa::query_group(MirDbStorage)]
17pub trait MirDb: AnalyzerDb + Upcast<dyn AnalyzerDb> + UpcastMut<dyn AnalyzerDb> {
18 #[salsa::interned]
19 fn mir_intern_const(&self, data: Rc<ir::Constant>) -> ir::ConstantId;
20 #[salsa::interned]
21 fn mir_intern_type(&self, data: Rc<ir::Type>) -> ir::TypeId;
22 #[salsa::interned]
23 fn mir_intern_function(&self, data: Rc<ir::FunctionSignature>) -> ir::FunctionId;
24
25 #[salsa::invoke(queries::module::mir_lower_module_all_functions)]
26 fn mir_lower_module_all_functions(
27 &self,
28 module: analyzer_items::ModuleId,
29 ) -> Rc<Vec<ir::FunctionId>>;
30
31 #[salsa::invoke(queries::contract::mir_lower_contract_all_functions)]
32 fn mir_lower_contract_all_functions(
33 &self,
34 contract: analyzer_items::ContractId,
35 ) -> Rc<Vec<ir::FunctionId>>;
36
37 #[salsa::invoke(queries::structs::mir_lower_struct_all_functions)]
38 fn mir_lower_struct_all_functions(
39 &self,
40 struct_: analyzer_items::StructId,
41 ) -> Rc<Vec<ir::FunctionId>>;
42
43 #[salsa::invoke(queries::enums::mir_lower_enum_all_functions)]
44 fn mir_lower_enum_all_functions(
45 &self,
46 enum_: analyzer_items::EnumId,
47 ) -> Rc<Vec<ir::FunctionId>>;
48
49 #[salsa::invoke(queries::types::mir_lowered_type)]
50 fn mir_lowered_type(&self, analyzer_type: analyzer_types::TypeId) -> TypeId;
51
52 #[salsa::invoke(queries::constant::mir_lowered_constant)]
53 fn mir_lowered_constant(&self, analyzer_const: analyzer_items::ModuleConstantId) -> ConstantId;
54
55 #[salsa::invoke(queries::function::mir_lowered_func_signature)]
56 fn mir_lowered_func_signature(
57 &self,
58 analyzer_func: analyzer_items::FunctionId,
59 ) -> ir::FunctionId;
60 #[salsa::invoke(queries::function::mir_lowered_monomorphized_func_signature)]
61 fn mir_lowered_monomorphized_func_signature(
62 &self,
63 analyzer_func: analyzer_items::FunctionId,
64 resolved_generics: BTreeMap<SmolStr, analyzer_types::TypeId>,
65 ) -> ir::FunctionId;
66 #[salsa::invoke(queries::function::mir_lowered_pseudo_monomorphized_func_signature)]
67 fn mir_lowered_pseudo_monomorphized_func_signature(
68 &self,
69 analyzer_func: analyzer_items::FunctionId,
70 ) -> ir::FunctionId;
71 #[salsa::invoke(queries::function::mir_lowered_func_body)]
72 fn mir_lowered_func_body(&self, func: ir::FunctionId) -> Rc<ir::FunctionBody>;
73}
74
75#[salsa::database(SourceDbStorage, AnalyzerDbStorage, MirDbStorage)]
76#[derive(Default)]
77pub struct NewDb {
78 storage: salsa::Storage<NewDb>,
79}
80impl salsa::Database for NewDb {}
81
82impl Upcast<dyn SourceDb> for NewDb {
83 fn upcast(&self) -> &(dyn SourceDb + 'static) {
84 self
85 }
86}
87
88impl UpcastMut<dyn SourceDb> for NewDb {
89 fn upcast_mut(&mut self) -> &mut (dyn SourceDb + 'static) {
90 &mut *self
91 }
92}
93
94impl Upcast<dyn AnalyzerDb> for NewDb {
95 fn upcast(&self) -> &(dyn AnalyzerDb + 'static) {
96 self
97 }
98}
99
100impl UpcastMut<dyn AnalyzerDb> for NewDb {
101 fn upcast_mut(&mut self) -> &mut (dyn AnalyzerDb + 'static) {
102 &mut *self
103 }
104}