diff options
author | John Hodge <tpg@mutabah.net> | 2016-05-19 11:38:09 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2016-05-19 11:38:09 +0800 |
commit | 692cef0353fc891756d4137e8007e0f822c684a5 (patch) | |
tree | 64a2480a5628d7a8250310f758df0323b6c80097 /src/hir/from_ast_expr.cpp | |
parent | 7c758c3dc8dca5dea92b86e452b0616aadbf1de9 (diff) | |
download | mrust-692cef0353fc891756d4137e8007e0f822c684a5.tar.gz |
HIR Lower - Desugared `if let`, notes for `for`
Diffstat (limited to 'src/hir/from_ast_expr.cpp')
-rw-r--r-- | src/hir/from_ast_expr.cpp | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/src/hir/from_ast_expr.cpp b/src/hir/from_ast_expr.cpp index ff37ecc1..b0f6f420 100644 --- a/src/hir/from_ast_expr.cpp +++ b/src/hir/from_ast_expr.cpp @@ -238,6 +238,17 @@ struct LowerHIR_ExprNode_Visitor: ) ); break; } case ::AST::ExprNode_Loop::FOR: { + // TODO: Desugar into: + // { + // let mut it = <_ as IntoIterator>::into_iter(`m_cond`); + // `m_label`: loop { + // match it.next() { + // Some(`m_pattern`) => `m_code`, + // None => break `m_label`, + // } + // } + // } + TODO(v.get_pos(), "Desugar for loop"); break; } } } @@ -271,6 +282,24 @@ struct LowerHIR_ExprNode_Visitor: )); } virtual void visit(::AST::ExprNode_IfLet& v) override { + ::std::vector< ::HIR::ExprNode_Match::Arm> arms; + + // - Matches pattern - Take true branch + arms.push_back(::HIR::ExprNode_Match::Arm { + ::make_vec1( LowerHIR_Pattern(v.m_pattern) ), + ::HIR::ExprNodeP(), + LowerHIR_ExprNode_Inner(*v.m_true) + }); + // - Matches anything else - take false branch + arms.push_back(::HIR::ExprNode_Match::Arm { + ::make_vec1( ::HIR::Pattern() ), + ::HIR::ExprNodeP(), + v.m_false ? LowerHIR_ExprNode_Inner(*v.m_false) : ::HIR::ExprNodeP( new ::HIR::ExprNode_Tuple({}) ) + }); + m_rv.reset( new ::HIR::ExprNode_Match( + LowerHIR_ExprNode_Inner(*v.m_value), + mv$(arms) + )); } virtual void visit(::AST::ExprNode_Integer& v) override { |