fe_codegen/yul/isel/
test.rs1use super::context::Context;
2use crate::db::CodegenDb;
3use fe_analyzer::namespace::items::FunctionId;
4use yultsur::{yul, *};
5
6pub fn lower_test(db: &dyn CodegenDb, test: FunctionId) -> yul::Object {
7 let mut context = Context::default();
8 let test = db.mir_lowered_func_signature(test);
9 context.function_dependency.insert(test);
10
11 let dep_functions: Vec<_> = context
12 .resolve_function_dependency(db)
13 .into_iter()
14 .map(yul::Statement::FunctionDefinition)
15 .collect();
16 let dep_constants = context.resolve_constant_dependency(db);
17 let dep_contracts = context.resolve_contract_dependency(db);
18 let runtime_funcs: Vec<_> = context
19 .runtime
20 .collect_definitions()
21 .into_iter()
22 .map(yul::Statement::FunctionDefinition)
23 .collect();
24 let test_func_name = identifier! { (db.codegen_function_symbol_name(test)) };
25 let call = function_call_statement! {[test_func_name]()};
26
27 let code = code! {
28 [dep_functions...]
29 [runtime_funcs...]
30 [call]
31 (stop())
32 };
33
34 let name = identifier! { test };
35 let object = yul::Object {
36 name,
37 code,
38 objects: dep_contracts,
39 data: dep_constants,
40 };
41
42 normalize_object(object)
43}
44
45fn normalize_object(obj: yul::Object) -> yul::Object {
46 let data = obj
47 .data
48 .into_iter()
49 .map(|data| yul::Data {
50 name: data.name,
51 value: data
52 .value
53 .replace('\\', "\\\\\\\\")
54 .replace('\n', "\\\\n")
55 .replace('"', "\\\\\"")
56 .replace('\r', "\\\\r")
57 .replace('\t', "\\\\t"),
58 })
59 .collect::<Vec<_>>();
60 yul::Object {
61 name: obj.name,
62 code: obj.code,
63 objects: obj
64 .objects
65 .into_iter()
66 .map(normalize_object)
67 .collect::<Vec<_>>(),
68 data,
69 }
70}