diff options
author | John Hodge <tpg@mutabah.net> | 2016-05-20 09:52:57 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2016-05-20 09:52:57 +0800 |
commit | e0d932dbc21555ef47e33b0d13aeb3dde8e42c7e (patch) | |
tree | 1ea75a429d676026efc54b3920f5159563debf6f /src | |
parent | 692cef0353fc891756d4137e8007e0f822c684a5 (diff) | |
download | mrust-e0d932dbc21555ef47e33b0d13aeb3dde8e42c7e.tar.gz |
Expand - For loop desugar
Diffstat (limited to 'src')
-rw-r--r-- | src/ast/expr.hpp | 9 | ||||
-rw-r--r-- | src/expand/mod.cpp | 46 | ||||
-rw-r--r-- | src/hir/from_ast_expr.cpp | 15 | ||||
-rw-r--r-- | src/resolve/absolute.cpp | 3 |
4 files changed, 60 insertions, 13 deletions
diff --git a/src/ast/expr.hpp b/src/ast/expr.hpp index 00694962..ca634e91 100644 --- a/src/ast/expr.hpp +++ b/src/ast/expr.hpp @@ -245,6 +245,15 @@ struct ExprNode_Match_Arm: unique_ptr<ExprNode> m_code; + + ExprNode_Match_Arm() + {} + ExprNode_Match_Arm(::std::vector<Pattern> patterns, unique_ptr<ExprNode> cond, unique_ptr<ExprNode> code): + m_patterns( mv$(patterns) ), + m_cond( mv$(cond) ), + m_code( mv$(code) ) + {} + SERIALISABLE_PROTOTYPES(); }; diff --git a/src/expand/mod.cpp b/src/expand/mod.cpp index 2f4fe0be..3d4f431e 100644 --- a/src/expand/mod.cpp +++ b/src/expand/mod.cpp @@ -343,6 +343,52 @@ struct CExpandExpr: void visit(::AST::ExprNode_Loop& node) override { this->visit_nodelete(node, node.m_cond); this->visit_nodelete(node, node.m_code); + Expand_Pattern(is_early, crate, modstack, this->cur_mod(), node.m_pattern); + if(node.m_type == ::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`, + // } + // } + // } + ::std::vector< ::AST::ExprNode_Match_Arm> arms; + arms.push_back( ::AST::ExprNode_Match_Arm( + ::make_vec1( ::AST::Pattern(::AST::Pattern::TagEnumVariant(), ::AST::Path(::AST::Path::TagRelative(), {::AST::PathNode("Some")}), ::make_vec1( mv$(node.m_pattern) ) ) ), + nullptr, + mv$(node.m_code) + ) ); + arms.push_back( ::AST::ExprNode_Match_Arm( + ::make_vec1( ::AST::Pattern(::AST::Pattern::TagValue(), ::AST::Pattern::Value::make_Named(::AST::Path(::AST::Path::TagRelative(), {::AST::PathNode("None")})) ) ), + nullptr, + ::AST::ExprNodeP(new ::AST::ExprNode_Flow(::AST::ExprNode_Flow::BREAK, node.m_label, nullptr)) + ) ); + ::std::vector< ::AST::ExprNodeP> block_nodes; + block_nodes.push_back( ::AST::ExprNodeP(new ::AST::ExprNode_LetBinding( + ::AST::Pattern(::AST::Pattern::TagBind(), "it"), + TypeRef(), + ::AST::ExprNodeP(new ::AST::ExprNode_CallPath( + ::AST::Path(::AST::Path::TagUfcs(), ::TypeRef(), ::AST::Path(::AST::Path::TagRelative(), {::AST::PathNode("IntoIterator")}), { ::AST::PathNode("into_iter") } ), + ::make_vec1( mv$(node.m_cond) ) + )) + )) ); + block_nodes.push_back( ::AST::ExprNodeP(new ::AST::ExprNode_Loop( + node.m_label, + ::AST::ExprNodeP(new ::AST::ExprNode_Match( + ::AST::ExprNodeP(new ::AST::ExprNode_CallMethod( + ::AST::ExprNodeP(new ::AST::ExprNode_NamedValue( ::AST::Path("it") )), + ::AST::PathNode("next"), + {} + )), + mv$(arms) + )) + )) ); + replacement.reset(new ::AST::ExprNode_Block( mv$(block_nodes), nullptr )); + } } void visit(::AST::ExprNode_Match& node) override { this->visit_nodelete(node, node.m_val); diff --git a/src/hir/from_ast_expr.cpp b/src/hir/from_ast_expr.cpp index b0f6f420..e5088d71 100644 --- a/src/hir/from_ast_expr.cpp +++ b/src/hir/from_ast_expr.cpp @@ -237,19 +237,10 @@ 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`, - // } - // } - // } + case ::AST::ExprNode_Loop::FOR: + // NOTE: This should already be desugared (as a pass before resolve) TODO(v.get_pos(), "Desugar for loop"); - break; } + break; } } virtual void visit(::AST::ExprNode_Match& v) override { diff --git a/src/resolve/absolute.cpp b/src/resolve/absolute.cpp index 2985419a..da27261f 100644 --- a/src/resolve/absolute.cpp +++ b/src/resolve/absolute.cpp @@ -595,6 +595,7 @@ void Resolve_Absolute_Expr(Context& context, ::AST::ExprNode& node) if(arm.m_cond) arm.m_cond->visit( *this ); + assert( arm.m_code ); arm.m_code->visit( *this ); this->context.pop_block(); @@ -710,7 +711,7 @@ void Resolve_Absolute_PatternValue(/*const*/ Context& context, ::AST::Pattern::V (Integer, ), (String, ), (Named, - assert( ! e.is_trivial() ); + //assert( ! e.is_trivial() ); Resolve_Absolute_Path(context, Span(), Context::LookupMode::Constant, e); ) ) |