fe_codegen/yul/isel/
test.rs

1use 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}