From 269e43930fff7a6364fa50b3abf43bff8dc1b59e Mon Sep 17 00:00:00 2001 From: Klesti Selimaj Date: Wed, 3 Jun 2026 18:12:30 +0200 Subject: [PATCH] Macro delimiter --- crates/codegen/src/expr.rs | 11 ++++++++--- crates/parser/src/ast/expr.rs | 12 +++++++++++- crates/parser/src/grammar.pest | 14 +++++++++----- crates/parser/src/parser/common/expr.rs | 13 ++++++++++++- 4 files changed, 40 insertions(+), 10 deletions(-) diff --git a/crates/codegen/src/expr.rs b/crates/codegen/src/expr.rs index d46e059..9e38e67 100644 --- a/crates/codegen/src/expr.rs +++ b/crates/codegen/src/expr.rs @@ -172,10 +172,15 @@ impl GenRust for Postfix { cg.add(")"); } - Postfix::MacroCall(inner) => { - cg.add("!("); + Postfix::MacroCall { inner, delimiter } => { + let (open, close) = match delimiter { + MacroDelimiter::Paren => ("!(", ")"), + MacroDelimiter::Bracket => ("![", "]"), + MacroDelimiter::Brace => ("!{", "}"), + }; + cg.add(open); cg.add(inner); - cg.add(")"); + cg.add(close); } Postfix::StructCall(fields) => { diff --git a/crates/parser/src/ast/expr.rs b/crates/parser/src/ast/expr.rs index ebe58e6..5aba972 100644 --- a/crates/parser/src/ast/expr.rs +++ b/crates/parser/src/ast/expr.rs @@ -39,11 +39,21 @@ pub enum Pattern { Path(bool, Path), } +#[derive(Debug, Clone, Serialize)] +pub enum MacroDelimiter { + Paren, + Bracket, + Brace, +} + #[derive(Debug, Clone, Serialize)] pub enum Postfix { FieldAccess(Identifier, Option), Call(Vec), - MacroCall(String), + MacroCall { + inner: String, + delimiter: MacroDelimiter, + }, StructCall(Vec<(Identifier, Expression)>), Assign(String, Box), Index(Expression), diff --git a/crates/parser/src/grammar.pest b/crates/parser/src/grammar.pest index 506a7b7..52a4955 100644 --- a/crates/parser/src/grammar.pest +++ b/crates/parser/src/grammar.pest @@ -475,7 +475,9 @@ array = { macro_inner_v = @{ string_lit | ("(" ~ macro_inner_v* ~ ")") - | (!("(" | ")") ~ ANY) + | ("[" ~ macro_inner_v* ~ "]") + | ("{" ~ macro_inner_v* ~ "}") + | (!("(" | ")" | "[" | "]" | "{" | "}") ~ ANY) } // ------------------------------------------------------ @@ -511,9 +513,9 @@ call_px = { "(" ~ (expr ~ ("," ~ expr)*)? ~ ")" } -macro_call_px = { - "!" ~ "(" ~ macro_inner_v* ~ ")" -} +macro_call_paren = { "!" ~ "(" ~ macro_inner_v* ~ ")" } +macro_call_bracket = { "!" ~ "[" ~ macro_inner_v* ~ "]" } +macro_call_brace = { "!" ~ "{" ~ macro_inner_v* ~ "}" } struct_field_decl = { identifier ~ ":" ~ expr @@ -546,7 +548,9 @@ decrement = { postfix = { field_px | call_px - | macro_call_px + | macro_call_paren + | macro_call_bracket + | macro_call_brace | struct_px | index_px | as_px diff --git a/crates/parser/src/parser/common/expr.rs b/crates/parser/src/parser/common/expr.rs index 59504f4..fd83e0e 100644 --- a/crates/parser/src/parser/common/expr.rs +++ b/crates/parser/src/parser/common/expr.rs @@ -155,7 +155,18 @@ impl<'a> TryFrom> for Postfix { ast_expr!(Postfix::Index(Expression::try_from(inner.next().unwrap()))) } - Rule::macro_call_px => Ok(Postfix::MacroCall(inner.as_str().to_string())), + Rule::macro_call_paren => Ok(Postfix::MacroCall { + inner: inner.as_str().to_string(), + delimiter: MacroDelimiter::Paren, + }), + Rule::macro_call_bracket => Ok(Postfix::MacroCall { + inner: inner.as_str().to_string(), + delimiter: MacroDelimiter::Bracket, + }), + Rule::macro_call_brace => Ok(Postfix::MacroCall { + inner: inner.as_str().to_string(), + delimiter: MacroDelimiter::Brace, + }), Rule::as_px => { ast_expr!(Postfix::As(inner.next().unwrap().try_into()))