summaryrefslogtreecommitdiff
path: root/src/ast/expr.cpp
diff options
context:
space:
mode:
authorJohn Hodge (sonata) <tpg@mutabah.net>2015-01-19 21:49:55 +0800
committerJohn Hodge (sonata) <tpg@mutabah.net>2015-01-19 21:49:55 +0800
commitf5bd71bdf7a36fddf52462b49c04fdcce2a3926a (patch)
tree06b49c73861b8342a0dae30a43dbd61c6fe75fad /src/ast/expr.cpp
parent4be8e3955de42210e01ca90373e28690fee762c0 (diff)
downloadmrust-f5bd71bdf7a36fddf52462b49c04fdcce2a3926a.tar.gz
Slow work on typecheck/propagate structure
Diffstat (limited to 'src/ast/expr.cpp')
-rw-r--r--src/ast/expr.cpp122
1 files changed, 120 insertions, 2 deletions
diff --git a/src/ast/expr.cpp b/src/ast/expr.cpp
index 7cde198f..026a54c1 100644
--- a/src/ast/expr.cpp
+++ b/src/ast/expr.cpp
@@ -10,8 +10,7 @@ void Expr::visit_nodes(NodeVisitor& v)
}
::std::ostream& operator<<(::std::ostream& os, const Expr& pat)
{
- os << "Expr(TODO)";
- return os;
+ return os << "Expr(TODO)";
}
SERIALISE_TYPE(Expr::, "Expr", {
s.item(m_node);
@@ -220,5 +219,124 @@ SERIALISE_TYPE_S(ExprNode_BinOp, {
s.item(m_right);
})
+
+void NodeVisitor::visit(ExprNode_Block& node)
+{
+ DEBUG("DEF - ExprNode_Block");
+ INDENT();
+ for( auto& child : node.m_nodes )
+ visit(child);
+ UNINDENT();
+}
+void NodeVisitor::visit(ExprNode_Macro& node)
+{
+ DEBUG("DEF - ExprNode_Macro");
+}
+void NodeVisitor::visit(ExprNode_Return& node)
+{
+ DEBUG("DEF - ExprNode_Return");
+ visit(node.m_value);
+}
+void NodeVisitor::visit(ExprNode_LetBinding& node)
+{
+ DEBUG("DEF - ExprNode_LetBinding");
+ // TODO: Handle recurse into Let pattern
+ visit(node.m_value);
+}
+void NodeVisitor::visit(ExprNode_Assign& node)
+{
+ DEBUG("DEF - ExprNode_Assign");
+ INDENT();
+ visit(node.m_slot);
+ visit(node.m_value);
+ UNINDENT();
+}
+void NodeVisitor::visit(ExprNode_CallPath& node)
+{
+ DEBUG("DEF - ExprNode_CallPath");
+ INDENT();
+ for( auto& arg : node.m_args )
+ visit(arg);
+ UNINDENT();
+}
+void NodeVisitor::visit(ExprNode_CallMethod& node)
+{
+ DEBUG("DEF - ExprNode_CallMethod");
+ INDENT();
+ visit(node.m_val);
+ for( auto& arg : node.m_args )
+ visit(arg);
+ UNINDENT();
+}
+void NodeVisitor::visit(ExprNode_CallObject& node)
+{
+ DEBUG("DEF - ExprNode_CallObject");
+ INDENT();
+ visit(node.m_val);
+ for( auto& arg : node.m_args )
+ visit(arg);
+ UNINDENT();
+}
+void NodeVisitor::visit(ExprNode_Match& node)
+{
+ DEBUG("DEF - ExprNode_Match");
+ INDENT();
+ visit(node.m_val);
+ for( auto& arm : node.m_arms )
+ visit(arm.second);
+ UNINDENT();
+}
+void NodeVisitor::visit(ExprNode_If& node)
+{
+ DEBUG("DEF - ExprNode_If");
+ INDENT();
+ visit(node.m_cond);
+ visit(node.m_true);
+ visit(node.m_false);
+ UNINDENT();
+}
+
+void NodeVisitor::visit(ExprNode_Integer& node)
+{
+ DEBUG("DEF - ExprNode_Integer");
+ // LEAF
+}
+void NodeVisitor::visit(ExprNode_StructLiteral& node)
+{
+ DEBUG("DEF - ExprNode_StructLiteral");
+ visit(node.m_base_value);
+ for( auto& val : node.m_values )
+ visit(val.second);
+}
+void NodeVisitor::visit(ExprNode_Tuple& node)
+{
+ DEBUG("DEF - ExprNode_Tuple");
+ for( auto& val : node.m_values )
+ visit(val);
+}
+void NodeVisitor::visit(ExprNode_NamedValue& node)
+{
+ DEBUG("DEF - ExprNode_NamedValue");
+ // LEAF
+}
+
+void NodeVisitor::visit(ExprNode_Field& node)
+{
+ DEBUG("DEF - ExprNode_Field");
+ visit(node.m_obj);
+}
+void NodeVisitor::visit(ExprNode_Cast& node)
+{
+ DEBUG("DEF - ExprNode_Cast");
+ visit(node.m_value);
+}
+void NodeVisitor::visit(ExprNode_BinOp& node)
+{
+ DEBUG("DEF - ExprNode_BinOp");
+ visit(node.m_left);
+ visit(node.m_right);
+}
+
+
};