Skip to main content

luaur_analysis/methods/
data_flow_graph_builder_resolve_captures.rs

1use crate::functions::collect_operands::collect_operands;
2use crate::functions::get_def::get_def_id;
3use crate::records::data_flow_graph_builder::DataFlowGraphBuilder;
4use crate::records::phi::Phi;
5use crate::type_aliases::def_id_def::DefId;
6use alloc::vec::Vec;
7use luaur_common::macros::luau_assert::LUAU_ASSERT;
8
9impl DataFlowGraphBuilder {
10    pub fn resolve_captures(&mut self) {
11        for (_symbol, capture) in self.captures.iter() {
12            let mut operands: Vec<DefId> = Vec::new();
13            for i in capture.version_offset..capture.all_versions.len() {
14                collect_operands(capture.all_versions[i], &mut operands);
15            }
16
17            for capture_def in &capture.capture_defs {
18                let phi_ptr = get_def_id::<Phi>(*capture_def) as *mut Phi;
19                LUAU_ASSERT!(!phi_ptr.is_null());
20                unsafe {
21                    LUAU_ASSERT!((*phi_ptr).operands.is_empty());
22                    (*phi_ptr).operands = operands.clone();
23                }
24            }
25        }
26    }
27}