translated = lower_extern_block (extern_block);
}
+void
+ASTLoweringItem::visit (AST::MacroRulesDefinition &def)
+{
+ for (const auto &attr : def.get_outer_attrs ())
+ if (attr.get_path ().as_string () == "macro_export")
+ mappings->insert_exported_macro (def);
+}
+
HIR::SimplePath
ASTLoweringSimplePath::translate (const AST::SimplePath &path)
{
void visit (AST::Trait &trait) override;
void visit (AST::TraitImpl &impl_block) override;
void visit (AST::ExternBlock &extern_block) override;
+ void visit (AST::MacroRulesDefinition &rules_def) override;
private:
ASTLoweringItem () : translated (nullptr) {}
public_interface_buffer += oss.str ();
}
+void
+ExportContext::emit_macro (NodeId macro)
+{
+ std::stringstream oss;
+ AST::Dump dumper (oss);
+
+ AST::Item *item;
+ auto ok = mappings->lookup_ast_item (macro, &item);
+ rust_assert (ok);
+
+ dumper.go (*item);
+
+ public_interface_buffer += oss.str ();
+}
+
const std::string &
ExportContext::get_interface_buffer () const
{
if (is_crate_public (vis_item))
vis_item.accept_vis (visitor);
}
+
+ for (const auto ¯o : mappings.get_exported_macros ())
+ context.emit_macro (macro);
}
void
const HIR::Module &pop_module_scope ();
void emit_trait (const HIR::Trait &trait);
-
void emit_function (const HIR::Function &fn);
+ /**
+ * Macros are a bit particular - they only live at the AST level, so we can
+ * directly refer to them using their NodeId. There's no need to keep an HIR
+ * node for them.
+ */
+ void emit_macro (NodeId macro);
+
const std::string &get_interface_buffer () const;
private:
return true;
}
+void
+Mappings::insert_exported_macro (AST::MacroRulesDefinition &def)
+{
+ exportedMacros.emplace_back (def.get_node_id ());
+}
+
+std::vector<NodeId> &
+Mappings::get_exported_macros ()
+{
+ return exportedMacros;
+}
+
void
Mappings::insert_visibility (NodeId id, Privacy::ModuleVisibility visibility)
{
bool lookup_macro_invocation (AST::MacroInvocation &invoc,
AST::MacroRulesDefinition **def);
+ void insert_exported_macro (AST::MacroRulesDefinition &def);
+ std::vector<NodeId> &get_exported_macros ();
+
void insert_visibility (NodeId id, Privacy::ModuleVisibility visibility);
bool lookup_visibility (NodeId id, Privacy::ModuleVisibility &def);
// macros
std::map<NodeId, AST::MacroRulesDefinition *> macroMappings;
std::map<NodeId, AST::MacroRulesDefinition *> macroInvocations;
+ std::vector<NodeId> exportedMacros;
// crate names
std::map<CrateNum, std::string> crate_names;