From 7a2ba74d9c6d36b87d9fea22af0310cba8d1acfd Mon Sep 17 00:00:00 2001 From: Selimaj Dev Date: Thu, 28 May 2026 11:52:40 +0200 Subject: [PATCH] Working mut pattern --- crates/codegen/src/lib.rs | 18 +++++++++--------- crates/parser/src/ast/expr.rs | 6 +++--- crates/parser/src/grammar.pest | 2 +- crates/parser/src/parser/common/mod.rs | 10 ++++++---- 4 files changed, 19 insertions(+), 17 deletions(-) diff --git a/crates/codegen/src/lib.rs b/crates/codegen/src/lib.rs index cf88d9d..fe6678d 100644 --- a/crates/codegen/src/lib.rs +++ b/crates/codegen/src/lib.rs @@ -243,30 +243,30 @@ impl GenRust for Pattern { } Self::Literal(lit) => lit.gen_rust(ctx, cg), - Self::Struct(path, ids) => { + Self::Struct(path, inner) => { cg.add(&path.get_rust()); cg.add(" {"); - for id in ids { - cg.add(&id.get_rust()); + for pat in inner { + pat.gen_rust(ctx, cg); cg.add(","); } cg.add("}"); } - Self::NamedTuple(path, ids) => { + Self::NamedTuple(path, inner) => { cg.add(&path.get_rust()); cg.add(" ("); - for id in ids { - cg.add(&id.get_rust()); + for pat in inner { + pat.gen_rust(ctx, cg); cg.add(","); } cg.add(")"); } - Self::Tuple(ids) => { + Self::Tuple(inner) => { cg.add("("); - for id in ids { - cg.add(&id.get_rust()); + for pat in inner { + pat.gen_rust(ctx, cg); cg.add(","); } cg.add(")"); diff --git a/crates/parser/src/ast/expr.rs b/crates/parser/src/ast/expr.rs index fcec338..23fb010 100644 --- a/crates/parser/src/ast/expr.rs +++ b/crates/parser/src/ast/expr.rs @@ -32,9 +32,9 @@ pub enum Literal { #[derive(Debug, Clone, Serialize)] pub enum Pattern { - NamedTuple(Path, Vec), - Struct(Path, Vec), - Tuple(Vec), + NamedTuple(Path, Vec>), + Struct(Path, Vec>), + Tuple(Vec>), Literal(Literal), Path(bool, Path), } diff --git a/crates/parser/src/grammar.pest b/crates/parser/src/grammar.pest index 476234a..7267ca4 100644 --- a/crates/parser/src/grammar.pest +++ b/crates/parser/src/grammar.pest @@ -135,7 +135,7 @@ literal = { // ====================================================== multi_pat_template = _{ - (identifier ~ ("," ~ identifier)*)? + (pattern ~ ("," ~ pattern)*)? } tuple_pattern = { diff --git a/crates/parser/src/parser/common/mod.rs b/crates/parser/src/parser/common/mod.rs index 3b79896..59f0866 100644 --- a/crates/parser/src/parser/common/mod.rs +++ b/crates/parser/src/parser/common/mod.rs @@ -7,7 +7,7 @@ use crate::{ Rule, ast::*, ast_ensure, ast_expr, - error::{AstError, AstResult, IntoErr, collect_recovered}, + error::{AstError, AstResult, IntoErr, collect_recovered, collect_recovered_map}, parser::{consume_rule, listen_rule}, }; @@ -60,16 +60,18 @@ impl<'a> TryFrom> for Pattern { let mut inner = pair.clone().into_inner(); match rule { - Rule::tuple_pattern => ast_expr!(Pattern::Tuple(collect_recovered(pair.into_inner()))), + Rule::tuple_pattern => ast_expr!(Pattern::Tuple(collect_recovered_map(inner, |v| { + Self::try_from(v).map(Box::new) + }))), Rule::named_tuple_pattern => ast_expr!(Pattern::NamedTuple( Path::try_from(inner.next().unwrap()), - collect_recovered(inner), + collect_recovered_map(inner, |v| Self::try_from(v).map(Box::new)), )), Rule::struct_pattern => ast_expr!(Pattern::Struct( Path::try_from(inner.next().unwrap()), - collect_recovered(inner), + collect_recovered_map(inner, |v| Self::try_from(v).map(Box::new)), )), Rule::literal => ast_expr!(Pattern::Literal(pair.try_into())),