fe_codegen/
db.rs

1#![allow(clippy::arc_with_non_send_sync)]
2use std::rc::Rc;
3
4use fe_abi::{contract::AbiContract, event::AbiEvent, function::AbiFunction, types::AbiType};
5use fe_analyzer::{
6    db::AnalyzerDbStorage,
7    namespace::items::{ContractId, ModuleId},
8    AnalyzerDb,
9};
10use fe_common::db::{SourceDb, SourceDbStorage, Upcast, UpcastMut};
11use fe_mir::{
12    db::{MirDb, MirDbStorage},
13    ir::{FunctionBody, FunctionId, FunctionSignature, TypeId},
14};
15
16mod queries;
17
18#[salsa::query_group(CodegenDbStorage)]
19pub trait CodegenDb: MirDb + Upcast<dyn MirDb> + UpcastMut<dyn MirDb> {
20    #[salsa::invoke(queries::function::legalized_signature)]
21    fn codegen_legalized_signature(&self, function_id: FunctionId) -> Rc<FunctionSignature>;
22    #[salsa::invoke(queries::function::legalized_body)]
23    fn codegen_legalized_body(&self, function_id: FunctionId) -> Rc<FunctionBody>;
24    #[salsa::invoke(queries::function::symbol_name)]
25    fn codegen_function_symbol_name(&self, function_id: FunctionId) -> Rc<String>;
26
27    #[salsa::invoke(queries::types::legalized_type)]
28    fn codegen_legalized_type(&self, ty: TypeId) -> TypeId;
29
30    #[salsa::invoke(queries::abi::abi_type)]
31    fn codegen_abi_type(&self, ty: TypeId) -> AbiType;
32    #[salsa::invoke(queries::abi::abi_function)]
33    fn codegen_abi_function(&self, function_id: FunctionId) -> AbiFunction;
34    #[salsa::invoke(queries::abi::abi_event)]
35    fn codegen_abi_event(&self, ty: TypeId) -> AbiEvent;
36    #[salsa::invoke(queries::abi::abi_contract)]
37    fn codegen_abi_contract(&self, contract: ContractId) -> AbiContract;
38    #[salsa::invoke(queries::abi::abi_module_events)]
39    fn codegen_abi_module_events(&self, module: ModuleId) -> Vec<AbiEvent>;
40    #[salsa::invoke(queries::abi::abi_type_maximum_size)]
41    fn codegen_abi_type_maximum_size(&self, ty: TypeId) -> usize;
42    #[salsa::invoke(queries::abi::abi_type_minimum_size)]
43    fn codegen_abi_type_minimum_size(&self, ty: TypeId) -> usize;
44    #[salsa::invoke(queries::abi::abi_function_argument_maximum_size)]
45    fn codegen_abi_function_argument_maximum_size(&self, contract: FunctionId) -> usize;
46    #[salsa::invoke(queries::abi::abi_function_return_maximum_size)]
47    fn codegen_abi_function_return_maximum_size(&self, function: FunctionId) -> usize;
48
49    #[salsa::invoke(queries::contract::symbol_name)]
50    fn codegen_contract_symbol_name(&self, contract: ContractId) -> Rc<String>;
51    #[salsa::invoke(queries::contract::deployer_symbol_name)]
52    fn codegen_contract_deployer_symbol_name(&self, contract: ContractId) -> Rc<String>;
53
54    #[salsa::invoke(queries::constant::string_symbol_name)]
55    fn codegen_constant_string_symbol_name(&self, data: String) -> Rc<String>;
56}
57
58// TODO: Move this to driver.
59#[salsa::database(SourceDbStorage, AnalyzerDbStorage, MirDbStorage, CodegenDbStorage)]
60#[derive(Default)]
61pub struct Db {
62    storage: salsa::Storage<Db>,
63}
64impl salsa::Database for Db {}
65
66impl Upcast<dyn MirDb> for Db {
67    fn upcast(&self) -> &(dyn MirDb + 'static) {
68        self
69    }
70}
71
72impl UpcastMut<dyn MirDb> for Db {
73    fn upcast_mut(&mut self) -> &mut (dyn MirDb + 'static) {
74        &mut *self
75    }
76}
77
78impl Upcast<dyn SourceDb> for Db {
79    fn upcast(&self) -> &(dyn SourceDb + 'static) {
80        self
81    }
82}
83
84impl UpcastMut<dyn SourceDb> for Db {
85    fn upcast_mut(&mut self) -> &mut (dyn SourceDb + 'static) {
86        &mut *self
87    }
88}
89
90impl Upcast<dyn AnalyzerDb> for Db {
91    fn upcast(&self) -> &(dyn AnalyzerDb + 'static) {
92        self
93    }
94}
95
96impl UpcastMut<dyn AnalyzerDb> for Db {
97    fn upcast_mut(&mut self) -> &mut (dyn AnalyzerDb + 'static) {
98        &mut *self
99    }
100}