cxc 0.3.1

A high performance scripting language
Documentation
use crate::Type;

use super::{
    expr_tree::{MemberGen, HNodeData, SetGen},
    hlr_data::FuncRep,
};

pub fn struct_literals(hlr: &mut FuncRep) {
    hlr.modify_many_infallible_rev(
        |structlit, struct_data, hlr| {
            let HNodeData::StructLit { ref mut var_type, fields: field_exprs, .. } = struct_data 
                else { return };

            if field_exprs.len() == 0 {
                *struct_data = HNodeData::zero();
                return;
            }
            
            hlr.tree.replace(structlit, HNodeData::zero());
            let new_struct = hlr.add_variable(&var_type);

            let mut current_statement = structlit;

            for (field_name, field_expr) in field_exprs.iter().rev() {
                current_statement = hlr
                    .insert_statement_before(
                        current_statement,
                        SetGen {
                            lhs: MemberGen {
                                object: new_struct.clone(),
                                field: field_name.clone(),
                            },
                            rhs: *field_expr,
                        },
                    )
                    .inserted_id();
            }

            *struct_data = HNodeData::Ident {
                var_type: var_type.clone(),
                var_id: new_struct,
            };
        },
    )
}