luaur_analysis/functions/
clone_clone_alt_c.rs1use crate::functions::clone_clone_alt_b::with_clone_maps;
2use crate::records::clone_state::CloneState;
3use crate::records::type_arena::TypeArena;
4use crate::records::type_cloner::TypeCloner;
5use crate::records::type_fun::TypeFun;
6use crate::type_aliases::type_id::TypeId;
7use crate::type_aliases::type_pack_id::TypePackId;
8use std::collections::HashMap;
9
10pub fn clone(type_fun: &TypeFun, dest: &mut TypeArena, clone_state: &mut CloneState) -> TypeFun {
11 let builtin_types = clone_state.builtin_types;
12 with_clone_maps(
13 &mut clone_state.seen_types,
14 &mut clone_state.seen_type_packs,
15 |tys, tps| {
16 let mut cloner = TypeCloner {
17 arena: dest as *mut TypeArena,
18 builtin_types,
19 queue: alloc::vec::Vec::new(),
20 types: tys as *mut HashMap<TypeId, TypeId>,
21 packs: tps as *mut HashMap<TypePackId, TypePackId>,
22 force_ty: core::ptr::null(),
23 force_tp: core::ptr::null(),
24 steps: 0,
25 replacement_for_null_scope: core::ptr::null_mut(),
26 skip_lazy_type_clone: false,
27 };
28
29 let mut copy = type_fun.clone();
30
31 for param in copy.type_params.iter_mut() {
32 param.ty = cloner.clone_type_id(param.ty);
33
34 if let Some(default_value) = param.defaultValue {
35 param.defaultValue = Some(cloner.clone_type_id(default_value));
36 }
37 }
38
39 for param in copy.type_pack_params.iter_mut() {
40 param.tp = cloner.clone_type_pack_id(param.tp);
41
42 if let Some(default_value) = param.defaultValue {
43 param.defaultValue = Some(cloner.clone_type_pack_id(default_value));
44 }
45 }
46
47 copy.r#type = cloner.clone_type_id(copy.r#type);
48
49 copy
50 },
51 )
52}