1pub(crate) mod builtin_helpers;
6pub(crate) mod builtin_records;
7pub(crate) mod builtins;
8pub mod common;
9#[cfg(feature = "runtime")]
10pub mod dafny;
11#[cfg(feature = "runtime")]
12pub mod lean;
13#[cfg(feature = "runtime")]
14pub mod recursion;
15#[cfg(feature = "runtime")]
16pub mod rust;
17#[cfg(feature = "wasm-compile")]
18pub mod wasm;
19
20use std::collections::{HashMap, HashSet};
21
22use crate::ast::{FnDef, TopLevel, TypeDef};
23use crate::types::checker::TypeCheckResult;
24
25pub struct ModuleInfo {
27 pub prefix: String,
29 pub depends: Vec<String>,
31 pub type_defs: Vec<TypeDef>,
33 pub fn_defs: Vec<FnDef>,
35}
36
37pub struct CodegenContext {
39 pub items: Vec<TopLevel>,
41 pub fn_sigs: HashMap<String, (Vec<crate::types::Type>, crate::types::Type, Vec<String>)>,
43 pub memo_fns: HashSet<String>,
45 pub memo_safe_types: HashSet<String>,
47 pub type_defs: Vec<TypeDef>,
49 pub fn_defs: Vec<FnDef>,
51 pub project_name: String,
53 pub modules: Vec<ModuleInfo>,
55 pub module_prefixes: HashSet<String>,
57 #[cfg(feature = "runtime")]
59 pub policy: Option<crate::config::ProjectConfig>,
60 pub emit_replay_runtime: bool,
62 pub runtime_policy_from_env: bool,
64 pub guest_entry: Option<String>,
66 pub emit_self_host_support: bool,
68 pub extra_fn_defs: Vec<FnDef>,
72 pub mutual_tco_members: HashSet<String>,
75}
76
77pub struct ProjectOutput {
79 pub files: Vec<(String, String)>,
81}
82
83pub fn build_context(
85 items: Vec<TopLevel>,
86 tc_result: &TypeCheckResult,
87 memo_fns: HashSet<String>,
88 project_name: String,
89 modules: Vec<ModuleInfo>,
90) -> CodegenContext {
91 let type_defs: Vec<TypeDef> = items
92 .iter()
93 .filter_map(|item| {
94 if let TopLevel::TypeDef(td) = item {
95 Some(td.clone())
96 } else {
97 None
98 }
99 })
100 .collect();
101
102 let fn_defs: Vec<FnDef> = items
103 .iter()
104 .filter_map(|item| {
105 if let TopLevel::FnDef(fd) = item {
106 Some(fd.clone())
107 } else {
108 None
109 }
110 })
111 .collect();
112
113 let module_prefixes: HashSet<String> = modules.iter().map(|m| m.prefix.clone()).collect();
114
115 let mut mutual_tco_members = HashSet::new();
117 {
118 let entry_fns: Vec<&FnDef> = fn_defs.iter().filter(|fd| fd.name != "main").collect();
120 for group in crate::call_graph::tailcall_scc_components(&entry_fns) {
121 for fd in &group {
122 mutual_tco_members.insert(fd.name.clone());
123 }
124 }
125 for module in &modules {
127 let mod_fns: Vec<&FnDef> = module.fn_defs.iter().collect();
128 for group in crate::call_graph::tailcall_scc_components(&mod_fns) {
129 for fd in &group {
130 mutual_tco_members.insert(fd.name.clone());
131 }
132 }
133 }
134 }
135
136 let mut fn_sigs = tc_result.fn_sigs.clone();
141 {
142 let pairs: Vec<(String, Vec<TopLevel>)> = modules
143 .iter()
144 .map(|m| {
145 let items: Vec<TopLevel> = m
146 .fn_defs
147 .iter()
148 .map(|fd| TopLevel::FnDef(fd.clone()))
149 .chain(m.type_defs.iter().map(|td| TopLevel::TypeDef(td.clone())))
150 .collect();
151 (m.prefix.clone(), items)
152 })
153 .collect();
154 let registry = crate::visibility::SymbolRegistry::from_modules_all(&pairs);
155 for entry in ®istry.entries {
156 if fn_sigs.contains_key(&entry.canonical_name) {
157 continue;
158 }
159 if let crate::visibility::SymbolKind::Function {
160 params,
161 return_type,
162 effects,
163 ..
164 } = &entry.kind
165 {
166 let parsed_params: Vec<crate::types::Type> = params
167 .iter()
168 .map(|(_, ty_str)| crate::types::parse_type_str(ty_str))
169 .collect();
170 let ret = crate::types::parse_type_str(return_type);
171 fn_sigs.insert(
172 entry.canonical_name.clone(),
173 (parsed_params, ret, effects.clone()),
174 );
175 }
176 }
177 }
178
179 CodegenContext {
180 items,
181 fn_sigs,
182 memo_fns,
183 memo_safe_types: tc_result.memo_safe_types.clone(),
184 type_defs,
185 fn_defs,
186 project_name,
187 modules,
188 module_prefixes,
189 #[cfg(feature = "runtime")]
190 policy: None,
191 emit_replay_runtime: false,
192 runtime_policy_from_env: false,
193 guest_entry: None,
194 emit_self_host_support: false,
195 extra_fn_defs: Vec::new(),
196 mutual_tco_members,
197 }
198}