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}
51
52pub struct ProjectOutput {
54 pub files: Vec<(String, String)>,
56}
57
58pub fn build_context(
60 items: Vec<TopLevel>,
61 tc_result: &TypeCheckResult,
62 memo_fns: HashSet<String>,
63 project_name: String,
64 modules: Vec<ModuleInfo>,
65) -> CodegenContext {
66 let type_defs: Vec<TypeDef> = items
67 .iter()
68 .filter_map(|item| {
69 if let TopLevel::TypeDef(td) = item {
70 Some(td.clone())
71 } else {
72 None
73 }
74 })
75 .collect();
76
77 let fn_defs: Vec<FnDef> = items
78 .iter()
79 .filter_map(|item| {
80 if let TopLevel::FnDef(fd) = item {
81 Some(fd.clone())
82 } else {
83 None
84 }
85 })
86 .collect();
87
88 let module_prefixes: HashSet<String> = modules.iter().map(|m| m.prefix.clone()).collect();
89
90 CodegenContext {
91 items,
92 fn_sigs: tc_result.fn_sigs.clone(),
93 memo_fns,
94 memo_safe_types: tc_result.memo_safe_types.clone(),
95 type_defs,
96 fn_defs,
97 project_name,
98 modules,
99 module_prefixes,
100 policy: None,
101 }
102}