From e9bc74be1a7a51ed4689952f27f2b91e2bc5c7eb Mon Sep 17 00:00:00 2001 From: John Hodge Date: Sat, 14 May 2016 15:28:38 +0800 Subject: Macros - Twiddling adding a struct --- src/hir/from_ast.cpp | 5 +++++ src/macros.cpp | 8 +++++++- src/macros.hpp | 23 ++++++++++++++++++----- src/parse/macro_rules.cpp | 2 +- 4 files changed, 31 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/hir/from_ast.cpp b/src/hir/from_ast.cpp index edb5cf7e..9f07b08e 100644 --- a/src/hir/from_ast.cpp +++ b/src/hir/from_ast.cpp @@ -20,6 +20,11 @@ macros.insert( ::std::make_pair( mac.name, mac.data ) ); //} } + for( const auto& mac : crate.m_root_module.macro_imports_res() ) { + //if( mac.data->export ) { + macros.insert( ::std::make_pair( mac.name, *mac.data ) ); + //} + } auto rootmod = LowerHIR_Module( crate.m_root_module, ::HIR::SimplePath("") ); return ::HIR::CratePtr( ::HIR::Crate { mv$(rootmod), mv$(macros) } ); } diff --git a/src/macros.cpp b/src/macros.cpp index 0624d8b2..89fcbe86 100644 --- a/src/macros.cpp +++ b/src/macros.cpp @@ -349,7 +349,7 @@ bool Macro_HandlePattern(TTStream& lex, const MacroPatEnt& pat, unsigned int lay // 3. Bind names // 4. Return expander int i = 0; - for(const auto& rule : rules) + for(const auto& rule : rules.m_rules) { Token tok; // Create token stream for input tree @@ -872,3 +872,9 @@ SERIALISE_TYPE_S(MacroRuleEnt, { os << "=" << x.tok; return os; } + +SERIALISE_TYPE_S(MacroRules, { + s.item( m_exported ); + s.item( m_rules ); +}); + diff --git a/src/macros.hpp b/src/macros.hpp index 5646e203..606d3278 100644 --- a/src/macros.hpp +++ b/src/macros.hpp @@ -3,6 +3,7 @@ #include "parse/lex.hpp" #include "parse/tokentree.hpp" +#include #include #include #include @@ -111,11 +112,23 @@ public: }; /// A sigle 'macro_rules!' block -//struct MacroRules { -// bool export; -// ::std::vector m_rules; -//}; -typedef ::std::vector MacroRules; +class MacroRules: + public Serialisable +{ +public: + bool m_exported; + ::std::vector m_rules; + + MacroRules() + { + } + MacroRules( ::std::vector rules ): + m_rules( mv$(rules) ) + { + } + + SERIALISABLE_PROTOTYPES(); +}; extern ::std::unique_ptr Macro_InvokeRules(const char *name, const MacroRules& rules, TokenTree input); extern ::std::unique_ptr Macro_Invoke(const TokenStream& lex, const ::std::string& name, TokenTree input); diff --git a/src/parse/macro_rules.cpp b/src/parse/macro_rules.cpp index b4698fa7..11a4ab4e 100644 --- a/src/parse/macro_rules.cpp +++ b/src/parse/macro_rules.cpp @@ -241,5 +241,5 @@ MacroRules Parse_MacroRules(TokenStream& lex) } } - return MacroRules(mv$(rules)); + return MacroRules( mv$(rules) ); } -- cgit v1.2.3