Skip to main content

luaur_analysis/functions/
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 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}