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#[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}