rue_compiler/compile/ty/
lambda.rs

1use 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}