Skip to main content

luaur_analysis/records/
instance_collector_2.rs

1use crate::functions::follow_type::follow_type_id;
2use crate::functions::get_type_alt_j::get_type_id;
3use crate::records::extern_type::ExternType;
4use crate::records::type_function_instance_type::TypeFunctionInstanceType;
5use crate::records::type_function_instance_type_pack::TypeFunctionInstanceTypePack;
6use crate::records::type_once_visitor::TypeOnceVisitor;
7use crate::type_aliases::type_id::TypeId;
8use crate::type_aliases::type_pack_id::TypePackId;
9use alloc::string::String;
10use core::ptr;
11use luaur_common::records::dense_hash_set::DenseHashSet;
12use luaur_common::records::vec_deque::VecDeque;
13
14#[derive(Debug, Clone)]
15pub struct InstanceCollector2 {
16    pub base: TypeOnceVisitor,
17    pub tys: VecDeque<TypeId>,
18    pub tps: VecDeque<TypePackId>,
19    pub cyclic_instance: DenseHashSet<TypeId>,
20    pub instance_arguments: DenseHashSet<TypeId>,
21}
22
23impl InstanceCollector2 {
24    pub fn new() -> Self {
25        Self {
26            base: TypeOnceVisitor::new(String::from("InstanceCollector2"), true),
27            tys: VecDeque::new(),
28            tps: VecDeque::new(),
29            cyclic_instance: DenseHashSet::new(ptr::null()),
30            instance_arguments: DenseHashSet::new(ptr::null()),
31        }
32    }
33
34    pub fn visit_type_function_instance_type(
35        &mut self,
36        ty: TypeId,
37        it: &TypeFunctionInstanceType,
38    ) -> bool {
39        self.tys.push_front(ty);
40        for &t in &it.type_arguments {
41            let followed = unsafe { follow_type_id(t) };
42            self.instance_arguments.insert(followed);
43        }
44        true
45    }
46
47    // `cycle` lives in its own method node file (methods/instance_collector_2_cycle.rs).
48
49    pub fn visit_extern_type(&mut self, _ty: TypeId, _et: &ExternType) -> bool {
50        false
51    }
52
53    pub fn visit_type_function_instance_type_pack(
54        &mut self,
55        tp: TypePackId,
56        _itp: &TypeFunctionInstanceTypePack,
57    ) -> bool {
58        self.tps.push_front(tp);
59        true
60    }
61}