summaryrefslogtreecommitdiff
path: root/src/dump_as_rust.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/dump_as_rust.cpp')
-rw-r--r--src/dump_as_rust.cpp82
1 files changed, 80 insertions, 2 deletions
diff --git a/src/dump_as_rust.cpp b/src/dump_as_rust.cpp
index 76bb99b4..471a0479 100644
--- a/src/dump_as_rust.cpp
+++ b/src/dump_as_rust.cpp
@@ -58,9 +58,14 @@ public:
m_expr_root = false;
m_os << n.m_name << "!( /* TODO: Macro TT */ )";
}
- virtual void visit(AST::ExprNode_Return& n) override {
+ virtual void visit(AST::ExprNode_Flow& n) override {
m_expr_root = false;
- m_os << "return ";
+ switch(n.m_type)
+ {
+ case AST::ExprNode_Flow::RETURN: m_os << "return "; break;
+ case AST::ExprNode_Flow::BREAK: m_os << "break "; break;
+ case AST::ExprNode_Flow::CONTINUE: m_os << "continue "; break;
+ }
AST::NodeVisitor::visit(n.m_value);
}
virtual void visit(AST::ExprNode_Const& n) override {
@@ -70,6 +75,11 @@ public:
m_os << " = ";
AST::NodeVisitor::visit(n.m_value);
}
+ virtual void visit(AST::ExprNode_Import& n) override {
+ m_expr_root = false;
+ for( const auto& item : n.m_imports )
+ m_os << "use " << item.second << " as " << item.first << ";\n" << indent();
+ }
virtual void visit(AST::ExprNode_LetBinding& n) override {
m_expr_root = false;
m_os << "let ";
@@ -121,6 +131,45 @@ public:
m_expr_root = false;
throw ::std::runtime_error("unimplemented ExprNode_CallObject");
}
+ virtual void visit(AST::ExprNode_Loop& n) override {
+ bool expr_root = m_expr_root;
+ m_expr_root = false;
+
+ switch(n.m_type)
+ {
+ case AST::ExprNode_Loop::LOOP:
+ m_os << "loop";
+ break;
+ case AST::ExprNode_Loop::WHILE:
+ m_os << "while ";
+ AST::NodeVisitor::visit(n.m_cond);
+ break;
+ case AST::ExprNode_Loop::WHILELET:
+ m_os << "while let ";
+ print_pattern(n.m_pattern);
+ m_os << " = ";
+ AST::NodeVisitor::visit(n.m_cond);
+ break;
+ case AST::ExprNode_Loop::FOR:
+ m_os << "while for ";
+ print_pattern(n.m_pattern);
+ m_os << " in ";
+ AST::NodeVisitor::visit(n.m_cond);
+ break;
+ }
+
+ if( expr_root )
+ {
+ m_os << "\n";
+ m_os << indent();
+ }
+ else
+ {
+ m_os << " ";
+ }
+
+ AST::NodeVisitor::visit(n.m_code);
+ }
virtual void visit(AST::ExprNode_Match& n) override {
bool expr_root = m_expr_root;
m_expr_root = false;
@@ -220,6 +269,22 @@ public:
AST::NodeVisitor::visit(fv);
}
}
+ virtual void visit(AST::ExprNode_Closure& n) override {
+ m_expr_root = false;
+ m_os << "|";
+ bool is_first = true;
+ for( const auto& arg : n.m_args )
+ {
+ if(!is_first) m_os << ", ";
+ is_first = false;
+ print_pattern(arg.first);
+ m_os << ": ";
+ print_type(arg.second);
+ }
+ m_os << "|: ";
+ print_type(n.m_return);
+ AST::NodeVisitor::visit(n.m_code);
+ }
virtual void visit(AST::ExprNode_Integer& n) override {
m_expr_root = false;
switch(n.m_datatype)
@@ -268,6 +333,11 @@ public:
else
m_os << "false";
}
+ virtual void visit(AST::ExprNode_String& n) override {
+ m_expr_root = false;
+ m_os << "\"" << n.m_value << "\"";
+ }
+
virtual void visit(AST::ExprNode_StructLiteral& n) override {
m_expr_root = false;
m_os << n.m_path << " {\n";
@@ -307,6 +377,14 @@ public:
AST::NodeVisitor::visit(n.m_obj);
m_os << ")." << n.m_name;
}
+ virtual void visit(AST::ExprNode_Index& n) override {
+ m_expr_root = false;
+ m_os << "(";
+ AST::NodeVisitor::visit(n.m_obj);
+ m_os << ")[";
+ AST::NodeVisitor::visit(n.m_idx);
+ m_os << "]";
+ }
virtual void visit(AST::ExprNode_Deref&) override {
m_expr_root = false;
throw ::std::runtime_error("unimplemented ExprNode_Deref");