Skip to main content

luaur_analysis/methods/
overload_resolver_is_arity_compatible.rs

1use 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}