Skip to main content

luaur_analysis/functions/
make_function_builtin_definitions_alt_d.rs

1use crate::records::function_argument::FunctionArgument;
2use crate::records::function_type::FunctionType;
3use crate::records::type_arena::TypeArena;
4use crate::type_aliases::type_id::TypeId;
5use crate::type_aliases::type_pack_id::TypePackId;
6use alloc::string::String;
7use alloc::vec::Vec;
8use luaur_ast::records::location::Location;
9
10pub fn make_function_type_arena_optional_type_id_initializer_list_type_id_initializer_list_type_pack_id_initializer_list_type_id_initializer_list_string_initializer_list_type_id_bool(
11    arena: &mut TypeArena,
12    self_type: Option<TypeId>,
13    generics: Vec<TypeId>,
14    generic_packs: Vec<TypePackId>,
15    param_types: Vec<TypeId>,
16    param_names: Vec<String>,
17    ret_types: Vec<TypeId>,
18    checked: bool,
19) -> TypeId {
20    let mut params = Vec::new();
21    if let Some(st) = self_type {
22        params.push(st);
23    }
24    params.extend(param_types.iter().cloned());
25
26    let param_pack = arena.add_type_pack_initializer_list_type_id(&params);
27    let ret_pack = arena.add_type_pack_initializer_list_type_id(&ret_types);
28
29    let mut ftv = FunctionType::function_type_new(param_pack, ret_pack, None, self_type.is_some());
30    ftv.generics = generics;
31    ftv.generic_packs = generic_packs;
32    ftv.is_checked_function = checked;
33
34    if self_type.is_some() {
35        ftv.arg_names.push(Some(FunctionArgument {
36            name: "self".into(),
37            location: Location::default(),
38        }));
39    }
40
41    if !param_names.is_empty() {
42        for p in param_names {
43            ftv.arg_names.push(Some(FunctionArgument {
44                name: p.into(),
45                location: Location::default(),
46            }));
47        }
48    } else if self_type.is_some() {
49        for _ in 0..param_types.len() {
50            ftv.arg_names.push(None);
51        }
52    }
53
54    arena.add_type(ftv)
55}