diff --git a/crates/codegen/src/expr.rs b/crates/codegen/src/expr.rs index 0de2c59..50641a9 100644 --- a/crates/codegen/src/expr.rs +++ b/crates/codegen/src/expr.rs @@ -153,6 +153,14 @@ impl GenRust for Vec { impl GenRust for Postfix { fn gen_rust(&self, ctx: &mut Context, cg: &mut RustCodegen) { match self { + Postfix::TupleFieldAccess(field, generics) => cg.add(&format!( + ".{}{}", + field, + generics + .iter() + .map(|v| format!("::{}", v.get_rust())) + .collect::() + )), Postfix::FieldAccess(field, generics) => cg.add(&format!( ".{}{}", field.get_rust(), diff --git a/crates/parser/src/ast/expr.rs b/crates/parser/src/ast/expr.rs index 08c3af3..13365c3 100644 --- a/crates/parser/src/ast/expr.rs +++ b/crates/parser/src/ast/expr.rs @@ -50,6 +50,7 @@ pub enum MacroDelimiter { #[derive(Debug, Clone, Serialize)] pub enum Postfix { FieldAccess(Identifier, Option), + TupleFieldAccess(u8, Option), Call(Vec), MacroCall { inner: String, diff --git a/crates/parser/src/grammar.pest b/crates/parser/src/grammar.pest index 4853f83..4a45207 100644 --- a/crates/parser/src/grammar.pest +++ b/crates/parser/src/grammar.pest @@ -486,7 +486,7 @@ macro_inner_v = @{ // ------------------------------------------------------ expr_path_segment = { - identifier ~ ("::" ~ generics)? + identifier ~ generics? } expr_path = { @@ -507,7 +507,11 @@ primary = { // ------------------------------------------------------ field_px = { - "." ~ identifier ~ ("::" ~ generics)? + "." ~ identifier ~ generics? +} + +tuple_field_px = { + "." ~ integer ~ generics? } call_px = { @@ -548,6 +552,7 @@ decrement = { postfix = { field_px + | tuple_field_px | call_px | macro_call_paren | macro_call_bracket diff --git a/crates/parser/src/parser/common/expr.rs b/crates/parser/src/parser/common/expr.rs index fd83e0e..12f076f 100644 --- a/crates/parser/src/parser/common/expr.rs +++ b/crates/parser/src/parser/common/expr.rs @@ -141,6 +141,14 @@ impl<'a> TryFrom> for Postfix { )) } + Rule::tuple_field_px => { + ast_expr!(Postfix::TupleFieldAccess( + Ok(inner.next().unwrap().as_str().parse().unwrap_or(255_u8)) + as AstResult<'_, u8>, + inner.next().map(Generics::try_from).transpose(), + )) + } + Rule::call_px => ast_expr!(Postfix::Call(collect_recovered(inner))), Rule::struct_px => ast_expr!(Postfix::StructCall(collect_recovered_map(inner, |p| {