luaur_analysis/methods/
overload_resolver_is_arity_compatible.rs1use crate::functions::flatten_type_pack::flatten_type_pack_id;
2use crate::functions::follow_type::follow_type_id;
3use crate::functions::is_optional_type::is_optional_type;
4use crate::records::builtin_types::BuiltinTypes;
5use crate::records::overload_resolver::OverloadResolver;
6use crate::type_aliases::type_pack_id::TypePackId;
7
8impl OverloadResolver {
9 pub fn is_arity_compatible(
10 &self,
11 candidate: TypePackId,
12 desired: TypePackId,
13 builtin_types: *mut BuiltinTypes,
14 ) -> bool {
15 let (candidate_head, candidate_tail) = flatten_type_pack_id(candidate);
16 let (desired_head, desired_tail) = flatten_type_pack_id(desired);
17
18 if candidate_head.len() < desired_head.len() {
19 if candidate_tail.is_some() {
20 return true;
21 }
22
23 for i in candidate_head.len()..desired_head.len() {
24 let ty = unsafe { follow_type_id(desired_head[i]) };
25 if !is_optional_type(ty, builtin_types) {
26 return false;
27 }
28 }
29 }
30
31 if candidate_head.len() > desired_head.len() {
32 return desired_tail.is_some();
33 }
34
35 true
36 }
37}