luaur-analysis 0.1.3

Luau type checker and type inference (Rust).
Documentation
use crate::functions::get_type_alt_j::get_type_id;
use crate::functions::is_nil::is_nil;
use crate::records::type_arena::TypeArena;
use crate::records::union_type::UnionType;
use crate::type_aliases::type_id::TypeId;
use alloc::vec::Vec;

pub fn try_strip_union_from_nil(arena: &mut TypeArena, ty: TypeId) -> Option<TypeId> {
    unsafe {
        if !get_type_id::<UnionType>(ty).is_null() {
            let utv = &*get_type_id::<UnionType>(ty);

            if !utv.options.iter().any(|option| is_nil(*option)) {
                return Some(ty);
            }

            let mut result = Vec::new();

            for option in &utv.options {
                if !is_nil(*option) {
                    result.push(*option);
                }
            }

            if result.is_empty() {
                return None;
            }

            return if result.len() == 1 {
                Some(result[0])
            } else {
                Some(arena.add_type(UnionType { options: result }))
            };
        }

        None
    }
}