summaryrefslogtreecommitdiff
path: root/src/hir/from_ast_expr.cpp
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2016-05-19 11:38:09 +0800
committerJohn Hodge <tpg@mutabah.net>2016-05-19 11:38:09 +0800
commit692cef0353fc891756d4137e8007e0f822c684a5 (patch)
tree64a2480a5628d7a8250310f758df0323b6c80097 /src/hir/from_ast_expr.cpp
parent7c758c3dc8dca5dea92b86e452b0616aadbf1de9 (diff)
downloadmrust-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.cpp29
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 {