summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2016-05-14 15:28:38 +0800
committerJohn Hodge <tpg@mutabah.net>2016-05-14 15:28:38 +0800
commite9bc74be1a7a51ed4689952f27f2b91e2bc5c7eb (patch)
tree9fd986fea39e3d60edf17431cda0ca547f311c8a /src
parentd70587b729f9f982e284681d5d16794cf7209e28 (diff)
downloadmrust-e9bc74be1a7a51ed4689952f27f2b91e2bc5c7eb.tar.gz
Macros - Twiddling adding a struct
Diffstat (limited to 'src')
-rw-r--r--src/hir/from_ast.cpp5
-rw-r--r--src/macros.cpp8
-rw-r--r--src/macros.hpp23
-rw-r--r--src/parse/macro_rules.cpp2
4 files changed, 31 insertions, 7 deletions
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 <common.hpp>
#include <map>
#include <memory>
#include <cstring>
@@ -111,11 +112,23 @@ public:
};
/// A sigle 'macro_rules!' block
-//struct MacroRules {
-// bool export;
-// ::std::vector<MacroRule> m_rules;
-//};
-typedef ::std::vector<MacroRule> MacroRules;
+class MacroRules:
+ public Serialisable
+{
+public:
+ bool m_exported;
+ ::std::vector<MacroRule> m_rules;
+
+ MacroRules()
+ {
+ }
+ MacroRules( ::std::vector<MacroRule> rules ):
+ m_rules( mv$(rules) )
+ {
+ }
+
+ SERIALISABLE_PROTOTYPES();
+};
extern ::std::unique_ptr<TokenStream> Macro_InvokeRules(const char *name, const MacroRules& rules, TokenTree input);
extern ::std::unique_ptr<TokenStream> 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) );
}