Skip to main content

luaur_analysis/methods/
instantiation_clean_instantiation.rs

1use crate::functions::as_mutable_type::as_mutable_type_id;
2use crate::records::function_type::FunctionType;
3use crate::records::instantiation::Instantiation;
4use crate::type_aliases::type_id::TypeId;
5use luaur_common::macros::luau_assert::LUAU_ASSERT;
6
7impl Instantiation {
8    pub fn clean_type_id(&mut self, ty: TypeId) -> TypeId {
9        let ftv = unsafe { (*self.base.base.log).txn_log_get_mutable::<FunctionType, TypeId>(ty) };
10        LUAU_ASSERT!(!ftv.is_null());
11        let ftv = unsafe { &*ftv };
12
13        let mut clone = FunctionType::function_type_new(
14            ftv.arg_types,
15            ftv.ret_types,
16            ftv.definition.clone(),
17            ftv.has_self,
18        );
19        clone.level = self.level;
20        clone.magic = ftv.magic.clone();
21        clone.tags = ftv.tags.clone();
22        clone.arg_names = ftv.arg_names.clone();
23        clone.is_deprecated_function = ftv.is_deprecated_function;
24        clone.deprecated_info = ftv.deprecated_info.clone();
25        clone.is_checked_function = ftv.is_checked_function;
26
27        let result = self.base.add_type(clone);
28
29        self.reusable_replace_generics.reset_state(
30            self.base.base.log,
31            self.base.arena,
32            self.builtin_types,
33            self.level,
34            self.scope,
35            ftv.generics.clone(),
36            ftv.generic_packs.clone(),
37        );
38
39        let result = self
40            .reusable_replace_generics
41            .substitute_type_id(result)
42            .unwrap_or(result);
43
44        unsafe {
45            (*as_mutable_type_id(result)).documentation_symbol = (*ty).documentation_symbol.clone();
46        }
47
48        result
49    }
50}