https://gcc.gnu.org/g:30ec03e4caa718048bec6cd16330d8426a1dc5bb
commit r17-3069-g30ec03e4caa718048bec6cd16330d8426a1dc5bb Author: Pierre-Emmanuel Patry <[email protected]> Date: Mon Jun 29 13:46:23 2026 +0200 gccrs: Simplify module and extern block emission We would have to call two functions, one of which could be forgotten, this would also duplicates the condition. This new interface makes things a bit simpler. gcc/rust/ChangeLog: * metadata/rust-export-metadata.cc (ExportContext::begin_extern_block): Delete function. (ExportContext::end_extern_block): Likewise. (ExportContext::begin_module): Likewise. (ExportContext::end_module): Likewise. (ExportContext::emit_extern_block): Merge both begin/end within one function that calls the visitor in between. (ExportContext::emit_module): Likewise. * metadata/rust-export-metadata.h: Update function prototypes. Signed-off-by: Pierre-Emmanuel Patry <[email protected]> Diff: --- gcc/rust/metadata/rust-export-metadata.cc | 37 +++++++++++++------------------ gcc/rust/metadata/rust-export-metadata.h | 8 +++---- 2 files changed, 19 insertions(+), 26 deletions(-) diff --git a/gcc/rust/metadata/rust-export-metadata.cc b/gcc/rust/metadata/rust-export-metadata.cc index 3388d0e920da..6998319d8575 100644 --- a/gcc/rust/metadata/rust-export-metadata.cc +++ b/gcc/rust/metadata/rust-export-metadata.cc @@ -107,30 +107,25 @@ ExportContext::emit_function (AST::Function &fn) } void -ExportContext::begin_extern_block (AST::ExternBlock &block) +ExportContext::emit_extern_block (const AST::ExternBlock &block, + std::function<void (void)> sub_visitor) { public_interface_buffer += "extern \"" + block.get_abi () + "\" {\n"; -} - -void -ExportContext::end_extern_block () -{ + sub_visitor (); public_interface_buffer += "}\n"; } void -ExportContext::begin_module (const AST::Module &module) +ExportContext::emit_module (const AST::Module &module, + std::function<void (void)> sub_visitor) { if (module.get_visibility ().is_public ()) - public_interface_buffer - += "pub mod " + module.get_name ().as_string () + "{\n"; -} - -void -ExportContext::end_module (const AST::Module &module) -{ - if (module.get_visibility ().is_public ()) - public_interface_buffer += "}\n"; + { + public_interface_buffer + += "pub mod " + module.get_name ().as_string () + "{\n"; + sub_visitor (); + public_interface_buffer += "}\n"; + } } void @@ -166,16 +161,14 @@ public: } void visit (AST::ExternBlock &block) override { - ctx.begin_extern_block (block); - AST::DefaultASTVisitor::visit (block); - ctx.end_extern_block (); + auto sub_visitor = [&] () { AST::DefaultASTVisitor::visit (block); }; + ctx.emit_extern_block (block, sub_visitor); } void visit (AST::Trait &trait) override { ctx.emit_trait (trait); } void visit (AST::Module &module) override { - ctx.begin_module (module); - AST::DefaultASTVisitor::visit (module); - ctx.end_module (module); + auto sub_visitor = [&] () { AST::DefaultASTVisitor::visit (module); }; + ctx.emit_module (module, sub_visitor); } void visit (AST::UseDeclaration &use_decl) override diff --git a/gcc/rust/metadata/rust-export-metadata.h b/gcc/rust/metadata/rust-export-metadata.h index 17dc20a7d5f2..b1e12f2647ff 100644 --- a/gcc/rust/metadata/rust-export-metadata.h +++ b/gcc/rust/metadata/rust-export-metadata.h @@ -42,11 +42,11 @@ public: void emit_trait (AST::Trait &trait); void emit_function (AST::Function &fn); - void begin_extern_block (AST::ExternBlock &block); - void end_extern_block (); + void emit_extern_block (const AST::ExternBlock &block, + std::function<void (void)> sub_visitor); void emit_use_declaration (AST::UseDeclaration &use_decl); - void begin_module (const AST::Module &module); - void end_module (const AST::Module &module); + void emit_module (const AST::Module &, + std::function<void (void)> sub_visitor); /** * Macros are a bit particular - they only live at the AST level, so we can
