summaryrefslogtreecommitdiff
path: root/src/hir/from_ast_expr.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/hir/from_ast_expr.cpp')
-rw-r--r--src/hir/from_ast_expr.cpp28
1 files changed, 28 insertions, 0 deletions
diff --git a/src/hir/from_ast_expr.cpp b/src/hir/from_ast_expr.cpp
index 4a801361..e90d0b99 100644
--- a/src/hir/from_ast_expr.cpp
+++ b/src/hir/from_ast_expr.cpp
@@ -186,6 +186,26 @@ struct LowerHIR_ExprNode_Visitor:
virtual void visit(::AST::ExprNode_Loop& v) override {
}
virtual void visit(::AST::ExprNode_Match& v) override {
+ ::std::vector< ::HIR::ExprNode_Match::Arm> arms;
+
+ for(const auto& arm : v.m_arms)
+ {
+ ::HIR::ExprNode_Match::Arm new_arm {
+ {},
+ LowerHIR_ExprNode_Inner_Opt(arm.m_cond.get()),
+ LowerHIR_ExprNode_Inner(*arm.m_code)
+ };
+
+ for(const auto& pat : arm.m_patterns)
+ new_arm.m_patterns.push_back( LowerHIR_Pattern(pat) );
+
+ arms.push_back( mv$(new_arm) );
+ }
+
+ m_rv.reset( new ::HIR::ExprNode_Match(
+ LowerHIR_ExprNode_Inner(*v.m_val),
+ mv$(arms)
+ ));
}
virtual void visit(::AST::ExprNode_If& v) override {
}
@@ -245,6 +265,14 @@ struct LowerHIR_ExprNode_Visitor:
virtual void visit(::AST::ExprNode_Closure& v) override {
}
virtual void visit(::AST::ExprNode_StructLiteral& v) override {
+ ::HIR::ExprNode_StructLiteral::t_values values;
+ for(const auto& val : v.m_values)
+ values.push_back( ::std::make_pair(val.first, LowerHIR_ExprNode_Inner(*val.second)) );
+ m_rv.reset( new ::HIR::ExprNode_StructLiteral(
+ LowerHIR_GenericPath(v.m_path),
+ LowerHIR_ExprNode_Inner_Opt(v.m_base_value.get()),
+ mv$(values)
+ ) );
}
virtual void visit(::AST::ExprNode_Array& v) override {
}