diff options
author | John Hodge <tpg@mutabah.net> | 2016-10-23 13:19:20 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2016-10-23 13:19:20 +0800 |
commit | 4fd6d5b1d88c22803071895987f416d47e1321da (patch) | |
tree | d345914e6038d66426b0f832e19f281779561bb0 /src | |
parent | 52f44f072087c4974f35112558219dc5bfdf79e5 (diff) | |
download | mrust-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.cpp | 2 | ||||
-rw-r--r-- | src/hir/dump.cpp | 6 | ||||
-rw-r--r-- | src/parse/expr.cpp | 12 |
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;
}
|