summaryrefslogtreecommitdiff
path: root/src/ast/expr.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/ast/expr.hpp')
-rw-r--r--src/ast/expr.hpp92
1 files changed, 24 insertions, 68 deletions
diff --git a/src/ast/expr.hpp b/src/ast/expr.hpp
index db55c80c..ad2f906d 100644
--- a/src/ast/expr.hpp
+++ b/src/ast/expr.hpp
@@ -20,11 +20,14 @@ class NodeVisitor;
class ExprNode:
public Serialisable
{
+ TypeRef m_res_type;
public:
virtual ~ExprNode() = 0;
virtual void visit(NodeVisitor& nv) = 0;
+ TypeRef& get_res_type() { return m_res_type; }
+
static ::std::unique_ptr<ExprNode> from_deserialiser(Deserialiser& d);
};
@@ -82,11 +85,13 @@ struct ExprNode_LetBinding:
public ExprNode
{
Pattern m_pat;
+ TypeRef m_type;
unique_ptr<ExprNode> m_value;
ExprNode_LetBinding() {}
- ExprNode_LetBinding(Pattern pat, unique_ptr<ExprNode>&& value):
+ ExprNode_LetBinding(Pattern pat, TypeRef type, unique_ptr<ExprNode>&& value):
m_pat( move(pat) ),
+ m_type( move(type) ),
m_value( move(value) )
{
}
@@ -342,79 +347,30 @@ struct ExprNode_BinOp:
class NodeVisitor
{
public:
- void visit(const unique_ptr<ExprNode>& cnode) {
+ inline void visit(const unique_ptr<ExprNode>& cnode) {
if(cnode.get())
cnode->visit(*this);
}
- virtual void visit(ExprNode_Block& node) {
- for( auto& child : node.m_nodes )
- visit(child);
- }
- virtual void visit(ExprNode_Macro& node) {
- }
- virtual void visit(ExprNode_Return& node) {
- visit(node.m_value);
- }
- virtual void visit(ExprNode_LetBinding& node) {
- // TODO: Handle recurse into Let pattern
- visit(node.m_value);
- }
- virtual void visit(ExprNode_Assign& node) {
- visit(node.m_slot);
- visit(node.m_value);
- }
- virtual void visit(ExprNode_CallPath& node) {
- for( auto& arg : node.m_args )
- visit(arg);
- }
- virtual void visit(ExprNode_CallMethod& node) {
- visit(node.m_val);
- for( auto& arg : node.m_args )
- visit(arg);
- }
- virtual void visit(ExprNode_CallObject& node) {
- visit(node.m_val);
- for( auto& arg : node.m_args )
- visit(arg);
- }
- virtual void visit(ExprNode_Match& node) {
- visit(node.m_val);
- for( auto& arm : node.m_arms )
- visit(arm.second);
- }
- virtual void visit(ExprNode_If& node) {
- visit(node.m_cond);
- visit(node.m_true);
- visit(node.m_false);
- }
+ virtual void visit(ExprNode_Block& node);
+ virtual void visit(ExprNode_Macro& node);
+ virtual void visit(ExprNode_Return& node);
+ virtual void visit(ExprNode_LetBinding& node);
+ virtual void visit(ExprNode_Assign& node);
+ virtual void visit(ExprNode_CallPath& node);
+ virtual void visit(ExprNode_CallMethod& node);
+ virtual void visit(ExprNode_CallObject& node);
+ virtual void visit(ExprNode_Match& node);
+ virtual void visit(ExprNode_If& node);
- virtual void visit(ExprNode_Integer& node) {
- // LEAF
- }
- virtual void visit(ExprNode_StructLiteral& node) {
- visit(node.m_base_value);
- for( auto& val : node.m_values )
- visit(val.second);
- }
- virtual void visit(ExprNode_Tuple& node) {
- for( auto& val : node.m_values )
- visit(val);
- }
- virtual void visit(ExprNode_NamedValue& node) {
- // LEAF
- }
+ virtual void visit(ExprNode_Integer& node);
+ virtual void visit(ExprNode_StructLiteral& node);
+ virtual void visit(ExprNode_Tuple& node);
+ virtual void visit(ExprNode_NamedValue& node);
- virtual void visit(ExprNode_Field& node) {
- visit(node.m_obj);
- }
- virtual void visit(ExprNode_Cast& node) {
- visit(node.m_value);
- }
- virtual void visit(ExprNode_BinOp& node) {
- visit(node.m_left);
- visit(node.m_right);
- }
+ virtual void visit(ExprNode_Field& node);
+ virtual void visit(ExprNode_Cast& node);
+ virtual void visit(ExprNode_BinOp& node);
};
class Expr: