use crate::records::data_flow_graph_builder::DataFlowGraphBuilder;
use crate::records::dfg_scope::DfgScope;
use crate::records::symbol::Symbol;
use crate::type_aliases::def_id_def::DefId;
use alloc::vec::Vec;
impl DataFlowGraphBuilder {
pub fn join_bindings(&mut self, p: *mut DfgScope, a: &DfgScope, b: &DfgScope) {
unsafe {
let a_bindings: Vec<(Symbol, DefId)> =
a.bindings.iter().map(|(s, d)| (s.clone(), *d)).collect();
let b_bindings: Vec<(Symbol, DefId)> =
b.bindings.iter().map(|(s, d)| (s.clone(), *d)).collect();
let b_find = |sym: &Symbol| -> Option<DefId> {
b_bindings.iter().find(|(s, _)| s == sym).map(|(_, d)| *d)
};
for (sym, def1) in a_bindings.iter() {
if let Some(def2) = b_find(sym) {
let phi = (*self.def_arena).phi_def_id_def_id(*def1, def2);
*(*p).bindings.get_or_insert(sym.clone()) = phi;
} else if let Some(def2) = (*p).lookup_symbol(sym.clone()) {
let phi = (*self.def_arena).phi_def_id_def_id(*def1, def2);
*(*p).bindings.get_or_insert(sym.clone()) = phi;
}
}
for (sym, def1) in b_bindings.iter() {
if let Some(def2) = (*p).lookup_symbol(sym.clone()) {
let phi = (*self.def_arena).phi_def_id_def_id(*def1, def2);
*(*p).bindings.get_or_insert(sym.clone()) = phi;
}
}
}
}
}