Skip to main content

luaur_analysis/methods/
overload_resolver_resolve_overload.rs

1//! Node: `cxx:Method:Luau.Analysis:Analysis/src/OverloadResolver.cpp:175:overload_resolver_resolve_overload`
2//! Source: `Analysis/src/OverloadResolver.cpp:175-196` (hand-ported)
3
4use crate::functions::follow_type::follow_type_id;
5use crate::functions::get_type_alt_j::get_type_id;
6use crate::records::intersection_type::IntersectionType;
7use crate::records::overload_resolution::OverloadResolution;
8use crate::records::overload_resolver::OverloadResolver;
9use crate::type_aliases::type_id::TypeId;
10use crate::type_aliases::type_pack_id::TypePackId;
11use luaur_ast::records::location::Location;
12use luaur_common::records::dense_hash_set::DenseHashSet;
13
14impl OverloadResolver {
15    /// C++ `OverloadResolution resolveOverload(TypeId ty, TypePackId argsPack, Location fnLocation, NotNull<DenseHashSet<TypeId>> uniqueTypes, bool useFreeTypeBounds)`.
16    pub fn resolve_overload(
17        &mut self,
18        ty: TypeId,
19        args_pack: TypePackId,
20        fn_location: Location,
21        unique_types: *mut DenseHashSet<TypeId>,
22        _use_free_type_bounds: bool,
23    ) -> OverloadResolution {
24        let mut result = OverloadResolution {
25            ok: alloc::vec::Vec::new(),
26            non_functions: alloc::vec::Vec::new(),
27            potential_overloads: alloc::vec::Vec::new(),
28            incompatible_overloads: alloc::vec::Vec::new(),
29            arity_mismatches: alloc::vec::Vec::new(),
30            metamethods: DenseHashSet::new(core::ptr::null_mut()),
31        };
32
33        let ty = unsafe { follow_type_id(ty) };
34
35        let it = unsafe { get_type_id::<IntersectionType>(ty) };
36        if !it.is_null() {
37            let parts = unsafe { (*it).parts.clone() };
38            for component in parts {
39                self.test_function_or_union(
40                    &mut result,
41                    component,
42                    args_pack,
43                    fn_location,
44                    unique_types,
45                );
46            }
47        } else {
48            self.test_function_or_union(&mut result, ty, args_pack, fn_location, unique_types);
49        }
50
51        result
52    }
53}