summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2016-05-15 16:41:14 +0800
committerJohn Hodge <tpg@mutabah.net>2016-05-15 16:41:14 +0800
commit4160198a0a1159319a4e523e364ba57e4702295c (patch)
treebfd733d9af56f789518400fff77df6f8a3f857cb
parent0bc8acddc94730dcb1f9bd3b2c981b119fe57f6f (diff)
downloadmrust-4160198a0a1159319a4e523e364ba57e4702295c.tar.gz
HIR - Start on expression conversion
-rw-r--r--Makefile2
-rw-r--r--src/hir/expr.hpp29
-rw-r--r--src/hir/expr_ptr.hpp4
-rw-r--r--src/hir/from_ast.cpp20
-rw-r--r--src/hir/from_ast_expr.cpp19
5 files changed, 70 insertions, 4 deletions
diff --git a/Makefile b/Makefile
index e78fa156..4f7f8f17 100644
--- a/Makefile
+++ b/Makefile
@@ -35,7 +35,7 @@ OBJ += expand/concat.o expand/stringify.o expand/file_line.o
OBJ += expand/derive.o expand/lang_item.o
OBJ += expand/std_prelude.o
OBJ += resolve/use.o resolve/index.o resolve/absolute.o
-OBJ += hir/from_ast.o
+OBJ += hir/from_ast.o hir/from_ast_expr.o
OBJ += hir/crate_ptr.o hir/type_ptr.o
OBJ += hir/type.o hir/path.o
OBJ += dump_as_rust.o
diff --git a/src/hir/expr.hpp b/src/hir/expr.hpp
new file mode 100644
index 00000000..634932a6
--- /dev/null
+++ b/src/hir/expr.hpp
@@ -0,0 +1,29 @@
+/*
+ */
+#pragma once
+
+
+namespace HIR {
+
+class Visitor;
+
+class ExprNode
+{
+public:
+ virtual void visit(Visitor& v) = 0;
+ virtual ~ExprNode() = 0;
+};
+
+class ExprNode_Block:
+ public ExprNode
+{
+};
+
+class Visitor
+{
+public:
+ virtual void visit(ExprNode_Block& n) = 0;
+};
+
+}
+
diff --git a/src/hir/expr_ptr.hpp b/src/hir/expr_ptr.hpp
index e6b1bec4..2804136b 100644
--- a/src/hir/expr_ptr.hpp
+++ b/src/hir/expr_ptr.hpp
@@ -10,6 +10,10 @@ class ExprNode;
class ExprPtr
{
::HIR::ExprNode* node;
+
+public:
+ ExprPtr();
+ ~ExprPtr();
};
} // namespace HIR
diff --git a/src/hir/from_ast.cpp b/src/hir/from_ast.cpp
index 515a815b..e93a3273 100644
--- a/src/hir/from_ast.cpp
+++ b/src/hir/from_ast.cpp
@@ -5,6 +5,8 @@
#include <ast/ast.hpp>
#include <ast/crate.hpp>
+extern ::HIR::ExprPtr LowerHIR_ExprNode(const ::AST::ExprNode& e);
+
::HIR::Module LowerHIR_Module(const ::AST::Module& module, ::HIR::SimplePath path);
/// \brief Converts the AST into HIR format
@@ -14,7 +16,8 @@
::HIR::CratePtr LowerHIR_FromAST(::AST::Crate crate)
{
::std::unordered_map< ::std::string, MacroRules > macros;
- // TODO: Extract macros from root module
+
+ // - Extract macros from root module
for( const auto& mac : crate.m_root_module.macros() ) {
//if( mac.data.export ) {
macros.insert( ::std::make_pair( mac.name, mac.data ) );
@@ -25,6 +28,7 @@
macros.insert( ::std::make_pair( mac.name, *mac.data ) );
//}
}
+
auto rootmod = LowerHIR_Module( crate.m_root_module, ::HIR::SimplePath("") );
return ::HIR::CratePtr( ::HIR::Crate { mv$(rootmod), mv$(macros) } );
}
@@ -37,11 +41,21 @@
::HIR::ExprPtr LowerHIR_Expr(const ::std::shared_ptr< ::AST::ExprNode>& e)
{
- throw ::std::runtime_error("TODO: LowerHIR_Expr");
+ if( e.get() ) {
+ return LowerHIR_ExprNode(*e);
+ }
+ else {
+ return ::HIR::ExprPtr();
+ }
}
::HIR::ExprPtr LowerHIR_Expr(const ::AST::Expr& e)
{
- throw ::std::runtime_error("TODO: LowerHIR_Expr");
+ if( e.is_valid() ) {
+ return LowerHIR_ExprNode(e.node());
+ }
+ else {
+ return ::HIR::ExprPtr();
+ }
}
::HIR::GenericPath LowerHIR_GenericPath(const ::AST::Path& path)
diff --git a/src/hir/from_ast_expr.cpp b/src/hir/from_ast_expr.cpp
index e69de29b..a5f29ce8 100644
--- a/src/hir/from_ast_expr.cpp
+++ b/src/hir/from_ast_expr.cpp
@@ -0,0 +1,19 @@
+/*
+ */
+#include <hir/expr_ptr.hpp>
+#include <hir/expr.hpp>
+#include <ast/expr.hpp>
+#include <ast/ast.hpp>
+
+
+struct Visitor:
+ public ::AST::NodeVisitor
+{
+};
+
+::HIR::ExprPtr LowerHIR_ExprNode(const ::AST::ExprNode& e)
+{
+ //Visitor v;
+ //const_cast<::AST::ExprNode*>(&e)->visit( v );
+ throw ::std::runtime_error("TODO: LowerHIR_ExprNode");
+}