Skip to main content

luaur_analysis/functions/
clone_incremental_clone.rs

1//! Source: `Analysis/src/Clone.cpp:643-658`
2//! `TypePackId cloneIncremental(TypePackId tp, TypeArena& dest, CloneState& cloneState, Scope* freshScopeForFreeTypes)`.
3
4use crate::functions::clone_clone_alt_b::with_clone_maps;
5use crate::records::clone_state::CloneState;
6use crate::records::fragment_autocomplete_type_cloner::FragmentAutocompleteTypeCloner;
7use crate::records::scope::Scope;
8use crate::records::type_arena::TypeArena;
9use crate::type_aliases::type_id::TypeId;
10use crate::type_aliases::type_pack_id::TypePackId;
11use std::collections::HashMap;
12
13pub fn clone_incremental(
14    tp: TypePackId,
15    dest: &mut TypeArena,
16    clone_state: &mut CloneState,
17    fresh_scope_for_free_types: *mut Scope,
18) -> TypePackId {
19    if unsafe { (*tp).persistent } {
20        return tp;
21    }
22
23    let builtin_types = clone_state.builtin_types;
24    with_clone_maps(
25        &mut clone_state.seen_types,
26        &mut clone_state.seen_type_packs,
27        |tys, tps| {
28            let mut cloner = FragmentAutocompleteTypeCloner::fragment_autocomplete_type_cloner(
29                dest as *mut TypeArena,
30                builtin_types,
31                tys as *mut HashMap<TypeId, TypeId>,
32                tps as *mut HashMap<TypePackId, TypePackId>,
33                core::ptr::null(),
34                core::ptr::null(),
35                fresh_scope_for_free_types,
36            );
37            cloner.base.clone_type_pack_id(tp)
38        },
39    )
40}