Skip to main content

luaur_analysis/functions/
shallow_clone_clone.rs

1use 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}