From ad11a3bd6a920201ee23fdaaebb5c867d0684bb2 Mon Sep 17 00:00:00 2001 From: Selimaj Dev Date: Thu, 28 May 2026 12:16:28 +0200 Subject: [PATCH] Improved match item span --- crates/codegen/src/statement.rs | 6 ++++- crates/parser/src/ast/statement.rs | 5 +++- crates/parser/src/parser/common/statement.rs | 25 ++++++++++++-------- 3 files changed, 24 insertions(+), 12 deletions(-) diff --git a/crates/codegen/src/statement.rs b/crates/codegen/src/statement.rs index aa7a37a..b3c6901 100644 --- a/crates/codegen/src/statement.rs +++ b/crates/codegen/src/statement.rs @@ -59,7 +59,11 @@ impl GenRust for Statement { cg.add(" {"); cg.indent += 1; - for (pat, body) in match_items { + for match_item in match_items { + cg.add_indentedln(&match_item.get_comment()); + + let MatchItem(pat, body) = &match_item.item; + for (i, p) in pat.iter().enumerate() { cg.addln(""); cg.add_indented(""); diff --git a/crates/parser/src/ast/statement.rs b/crates/parser/src/ast/statement.rs index 0196e72..412e2f0 100644 --- a/crates/parser/src/ast/statement.rs +++ b/crates/parser/src/ast/statement.rs @@ -35,7 +35,7 @@ pub enum Statement { iterator: Expression, body: StatementBody, }, - Match(Expression, Vec<(Vec, Expression)>), + Match(Expression, Vec>), VarDecl(VarDeclStmt), Return(Option), @@ -43,6 +43,9 @@ pub enum Statement { Continue, } +#[derive(Debug, Clone, Serialize)] +pub struct MatchItem(pub Vec, pub Expression); + #[derive(Debug, Clone, Serialize)] pub struct VarDecl { pub name: Pattern, diff --git a/crates/parser/src/parser/common/statement.rs b/crates/parser/src/parser/common/statement.rs index fddee57..5ca288e 100644 --- a/crates/parser/src/parser/common/statement.rs +++ b/crates/parser/src/parser/common/statement.rs @@ -2,7 +2,7 @@ use crate::{ Rule, ast::*, ast_ensure, ast_expr, - error::{AstError, AstResult, IntoErr, collect_recovered}, + error::{AstError, IntoErr, collect_recovered}, }; impl<'a> TryFrom> for Block { @@ -103,18 +103,23 @@ impl<'a> TryFrom> for Statement { Rule::match_stmt => ast_expr!(Statement::Match( inner.next().unwrap().try_into(), - inner - .map(|match_itms| { - let mut match_inner = match_itms.into_inner(); - Ok(( - collect_recovered(match_inner.next().unwrap().into_inner()).get()?, - Expression::try_from(match_inner.next().unwrap()).get()?, - )) - }) - .collect::>>(), + collect_recovered(inner), )), _ => AstError::bug_unimplemented(pair), } } } + +impl<'a> TryFrom> for MatchItem { + type Error = AstError<'a, Self>; + + fn try_from(pair: pest::iterators::Pair<'a, Rule>) -> Result { + let mut match_inner = pair.into_inner(); + + Ok(MatchItem( + collect_recovered(match_inner.next().unwrap().into_inner()).get()?, + Expression::try_from(match_inner.next().unwrap()).get()?, + )) + } +}