luaur_analysis/functions/
shallow_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 shallow_clone(
10 tp: TypePackId,
11 dest: &mut TypeArena,
12 clone_state: &mut CloneState,
13 clone_persistent_types: bool,
14) -> TypePackId {
15 if unsafe { (*tp).persistent } && !clone_persistent_types {
16 return tp;
17 }
18
19 let builtin_types = clone_state.builtin_types;
20 let force_tp: TypePackId = if clone_persistent_types {
21 tp
22 } else {
23 core::ptr::null()
24 };
25 with_clone_maps(
26 &mut clone_state.seen_types,
27 &mut clone_state.seen_type_packs,
28 |tys, tps| {
29 let mut cloner = TypeCloner {
30 arena: dest as *mut TypeArena,
31 builtin_types,
32 queue: alloc::vec::Vec::new(),
33 types: tys as *mut HashMap<TypeId, TypeId>,
34 packs: tps as *mut HashMap<TypePackId, TypePackId>,
35 force_ty: core::ptr::null(),
36 force_tp,
37 steps: 0,
38 replacement_for_null_scope: core::ptr::null_mut(),
39 skip_lazy_type_clone: false,
40 };
41 cloner.shallow_clone_type_pack_id(tp)
42 },
43 )
44}