summaryrefslogtreecommitdiff
path: root/src/expand/mod.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/expand/mod.cpp')
-rw-r--r--src/expand/mod.cpp26
1 files changed, 24 insertions, 2 deletions
diff --git a/src/expand/mod.cpp b/src/expand/mod.cpp
index 788b2109..81a3c5b6 100644
--- a/src/expand/mod.cpp
+++ b/src/expand/mod.cpp
@@ -15,6 +15,8 @@
#include <ast/expr.hpp>
#include "cfg.hpp"
+DecoratorDef* g_decorators_list = nullptr;
+MacroDef* g_macros_list = nullptr;
::std::map< ::std::string, ::std::unique_ptr<ExpandDecorator> > g_decorators;
::std::map< ::std::string, ::std::unique_ptr<ExpandProcMacro> > g_macros;
@@ -24,10 +26,18 @@ void Expand_Expr(::AST::Crate& crate, LList<const AST::Module*> modstack, AST::E
void Expand_Expr(::AST::Crate& crate, LList<const AST::Module*> modstack, ::std::shared_ptr<AST::ExprNode>& node);
void Register_Synext_Decorator(::std::string name, ::std::unique_ptr<ExpandDecorator> handler) {
- g_decorators[name] = mv$(handler);
+ g_decorators.insert(::std::make_pair( mv$(name), mv$(handler) ));
}
void Register_Synext_Macro(::std::string name, ::std::unique_ptr<ExpandProcMacro> handler) {
- g_macros[name] = mv$(handler);
+ g_macros.insert(::std::make_pair( mv$(name), mv$(handler) ));
+}
+void Register_Synext_Decorator_Static(DecoratorDef* def) {
+ def->prev = g_decorators_list;
+ g_decorators_list = def;
+}
+void Register_Synext_Macro_Static(MacroDef* def) {
+ def->prev = g_macros_list;
+ g_macros_list = def;
}
@@ -1062,6 +1072,18 @@ void Expand_Mod_IndexAnon(::AST::Crate& crate, ::AST::Module& mod)
}
void Expand(::AST::Crate& crate)
{
+ // Fill macro/decorator map from init list
+ while(g_decorators_list)
+ {
+ g_decorators.insert(::std::make_pair( mv$(g_decorators_list->name), mv$(g_decorators_list->def) ));
+ g_decorators_list = g_decorators_list->prev;
+ }
+ while (g_macros_list)
+ {
+ g_macros.insert(::std::make_pair(mv$(g_macros_list->name), mv$(g_macros_list->def)));
+ g_macros_list = g_macros_list->prev;
+ }
+
auto modstack = LList<const ::AST::Module*>(nullptr, &crate.m_root_module);
// 1. Crate attributes