summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2016-05-20 09:52:57 +0800
committerJohn Hodge <tpg@mutabah.net>2016-05-20 09:52:57 +0800
commite0d932dbc21555ef47e33b0d13aeb3dde8e42c7e (patch)
tree1ea75a429d676026efc54b3920f5159563debf6f /src
parent692cef0353fc891756d4137e8007e0f822c684a5 (diff)
downloadmrust-e0d932dbc21555ef47e33b0d13aeb3dde8e42c7e.tar.gz
Expand - For loop desugar
Diffstat (limited to 'src')
-rw-r--r--src/ast/expr.hpp9
-rw-r--r--src/expand/mod.cpp46
-rw-r--r--src/hir/from_ast_expr.cpp15
-rw-r--r--src/resolve/absolute.cpp3
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);
)
)