Skip to main content

luaur_analysis/functions/
first.rs

1use crate::functions::begin_type_pack::begin_type_pack_id;
2use crate::functions::end_type_pack::end_type_pack_id;
3use crate::functions::get_type_pack::get_type_pack_id;
4use crate::records::type_pack_iterator::TypePackIterator;
5use crate::records::variadic_type_pack::VariadicTypePack;
6use crate::type_aliases::type_id::TypeId;
7use crate::type_aliases::type_pack_id::TypePackId;
8
9pub fn first(tp: TypePackId, ignore_hidden_variadics: bool) -> Option<TypeId> {
10    let mut iter = begin_type_pack_id(tp);
11    let end_iter = end_type_pack_id(tp);
12
13    if iter.operator_ne(&end_iter) {
14        return Some(*iter.operator_deref());
15    }
16
17    if let Some(tail) = iter.tail() {
18        let vtp = unsafe { get_type_pack_id::<VariadicTypePack>(tail) };
19        if !vtp.is_null() {
20            let vtp_ref = unsafe { &*vtp };
21            if !vtp_ref.hidden || !ignore_hidden_variadics {
22                return Some(vtp_ref.ty);
23            }
24        }
25    }
26
27    None
28}