luaur_analysis/functions/
make_function_builtin_definitions_alt_d.rs1use 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(¶ms);
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}