fe_mir/
db.rs

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}