From 7c758c3dc8dca5dea92b86e452b0616aadbf1de9 Mon Sep 17 00:00:00 2001 From: John Hodge Date: Thu, 19 May 2016 11:13:31 +0800 Subject: HIR Lower - Add desugared while/while let --- src/hir/from_ast_expr.cpp | 56 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) (limited to 'src/hir/from_ast_expr.cpp') diff --git a/src/hir/from_ast_expr.cpp b/src/hir/from_ast_expr.cpp index 9ad8f565..ff37ecc1 100644 --- a/src/hir/from_ast_expr.cpp +++ b/src/hir/from_ast_expr.cpp @@ -29,6 +29,12 @@ struct LowerHIR_ExprNode_Visitor: rv->m_nodes.push_back( LowerHIR_ExprNode_Inner( *n ) ); } } + + if( v.m_local_mod ) + { + // TODO: Populate m_traits from the local module's import list + } + m_rv.reset( static_cast< ::HIR::ExprNode*>(rv) ); } virtual void visit(::AST::ExprNode_Macro& v) override { @@ -184,6 +190,56 @@ struct LowerHIR_ExprNode_Visitor: virtual void visit(::AST::ExprNode_CallObject& v) override { } virtual void visit(::AST::ExprNode_Loop& v) override { + switch( v.m_type ) + { + case ::AST::ExprNode_Loop::LOOP: + m_rv.reset( new ::HIR::ExprNode_Loop( + v.m_label, + LowerHIR_ExprNode_Inner(*v.m_code) + ) ); + break; + case ::AST::ExprNode_Loop::WHILE: { + ::std::vector< ::HIR::ExprNodeP> code; + // - if `m_cond` { () } else { break `m_label` } + code.push_back( ::HIR::ExprNodeP(new ::HIR::ExprNode_If( + LowerHIR_ExprNode_Inner(*v.m_cond), + ::HIR::ExprNodeP( new ::HIR::ExprNode_Tuple({}) ), + ::HIR::ExprNodeP( new ::HIR::ExprNode_LoopControl(v.m_label, false) ) + )) ); + code.push_back( LowerHIR_ExprNode_Inner(*v.m_code) ); + + m_rv.reset( new ::HIR::ExprNode_Loop( + v.m_label, + ::HIR::ExprNodeP(new ::HIR::ExprNode_Block(false, mv$(code))) + ) ); + break; } + case ::AST::ExprNode_Loop::WHILELET: { + ::std::vector< ::HIR::ExprNode_Match::Arm> arms; + + // - Matches pattern - Run inner code + arms.push_back(::HIR::ExprNode_Match::Arm { + ::make_vec1( LowerHIR_Pattern(v.m_pattern) ), + ::HIR::ExprNodeP(), + LowerHIR_ExprNode_Inner(*v.m_code) + }); + // - Matches anything else - break + arms.push_back(::HIR::ExprNode_Match::Arm { + ::make_vec1( ::HIR::Pattern() ), + ::HIR::ExprNodeP(), + ::HIR::ExprNodeP( new ::HIR::ExprNode_LoopControl(v.m_label, false) ) + }); + + m_rv.reset( new ::HIR::ExprNode_Loop( + v.m_label, + ::HIR::ExprNodeP(new ::HIR::ExprNode_Match( + LowerHIR_ExprNode_Inner(*v.m_cond), + mv$(arms) + )) + ) ); + break; } + case ::AST::ExprNode_Loop::FOR: { + break; } + } } virtual void visit(::AST::ExprNode_Match& v) override { ::std::vector< ::HIR::ExprNode_Match::Arm> arms; -- cgit v1.2.3