luaur_analysis/methods/
instantiation_clean_instantiation.rs1use 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}