diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/hir/expr.cpp | 9 | ||||
-rw-r--r-- | src/hir/expr.hpp | 111 | ||||
-rw-r--r-- | src/hir/from_ast_expr.cpp | 35 |
3 files changed, 154 insertions, 1 deletions
diff --git a/src/hir/expr.cpp b/src/hir/expr.cpp index 9029833b..c80d5f61 100644 --- a/src/hir/expr.cpp +++ b/src/hir/expr.cpp @@ -14,20 +14,27 @@ DEF_VISIT(ExprNode_Let) DEF_VISIT(ExprNode_Loop) DEF_VISIT(ExprNode_LoopControl) DEF_VISIT(ExprNode_Match) +DEF_VISIT(ExprNode_If) DEF_VISIT(ExprNode_Assign) DEF_VISIT(ExprNode_BinOp) DEF_VISIT(ExprNode_UniOp) DEF_VISIT(ExprNode_Cast) - +DEF_VISIT(ExprNode_Index) +DEF_VISIT(ExprNode_Deref) DEF_VISIT(ExprNode_CallPath) +DEF_VISIT(ExprNode_CallValue) DEF_VISIT(ExprNode_CallMethod) +DEF_VISIT(ExprNode_Field) DEF_VISIT(ExprNode_Literal) DEF_VISIT(ExprNode_PathValue); DEF_VISIT(ExprNode_Variable); DEF_VISIT(ExprNode_StructLiteral); +DEF_VISIT(ExprNode_Tuple) +DEF_VISIT(ExprNode_ArrayList) +DEF_VISIT(ExprNode_ArraySized) #undef DEF_VISIT diff --git a/src/hir/expr.hpp b/src/hir/expr.hpp index eb321bec..83971572 100644 --- a/src/hir/expr.hpp +++ b/src/hir/expr.hpp @@ -100,6 +100,22 @@ struct ExprNode_Match: NODE_METHODS(); }; +struct ExprNode_If: + public ExprNode +{ + ::HIR::ExprNodeP m_cond; + ::HIR::ExprNodeP m_true; + ::HIR::ExprNodeP m_false; + + ExprNode_If(::HIR::ExprNodeP cond, ::HIR::ExprNodeP true_code, ::HIR::ExprNodeP false_code): + m_cond( mv$(cond) ), + m_true( mv$(true_code) ), + m_false( mv$(false_code) ) + {} + + NODE_METHODS(); +}; + struct ExprNode_Assign: public ExprNode { @@ -186,6 +202,31 @@ struct ExprNode_Cast: m_value( mv$(value) ), m_type( mv$(dst_type) ) {} + + NODE_METHODS(); +}; +struct ExprNode_Index: + public ExprNode +{ + ::HIR::ExprNodeP m_val; + ::HIR::ExprNodeP m_index; + + ExprNode_Index(::HIR::ExprNodeP val, ::HIR::ExprNodeP index): + m_val( mv$(val) ), + m_index( mv$(index) ) + {} + + NODE_METHODS(); +}; +struct ExprNode_Deref: + public ExprNode +{ + ::HIR::ExprNodeP m_val; + + ExprNode_Deref(::HIR::ExprNodeP val): + m_val( mv$(val) ) + {} + NODE_METHODS(); }; @@ -202,6 +243,19 @@ struct ExprNode_CallPath: NODE_METHODS(); }; +struct ExprNode_CallValue: + public ExprNode +{ + ::HIR::ExprNodeP m_val; + ::std::vector<ExprNodeP> m_args; + + ExprNode_CallValue(::HIR::ExprNodeP val, ::std::vector< ::HIR::ExprNodeP> args): + m_val( mv$(val) ), + m_args( mv$(args) ) + {} + + NODE_METHODS(); +}; struct ExprNode_CallMethod: public ExprNode { @@ -221,6 +275,19 @@ struct ExprNode_CallMethod: NODE_METHODS(); }; +struct ExprNode_Field: + public ExprNode +{ + ::HIR::ExprNodeP m_val; + ::std::string m_field; + + ExprNode_Field(::HIR::ExprNodeP val, ::std::string field): + m_val( mv$(val) ), + m_field( mv$(field) ) + {} + + NODE_METHODS(); +}; struct ExprNode_Literal: public ExprNode @@ -289,6 +356,41 @@ struct ExprNode_StructLiteral: NODE_METHODS(); }; +struct ExprNode_Tuple: + public ExprNode +{ + ::std::vector< ::HIR::ExprNodeP> m_vals; + + ExprNode_Tuple(::std::vector< ::HIR::ExprNodeP> vals): + m_vals( mv$(vals) ) + {} + + NODE_METHODS(); +}; +struct ExprNode_ArrayList: + public ExprNode +{ + ::std::vector< ::HIR::ExprNodeP> m_vals; + + ExprNode_ArrayList(::std::vector< ::HIR::ExprNodeP> vals): + m_vals( mv$(vals) ) + {} + + NODE_METHODS(); +}; +struct ExprNode_ArraySized: + public ExprNode +{ + ::HIR::ExprNodeP m_val; + ::HIR::ExprNodeP m_size; // TODO: Has to be constant + + ExprNode_ArraySized(::HIR::ExprNodeP val, ::HIR::ExprNodeP size): + m_val( mv$(val) ), + m_size( mv$(size) ) + {} + + NODE_METHODS(); +}; #undef NODE_METHODS @@ -303,19 +405,28 @@ public: NV(ExprNode_Loop) NV(ExprNode_LoopControl) NV(ExprNode_Match) + NV(ExprNode_If) NV(ExprNode_Assign) NV(ExprNode_BinOp) NV(ExprNode_UniOp) NV(ExprNode_Cast) + NV(ExprNode_Index) + NV(ExprNode_Deref) NV(ExprNode_CallPath); + NV(ExprNode_CallValue); NV(ExprNode_CallMethod); + NV(ExprNode_Field); NV(ExprNode_Literal); NV(ExprNode_PathValue); NV(ExprNode_Variable); + NV(ExprNode_StructLiteral); + NV(ExprNode_Tuple); + NV(ExprNode_ArrayList); + NV(ExprNode_ArraySized); }; } diff --git a/src/hir/from_ast_expr.cpp b/src/hir/from_ast_expr.cpp index e90d0b99..9ad8f565 100644 --- a/src/hir/from_ast_expr.cpp +++ b/src/hir/from_ast_expr.cpp @@ -208,6 +208,11 @@ struct LowerHIR_ExprNode_Visitor: )); } virtual void visit(::AST::ExprNode_If& v) override { + m_rv.reset( new ::HIR::ExprNode_If( + LowerHIR_ExprNode_Inner(*v.m_cond), + LowerHIR_ExprNode_Inner(*v.m_true), + LowerHIR_ExprNode_Inner_Opt(&*v.m_false) + )); } virtual void visit(::AST::ExprNode_IfLet& v) override { } @@ -275,8 +280,27 @@ struct LowerHIR_ExprNode_Visitor: ) ); } virtual void visit(::AST::ExprNode_Array& v) override { + if( v.m_size ) + { + m_rv.reset( new ::HIR::ExprNode_ArraySized( + LowerHIR_ExprNode_Inner( *v.m_values.at(0) ), + // TODO: Should this size be a full expression on its own? + LowerHIR_ExprNode_Inner( *v.m_size ) + ) ); + } + else + { + ::std::vector< ::HIR::ExprNodeP> vals; + for(const auto& val : v.m_values) + vals.push_back( LowerHIR_ExprNode_Inner(*val) ); + m_rv.reset( new ::HIR::ExprNode_ArrayList( mv$(vals) ) ); + } } virtual void visit(::AST::ExprNode_Tuple& v) override { + ::std::vector< ::HIR::ExprNodeP> vals; + for(const auto& val : v.m_values) + vals.push_back( LowerHIR_ExprNode_Inner(*val ) ); + m_rv.reset( new ::HIR::ExprNode_Tuple( mv$(vals) ) ); } virtual void visit(::AST::ExprNode_NamedValue& v) override { TU_IFLET(::AST::Path::Class, v.m_path.m_class, Local, e, @@ -289,10 +313,21 @@ struct LowerHIR_ExprNode_Visitor: } virtual void visit(::AST::ExprNode_Field& v) override { + m_rv.reset( new ::HIR::ExprNode_Field( + LowerHIR_ExprNode_Inner(*v.m_obj), + v.m_name + )); } virtual void visit(::AST::ExprNode_Index& v) override { + m_rv.reset( new ::HIR::ExprNode_Index( + LowerHIR_ExprNode_Inner(*v.m_obj), + LowerHIR_ExprNode_Inner(*v.m_idx) + )); } virtual void visit(::AST::ExprNode_Deref& v) override { + m_rv.reset( new ::HIR::ExprNode_Deref( + LowerHIR_ExprNode_Inner(*v.m_value) + )); } }; |