rue_compiler/compile/ty/
lambda.rs1use log::debug;
2use rue_ast::AstLambdaType;
3use rue_diagnostic::DiagnosticKind;
4use rue_types::{FunctionType, Type, TypeId};
5
6use crate::{Compiler, compile_type};
7
8pub fn compile_lambda_type(ctx: &mut Compiler, lambda: &AstLambdaType) -> TypeId {
9 let mut params = Vec::new();
10 let mut nil_terminated = true;
11
12 let len = lambda.parameters().count();
13
14 for (i, param) in lambda.parameters().enumerate() {
15 let is_spread = if let Some(spread) = param.spread() {
16 if i == len - 1 {
17 true
18 } else {
19 ctx.diagnostic(&spread, DiagnosticKind::NonFinalSpread);
20 false
21 }
22 } else {
23 false
24 };
25
26 if is_spread {
27 nil_terminated = false;
28 }
29
30 let ty = if let Some(ty) = param.ty() {
31 compile_type(ctx, &ty)
32 } else {
33 debug!("Unresolved lambda parameter type");
34 ctx.builtins().unresolved.ty
35 };
36
37 params.push(ty);
38 }
39
40 let ret = if let Some(ty) = lambda.return_type() {
41 compile_type(ctx, &ty)
42 } else {
43 debug!("Unresolved lambda return type");
44 ctx.builtins().unresolved.ty
45 };
46
47 ctx.alloc_type(Type::Function(FunctionType {
48 params,
49 nil_terminated,
50 ret,
51 }))
52}