diff options
author | John Hodge <tpg@mutabah.net> | 2016-05-15 16:41:14 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2016-05-15 16:41:14 +0800 |
commit | 4160198a0a1159319a4e523e364ba57e4702295c (patch) | |
tree | bfd733d9af56f789518400fff77df6f8a3f857cb | |
parent | 0bc8acddc94730dcb1f9bd3b2c981b119fe57f6f (diff) | |
download | mrust-4160198a0a1159319a4e523e364ba57e4702295c.tar.gz |
HIR - Start on expression conversion
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | src/hir/expr.hpp | 29 | ||||
-rw-r--r-- | src/hir/expr_ptr.hpp | 4 | ||||
-rw-r--r-- | src/hir/from_ast.cpp | 20 | ||||
-rw-r--r-- | src/hir/from_ast_expr.cpp | 19 |
5 files changed, 70 insertions, 4 deletions
@@ -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"); +} |