luaur_analysis/methods/
overload_resolver_resolve_overload.rs1use 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 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}