luaur_analysis/functions/
clone_clone.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::type_aliases::type_id::TypeId;
6use crate::type_aliases::type_pack_id::TypePackId;
7use std::collections::HashMap;
8
9pub fn clone(tp: TypePackId, dest: &mut TypeArena, clone_state: &mut CloneState) -> TypePackId {
10 if unsafe { (*tp).persistent } {
11 return tp;
12 }
13
14 let builtin_types = clone_state.builtin_types;
15 with_clone_maps(
16 &mut clone_state.seen_types,
17 &mut clone_state.seen_type_packs,
18 |tys, tps| {
19 let mut cloner = TypeCloner {
20 arena: dest as *mut TypeArena,
21 builtin_types,
22 queue: alloc::vec::Vec::new(),
23 types: tys as *mut HashMap<TypeId, TypeId>,
24 packs: tps as *mut HashMap<TypePackId, TypePackId>,
25 force_ty: core::ptr::null(),
26 force_tp: core::ptr::null(),
27 steps: 0,
28 replacement_for_null_scope: core::ptr::null_mut(),
29 skip_lazy_type_clone: false,
30 };
31 cloner.clone_type_pack_id(tp)
32 },
33 )
34}