summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2016-09-25 13:00:57 +0800
committerJohn Hodge <tpg@mutabah.net>2016-09-25 13:00:57 +0800
commit5722f6aa867e5d979e524abd9c685094b6d8e203 (patch)
tree12abc579d0966a74cc85bbd582d4a43e578fa7f0 /src
parentbe64c63a949929dc3d78d4fbeb125f290b1ba06b (diff)
downloadmrust-5722f6aa867e5d979e524abd9c685094b6d8e203.tar.gz
Parse+Expand - Support `let` in expression macros
Diffstat (limited to 'src')
-rw-r--r--src/expand/mod.cpp4
-rw-r--r--src/parse/common.hpp1
-rw-r--r--src/parse/expr.cpp8
3 files changed, 10 insertions, 3 deletions
diff --git a/src/expand/mod.cpp b/src/expand/mod.cpp
index 8060d104..962e49de 100644
--- a/src/expand/mod.cpp
+++ b/src/expand/mod.cpp
@@ -309,7 +309,9 @@ struct CExpandExpr:
{
SET_MODULE( (*ttl), mod );
// Reparse as expression / item
- auto newexpr = Parse_Expr0(*ttl);
+ bool add_silence_if_end = false;
+ auto newexpr = Parse_ExprBlockLine(*ttl, &add_silence_if_end);
+ // TODO: use add_silence_if_end - Applies if this node is the last node in the block.
// Then call visit on it again
DEBUG("--- Visiting new node");
this->visit(newexpr);
diff --git a/src/parse/common.hpp b/src/parse/common.hpp
index 49a0bdf8..12d56eb3 100644
--- a/src/parse/common.hpp
+++ b/src/parse/common.hpp
@@ -54,6 +54,7 @@ extern AST::Expr Parse_ExprBlock(TokenStream& lex);
extern AST::ExprNodeP Parse_Expr0(TokenStream& lex);
extern AST::ExprNodeP Parse_ExprVal(TokenStream& lex);
extern AST::ExprNodeP Parse_ExprBlockNode(TokenStream& lex, bool is_unsafe=false);
+extern AST::ExprNodeP Parse_ExprBlockLine(TokenStream& lex, bool *add_silence);
extern AST::ExprNodeP Parse_Stmt(TokenStream& lex);
diff --git a/src/parse/expr.cpp b/src/parse/expr.cpp
index 56b28546..ffc2fa19 100644
--- a/src/parse/expr.cpp
+++ b/src/parse/expr.cpp
@@ -23,7 +23,7 @@ static inline ExprNodeP mk_exprnodep(const TokenStream& lex, AST::ExprNode* en){
#define NEWNODE(type, ...) mk_exprnodep(lex, new type(__VA_ARGS__))
//ExprNodeP Parse_ExprBlockNode(TokenStream& lex, bool is_unsafe=false); // common.hpp
-ExprNodeP Parse_ExprBlockLine(TokenStream& lex, bool *add_silence);
+//ExprNodeP Parse_ExprBlockLine(TokenStream& lex, bool *add_silence);
ExprNodeP Parse_ExprBlockLine_Stmt(TokenStream& lex, bool *add_silence);
//ExprNodeP Parse_Stmt(TokenStream& lex); // common.hpp
ExprNodeP Parse_Expr0(TokenStream& lex);
@@ -256,7 +256,11 @@ ExprNodeP Parse_ExprBlockLine_Stmt(TokenStream& lex, bool *add_silence)
// If this expression statement wasn't followed by a semicolon, then it's yielding its value out of the block.
// - I.e. The block should be ending
if( GET_TOK(tok, lex) != TOK_SEMICOLON ) {
- CHECK_TOK(tok, TOK_BRACE_CLOSE);
+ // - Allow TOK_EOF for macro expansion.
+ if( tok.type() == TOK_EOF )
+ ;
+ else
+ CHECK_TOK(tok, TOK_BRACE_CLOSE);
PUTBACK(tok, lex);
}
else {