From a9eb77f1583dbf22326ca4400166cf91afb3b504 Mon Sep 17 00:00:00 2001 From: Klesti Selimaj Date: Fri, 5 Jun 2026 18:51:55 +0200 Subject: [PATCH] Update: Closures #64 --- crates/parser/src/grammar.pest | 5 ++++- crates/parser/src/parser/common/expr.rs | 4 ++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/crates/parser/src/grammar.pest b/crates/parser/src/grammar.pest index f6cf6b5..e4f33fb 100644 --- a/crates/parser/src/grammar.pest +++ b/crates/parser/src/grammar.pest @@ -453,7 +453,10 @@ match_stmt = { // CLOSURES // ------------------------------------------------------ -closure = { type_expr? ~ "fn" ~ "(" ~ param_list ~ ")" ~ expr } +closure = { + "fn" ~ "(" ~ param_list ~ ")" ~ type_expr? ~ block + | "fn" ~ "(" ~ param_list ~ ")" ~ type_expr? ~ "->" ~ expr +} // ------------------------------------------------------ // TUPLES & ARRAYS diff --git a/crates/parser/src/parser/common/expr.rs b/crates/parser/src/parser/common/expr.rs index e105511..be1790a 100644 --- a/crates/parser/src/parser/common/expr.rs +++ b/crates/parser/src/parser/common/expr.rs @@ -77,10 +77,10 @@ impl<'a> TryFrom> for Expression { Rule::closure => { ast_expr!(Expression::Closure { + params: collect_recovered(inner.next().unwrap().into_inner()), return_type: consume_rule(&mut inner, Rule::type_expr) .map(TypeExpr::try_from) .transpose(), - params: collect_recovered(inner.next().unwrap().into_inner()), body: Expression::try_from(inner.next().unwrap()).map(Box::new), }) } @@ -109,7 +109,7 @@ impl<'a> TryFrom> for Expression { )), } } - Rule::statement | Rule::basic_stmt | Rule::control_flow => ast_expr!( + Rule::statement | Rule::basic_stmt | Rule::control_flow | Rule::block => ast_expr!( Expression::Statement(pair.try_into().get_map(Box::new).map(Box::new)) ),