From 69f0e8bcf76ed7990b45f0b077511df156dfdf23 Mon Sep 17 00:00:00 2001 From: Arthur Baars Date: Tue, 1 Oct 2024 15:17:17 +0200 Subject: [PATCH] Rust: add MacroStmts and MacroItems --- rust/ast-generator/src/main.rs | 3 --- rust/extractor/src/translate/generated.rs | 24 +++++++++++++++++++++++ rust/schema/ast.py | 7 +++++++ 3 files changed, 31 insertions(+), 3 deletions(-) diff --git a/rust/ast-generator/src/main.rs b/rust/ast-generator/src/main.rs index 8d4114c8bde..043848e902c 100644 --- a/rust/ast-generator/src/main.rs +++ b/rust/ast-generator/src/main.rs @@ -538,9 +538,6 @@ fn main() -> std::io::Result<()> { .parse() .unwrap(); let mut grammar = codegen::grammar::lower(&grammar); - grammar - .nodes - .retain(|x| x.name != "MacroStmts" && x.name != "MacroItems"); grammar.enums.retain(|x| x.name != "Adt"); diff --git a/rust/extractor/src/translate/generated.rs b/rust/extractor/src/translate/generated.rs index 57d3cbc186b..9725bbfa6b6 100644 --- a/rust/extractor/src/translate/generated.rs +++ b/rust/extractor/src/translate/generated.rs @@ -1004,6 +1004,17 @@ impl Translator { label } + pub(crate) fn emit_macro_items(&mut self, node: ast::MacroItems) -> Label { + let items = node.items().map(|x| self.emit_item(x)).collect(); + let label = self.trap.emit(generated::MacroItems { + id: TrapId::Star, + items, + }); + self.emit_location(label, &node); + self.emit_tokens(label.into(), node.syntax().children_with_tokens()); + label + } + pub(crate) fn emit_macro_pat(&mut self, node: ast::MacroPat) -> Label { let macro_call = node.macro_call().map(|x| self.emit_macro_call(x)); let label = self.trap.emit(generated::MacroPat { @@ -1032,6 +1043,19 @@ impl Translator { label } + pub(crate) fn emit_macro_stmts(&mut self, node: ast::MacroStmts) -> Label { + let expr = node.expr().map(|x| self.emit_expr(x)); + let statements = node.statements().map(|x| self.emit_stmt(x)).collect(); + let label = self.trap.emit(generated::MacroStmts { + id: TrapId::Star, + expr, + statements, + }); + self.emit_location(label, &node); + self.emit_tokens(label.into(), node.syntax().children_with_tokens()); + label + } + pub(crate) fn emit_macro_type(&mut self, node: ast::MacroType) -> Label { let macro_call = node.macro_call().map(|x| self.emit_macro_call(x)); let label = self.trap.emit(generated::MacroType { diff --git a/rust/schema/ast.py b/rust/schema/ast.py index 665afe12b7d..6e146c7c54d 100644 --- a/rust/schema/ast.py +++ b/rust/schema/ast.py @@ -304,6 +304,9 @@ class MacroDef(Item): class MacroExpr(Expr): macro_call: optional["MacroCall"] | child +class MacroItems(AstNode): + items: list["Item"] | child + class MacroPat(Pat): macro_call: optional["MacroCall"] | child @@ -313,6 +316,10 @@ class MacroRules(Item): token_tree: optional["TokenTree"] | child visibility: optional["Visibility"] | child +class MacroStmts(AstNode): + expr: optional["Expr"] | child + statements: list["Stmt"] | child + class MacroType(TypeRef): macro_call: optional["MacroCall"] | child