summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2016-10-23 13:19:20 +0800
committerJohn Hodge <tpg@mutabah.net>2016-10-23 13:19:20 +0800
commit4fd6d5b1d88c22803071895987f416d47e1321da (patch)
treed345914e6038d66426b0f832e19f281779561bb0 /src
parent52f44f072087c4974f35112558219dc5bfdf79e5 (diff)
downloadmrust-4fd6d5b1d88c22803071895987f416d47e1321da.tar.gz
Misc - Fix AST+HIR printing to honor the yields_final flag in block
Diffstat (limited to 'src')
-rw-r--r--src/dump_as_rust.cpp2
-rw-r--r--src/hir/dump.cpp6
-rw-r--r--src/parse/expr.cpp12
3 files changed, 14 insertions, 6 deletions
diff --git a/src/dump_as_rust.cpp b/src/dump_as_rust.cpp
index d93a3ff1..401cc63e 100644
--- a/src/dump_as_rust.cpp
+++ b/src/dump_as_rust.cpp
@@ -63,6 +63,8 @@ public:
else
AST::NodeVisitor::visit(child);
}
+ if( !n.m_yields_final_value )
+ m_os << ";";
m_os << "\n";
dec_indent();
m_os << indent() << "}";
diff --git a/src/hir/dump.cpp b/src/hir/dump.cpp
index 90b0d1c9..8139bcd5 100644
--- a/src/hir/dump.cpp
+++ b/src/hir/dump.cpp
@@ -306,6 +306,9 @@ namespace {
if( &sn != &node.m_nodes.back() ) {
m_os << ";\n";
}
+ else if( !node.m_yields_final ) {
+ m_os << ";\n";
+ }
else {
m_os << "\n";
}
@@ -391,6 +394,9 @@ namespace {
if( NODE_IS(node.m_false, _Block) ) {
this->visit_node_ptr(node.m_false);
}
+ else if( NODE_IS(node.m_false, _If) ) {
+ this->visit_node_ptr(node.m_false);
+ }
else {
m_os << "{ ";
this->visit_node_ptr(node.m_false);
diff --git a/src/parse/expr.cpp b/src/parse/expr.cpp
index 5463f50f..5590b738 100644
--- a/src/parse/expr.cpp
+++ b/src/parse/expr.cpp
@@ -26,7 +26,7 @@ static inline ExprNodeP mk_exprnodep(const TokenStream& lex, AST::ExprNode* en){
//ExprNodeP Parse_ExprBlockNode(TokenStream& lex, bool is_unsafe=false); // common.hpp
//ExprNodeP Parse_ExprBlockLine_WithItems(TokenStream& lex, ::std::shared_ptr<AST::Module>& local_mod, bool& add_silence_if_end);
//ExprNodeP Parse_ExprBlockLine(TokenStream& lex, bool *add_silence);
-ExprNodeP Parse_ExprBlockLine_Stmt(TokenStream& lex, bool *add_silence);
+ExprNodeP Parse_ExprBlockLine_Stmt(TokenStream& lex, bool& has_semicolon);
//ExprNodeP Parse_Stmt(TokenStream& lex); // common.hpp
ExprNodeP Parse_Stmt_Let(TokenStream& lex);
ExprNodeP Parse_Expr0(TokenStream& lex);
@@ -81,7 +81,7 @@ ExprNodeP Parse_ExprBlockNode(TokenStream& lex, bool is_unsafe/*=false*/)
// Set to TRUE if there was no semicolon after a statement
if( LOOK_AHEAD(lex) == TOK_BRACE_CLOSE && add_silence_if_end )
{
- DEBUG("expect_end == false, end of block");
+ DEBUG("End of block, and add_silence_if_end == true - doesn't yeild");
yields_final_value = false;
// Since the next token is TOK_BRACE_CLOSE, the loop will terminate
}
@@ -235,7 +235,7 @@ ExprNodeP Parse_ExprBlockLine(TokenStream& lex, bool *add_silence)
if( lex.lookahead(0) == TOK_DOT || lex.lookahead(0) == TOK_QMARK ) {
lex.putback( Token(Token::TagTakeIP(), InterpolatedFragment(InterpolatedFragment::EXPR, ret.release())) );
- return Parse_ExprBlockLine_Stmt(lex, add_silence);
+ return Parse_ExprBlockLine_Stmt(lex, *add_silence);
}
return ret;
@@ -263,12 +263,12 @@ ExprNodeP Parse_ExprBlockLine(TokenStream& lex, bool *add_silence)
// Fall through to the statement code
default:
PUTBACK(tok, lex);
- return Parse_ExprBlockLine_Stmt(lex, add_silence);
+ return Parse_ExprBlockLine_Stmt(lex, *add_silence);
}
}
}
-ExprNodeP Parse_ExprBlockLine_Stmt(TokenStream& lex, bool *add_silence)
+ExprNodeP Parse_ExprBlockLine_Stmt(TokenStream& lex, bool& has_semicolon)
{
Token tok;
auto ret = Parse_Stmt(lex);
@@ -283,7 +283,7 @@ ExprNodeP Parse_ExprBlockLine_Stmt(TokenStream& lex, bool *add_silence)
PUTBACK(tok, lex);
}
else {
- *add_silence = true;
+ has_semicolon = true;
}
return ret;
}