formalang 0.0.5-beta

FormaLang compiler frontend: lexer, parser, semantic analyzer, and IR lowering.
Documentation
use crate::ast::Expr;
use crate::ir::lower::IrLowerer;
use crate::ir::{IrExpr, ResolvedType};

impl IrLowerer<'_> {
    pub(in crate::ir::lower::expr) fn lower_invocation(
        &mut self,
        path: &[crate::ast::Ident],
        type_args: &[crate::ast::Type],
        args: &[(Option<crate::ast::Ident>, Expr)],
    ) -> IrExpr {
        let name = path
            .iter()
            .map(|id| id.name.as_str())
            .collect::<Vec<_>>()
            .join("::");
        let type_args_resolved: Vec<ResolvedType> =
            type_args.iter().map(|t| self.lower_type(t)).collect();

        if let Some(id) = self.module.struct_id(&name) {
            self.lower_struct_invocation(id, type_args_resolved, args)
        } else if let Some(external_ty) = self.try_external_type(&name, type_args_resolved.clone())
        {
            self.lower_external_invocation(external_ty, type_args_resolved, args)
        } else if let Some(call) = self.try_lower_closure_invocation(path, args) {
            call
        } else {
            self.lower_function_invocation(path, &type_args_resolved, args)
        }
    }
}