summaryrefslogtreecommitdiff
path: root/src/expand
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2016-05-22 22:39:26 +0800
committerJohn Hodge <tpg@mutabah.net>2016-05-22 22:39:26 +0800
commit1f9a4180a3b54f85f37919ba4ca709f8e8250bb6 (patch)
treec00cef798d26bf5f68f1657b01a490533365f015 /src/expand
parenteba9d8f840a5b81f0188d109e63631c9a34c28e9 (diff)
downloadmrust-1f9a4180a3b54f85f37919ba4ca709f8e8250bb6.tar.gz
macro_rules - Rework pattern matching to not use try-catch
Diffstat (limited to 'src/expand')
-rw-r--r--src/expand/macro_rules.cpp8
-rw-r--r--src/expand/macro_rules.hpp2
-rw-r--r--src/expand/mod.cpp2
3 files changed, 7 insertions, 5 deletions
diff --git a/src/expand/macro_rules.cpp b/src/expand/macro_rules.cpp
index 968bf5f9..1689746c 100644
--- a/src/expand/macro_rules.cpp
+++ b/src/expand/macro_rules.cpp
@@ -4,6 +4,7 @@
#include "../ast/ast.hpp"
#include "../parse/common.hpp"
#include "macro_rules.hpp"
+#include <macro_rules/macro_rules.hpp>
class CMacroRulesExpander:
public ExpandProcMacro
@@ -15,9 +16,10 @@ class CMacroRulesExpander:
if( ident == "" )
ERROR(sp, E0000, "macro_rules! requires an identifier" );
+ DEBUG("Parsing macro_rules! " << ident);
TTStream lex(tt);
auto mac = Parse_MacroRules(lex);
- mod.add_macro( false, ident, mac );
+ mod.add_macro( false, ident, mv$(mac) );
return ::std::unique_ptr<TokenStream>( new TTStreamO(TokenTree()) );
}
@@ -45,7 +47,7 @@ class CMacroUseHandler:
{
if( mr.name == name ) {
DEBUG("Imported " << mr.name);
- mod.add_macro_import( mr.name, mr.data );
+ mod.add_macro_import( mr.name, *mr.data );
goto _good;
}
}
@@ -67,7 +69,7 @@ class CMacroUseHandler:
for( const auto& mr : submod.macros() )
{
DEBUG("Imported " << mr.name);
- mod.add_macro_import( mr.name, mr.data );
+ mod.add_macro_import( mr.name, *mr.data );
}
for( const auto& mri : submod.macro_imports_res() )
{
diff --git a/src/expand/macro_rules.hpp b/src/expand/macro_rules.hpp
index b4e6e1e0..fc4a2851 100644
--- a/src/expand/macro_rules.hpp
+++ b/src/expand/macro_rules.hpp
@@ -4,7 +4,6 @@
#pragma once
#include <synext.hpp>
-#include "../macros.hpp"
namespace AST {
class Expr;
@@ -12,5 +11,6 @@ namespace AST {
}
class TokenTree;
class TokenStream;
+class MacroRules;
extern ::std::unique_ptr<TokenStream> Macro_Invoke(const char* name, const MacroRules& rules, const TokenTree& tt, AST::Module& mod);
diff --git a/src/expand/mod.cpp b/src/expand/mod.cpp
index 3f0911fe..0cb2c9c7 100644
--- a/src/expand/mod.cpp
+++ b/src/expand/mod.cpp
@@ -105,7 +105,7 @@ void Expand_Attrs(const ::AST::MetaItems& attrs, AttrStage stage, ::AST::Crate&
if( input_ident != "" )
ERROR(mi_span, E0000, "macro_rules! macros can't take an ident");
- auto e = Macro_Invoke(name.c_str(), mr.data, input_tt, mod);
+ auto e = Macro_Invoke(name.c_str(), *mr.data, input_tt, mod);
return e;
}
}