summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/hir/expr.cpp9
-rw-r--r--src/hir/expr.hpp111
-rw-r--r--src/hir/from_ast_expr.cpp35
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)
+ ));
}
};