1mod block_concretizer;
2mod enumdef;
3mod type_concretizer;
4
5use amir::{
6 amir::{Amir, Amirs},
7 stmt::ALink,
8 var::AVar,
9};
10use block_concretizer::BlockConcretizer;
11use enumdef::EnumDefs;
12use mir::{
13 mir::{Mir, Mirs},
14 ty::ConcType,
15 Vars,
16};
17use type_concretizer::TypeConcretizer;
18
19pub struct Concretizer {
20 pub parameters: Vec<ConcType>,
21 pub output: ConcType,
22 pub enum_defs: EnumDefs,
23}
24
25pub fn concretize(amirs: &Amirs) -> Mirs {
26 let mirs = amirs
27 .amirs
28 .iter()
29 .map(|amir| {
30 let mut concretizer = Concretizer {
31 parameters: vec![],
32 output: ConcType::Number,
33 enum_defs: Default::default(),
34 };
35 concretizer.concretize_mir(amir)
36 })
37 .collect();
38 Mirs {
39 entrypoint: amirs.entrypoint,
40 mirs,
41 }
42}
43
44impl Concretizer {
45 fn concretize_mir(&mut self, amir: &Amir) -> Mir {
46 let Amir {
47 parameters: _,
48 output: _,
49 vars,
50 scopes,
51 blocks,
52 captured,
53 links,
54 } = amir;
55 let mut type_conc = TypeConcretizer {};
56
57 let mut vars = Vars(
58 vars.iter()
59 .map(|var| AVar {
60 ty: type_conc.gen_conc_type(&var.ty),
61 scope: var.scope,
62 })
63 .collect(),
64 );
65
66 let mut block_conc = BlockConcretizer {
67 enum_defs: &mut self.enum_defs,
68 type_concretizer: &mut type_conc,
69 vars: &mut vars,
70 stmts: vec![],
71 };
72 let blocks = block_conc.concretize_blocks(blocks);
73
74 let captured = captured
75 .iter()
76 .map(|ty| type_conc.gen_conc_type(ty))
77 .collect();
78
79 let links = links
80 .iter()
81 .map(|link| ALink {
82 ty: type_conc.gen_conc_type(&link.ty),
83 name: link.name.clone(),
84 })
85 .collect();
86
87 Mir {
88 parameters: self.parameters.clone(),
89 captured,
90 output: self.output.clone(),
91 vars,
92 scopes: scopes.clone(),
93 blocks,
94 links,
95 }
96 }
97}
98
99#[cfg(test)]
100mod tests {
101 #[test]
102 fn it_works() {
103 let result = 2 + 2;
104 assert_eq!(result, 4);
105 }
106}