1pub(crate) mod builtins;
6pub(crate) mod common;
7pub mod dafny;
8pub mod lean;
9pub mod rust;
10
11use std::collections::{HashMap, HashSet};
12
13use crate::ast::{FnDef, TopLevel, TypeDef};
14use crate::types::checker::TypeCheckResult;
15
16pub struct ModuleInfo {
18 pub prefix: String,
20 pub depends: Vec<String>,
22 pub type_defs: Vec<TypeDef>,
24 pub fn_defs: Vec<FnDef>,
26}
27
28pub struct CodegenContext {
30 pub items: Vec<TopLevel>,
32 pub fn_sigs: HashMap<String, (Vec<crate::types::Type>, crate::types::Type, Vec<String>)>,
34 pub memo_fns: HashSet<String>,
36 pub memo_safe_types: HashSet<String>,
38 pub type_defs: Vec<TypeDef>,
40 pub fn_defs: Vec<FnDef>,
42 pub project_name: String,
44 pub modules: Vec<ModuleInfo>,
46 pub module_prefixes: HashSet<String>,
48 pub policy: Option<crate::config::ProjectConfig>,
50 pub emit_replay_runtime: bool,
52 pub runtime_policy_from_env: bool,
54 pub guest_entry: Option<String>,
56 pub emit_self_host_runtime: bool,
58}
59
60pub struct ProjectOutput {
62 pub files: Vec<(String, String)>,
64}
65
66pub fn build_context(
68 items: Vec<TopLevel>,
69 tc_result: &TypeCheckResult,
70 memo_fns: HashSet<String>,
71 project_name: String,
72 modules: Vec<ModuleInfo>,
73) -> CodegenContext {
74 let type_defs: Vec<TypeDef> = items
75 .iter()
76 .filter_map(|item| {
77 if let TopLevel::TypeDef(td) = item {
78 Some(td.clone())
79 } else {
80 None
81 }
82 })
83 .collect();
84
85 let fn_defs: Vec<FnDef> = items
86 .iter()
87 .filter_map(|item| {
88 if let TopLevel::FnDef(fd) = item {
89 Some(fd.clone())
90 } else {
91 None
92 }
93 })
94 .collect();
95
96 let module_prefixes: HashSet<String> = modules.iter().map(|m| m.prefix.clone()).collect();
97
98 CodegenContext {
99 items,
100 fn_sigs: tc_result.fn_sigs.clone(),
101 memo_fns,
102 memo_safe_types: tc_result.memo_safe_types.clone(),
103 type_defs,
104 fn_defs,
105 project_name,
106 modules,
107 module_prefixes,
108 policy: None,
109 emit_replay_runtime: false,
110 runtime_policy_from_env: false,
111 guest_entry: None,
112 emit_self_host_runtime: false,
113 }
114}