luaur_analysis/records/
instance_collector_2.rs1use 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 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}