Skip to main content

luaur_analysis/methods/
instantiation_instantiation.rs

1//! Node: `cxx:Method:Luau.Analysis:Analysis/include/Luau/Instantiation.h:66:Instantiation`
2//! Source: `Analysis/include/Luau/Instantiation.h` (Instantiation.h:66-73, hand-ported)
3use crate::records::builtin_types::BuiltinTypes;
4use crate::records::instantiation::Instantiation;
5use crate::records::replace_generics::ReplaceGenerics;
6use crate::records::scope::Scope;
7use crate::records::substitution::Substitution;
8use crate::records::tarjan::SubstitutionVtable;
9use crate::records::txn_log::TxnLog;
10use crate::records::type_arena::TypeArena;
11use crate::records::type_level::TypeLevel;
12use crate::type_aliases::type_id::TypeId;
13use crate::type_aliases::type_pack_id::TypePackId;
14use alloc::vec::Vec;
15use core::ffi::c_void;
16
17fn instantiation_is_dirty_ty(owner: *mut c_void, ty: TypeId) -> bool {
18    unsafe { (*(owner as *mut Instantiation)).is_dirty_type_id(ty) }
19}
20
21fn instantiation_is_dirty_tp(_owner: *mut c_void, _tp: TypePackId) -> bool {
22    false
23}
24
25fn instantiation_clean_ty(owner: *mut c_void, ty: TypeId) -> TypeId {
26    unsafe { (*(owner as *mut Instantiation)).clean_type_id(ty) }
27}
28
29fn instantiation_clean_tp(_owner: *mut c_void, tp: TypePackId) -> TypePackId {
30    tp
31}
32
33fn instantiation_found_dirty_ty(owner: *mut c_void, ty: TypeId) {
34    unsafe {
35        (*(owner as *mut Instantiation))
36            .base
37            .found_dirty_type_id(ty)
38    }
39}
40
41fn instantiation_found_dirty_tp(owner: *mut c_void, tp: TypePackId) {
42    unsafe {
43        (*(owner as *mut Instantiation))
44            .base
45            .found_dirty_type_pack_id(tp)
46    }
47}
48
49fn instantiation_ignore_children_ty(owner: *mut c_void, ty: TypeId) -> bool {
50    unsafe { (*(owner as *mut Instantiation)).ignore_children(ty) }
51}
52
53fn instantiation_ignore_children_tp(_owner: *mut c_void, _tp: TypePackId) -> bool {
54    false
55}
56
57impl Instantiation {
58    /// C++ `Instantiation(const TxnLog* log, TypeArena* arena, NotNull<BuiltinTypes> builtinTypes,
59    /// TypeLevel level, Scope* scope) : Substitution(log, arena), builtinTypes(builtinTypes),
60    /// level(level), scope(scope), reusableReplaceGenerics(log, arena, builtinTypes, level, scope, {}, {})`.
61    pub fn instantiation_new(
62        log: *const TxnLog,
63        arena: *mut TypeArena,
64        builtin_types: *mut BuiltinTypes,
65        level: TypeLevel,
66        scope: *mut Scope,
67    ) -> Self {
68        Instantiation {
69            base: Substitution::substitution_new(log, arena),
70            builtin_types,
71            level,
72            scope,
73            reusable_replace_generics: ReplaceGenerics::replace_generics_new(
74                log,
75                arena,
76                builtin_types,
77                level,
78                scope,
79                Vec::new(),
80                Vec::new(),
81            ),
82        }
83    }
84
85    fn install_substitution_vtable(&mut self) {
86        let owner = self as *mut Instantiation as *mut c_void;
87        self.base.base.vtable = SubstitutionVtable {
88            owner,
89            is_dirty_ty: Some(instantiation_is_dirty_ty),
90            is_dirty_tp: Some(instantiation_is_dirty_tp),
91            clean_ty: Some(instantiation_clean_ty),
92            clean_tp: Some(instantiation_clean_tp),
93            found_dirty_ty: Some(instantiation_found_dirty_ty),
94            found_dirty_tp: Some(instantiation_found_dirty_tp),
95            ignore_children_ty: Some(instantiation_ignore_children_ty),
96            ignore_children_tp: Some(instantiation_ignore_children_tp),
97            ignore_children_visit_ty: Some(instantiation_ignore_children_ty),
98            ignore_children_visit_tp: Some(instantiation_ignore_children_tp),
99        };
100    }
101
102    pub fn substitute_type_id(&mut self, ty: TypeId) -> Option<TypeId> {
103        self.install_substitution_vtable();
104        self.base.substitute_type_id(ty)
105    }
106
107    pub fn substitute_type_pack_id(&mut self, tp: TypePackId) -> Option<TypePackId> {
108        self.install_substitution_vtable();
109        self.base.substitute_type_pack_id(tp)
110    }
111}