Skip to main content

luaur_analysis/methods/
subtyping_environment_apply_mapped_generics.rs

1use crate::records::apply_mapped_generics::ApplyMappedGenerics;
2use crate::records::builtin_types::BuiltinTypes;
3use crate::records::internal_error_reporter::InternalErrorReporter;
4use crate::records::substitution::Substitution;
5use crate::records::subtyping_environment::SubtypingEnvironment;
6use crate::records::txn_log::TxnLog;
7use crate::records::type_arena::TypeArena;
8use crate::type_aliases::type_id::TypeId;
9
10impl SubtypingEnvironment {
11    /// C++ `SubtypingEnvironment::applyMappedGenerics` (`Subtyping.cpp:504-513`):
12    ///
13    /// ```cpp
14    /// ApplyMappedGenerics amg{builtinTypes, arena, *this, iceReporter};
15    /// return amg.substitute(ty);
16    /// ```
17    ///
18    /// `ApplyMappedGenerics` extends `Substitution` and inherits `substitute`,
19    /// whose traversal virtual-dispatches into the overridden `isDirty` /
20    /// `clean` / `ignoreChildren`. The Rust `ApplyMappedGenerics` now embeds
21    /// `base: Substitution` and installs those overrides into the
22    /// `SubstitutionVtable` from its `substitute_type_id` wrapper.
23    pub fn apply_mapped_generics(
24        &mut self,
25        builtin_types: *mut BuiltinTypes,
26        arena: *mut TypeArena,
27        ty: TypeId,
28        ice_reporter: *mut InternalErrorReporter,
29    ) -> Option<TypeId> {
30        let mut amg = ApplyMappedGenerics {
31            base: Substitution::substitution_new(TxnLog::empty(), arena),
32            builtin_types,
33            arena,
34            ice_reporter,
35            env: self as *mut SubtypingEnvironment,
36        };
37        amg.substitute_type_id(ty)
38    }
39}