diff options
-rw-r--r-- | src/common.hpp | 6 | ||||
-rw-r--r-- | src/hir/expr.hpp | 14 | ||||
-rw-r--r-- | src/hir/from_ast.cpp | 8 | ||||
-rw-r--r-- | src/hir/from_ast_expr.cpp | 56 | ||||
-rw-r--r-- | src/hir/hir.hpp | 3 |
5 files changed, 85 insertions, 2 deletions
diff --git a/src/common.hpp b/src/common.hpp index 753d06a6..96cfcd96 100644 --- a/src/common.hpp +++ b/src/common.hpp @@ -28,6 +28,12 @@ template<typename T> ::std::shared_ptr<T> make_shared_ptr(T&& v) { return ::std::shared_ptr<T>(new T(mv$(v))); } +template<typename T> +::std::vector<T> make_vec1(T&& v) { + ::std::vector<T> rv; + rv.push_back( mv$(v) ); + return rv; +} enum Ordering { diff --git a/src/hir/expr.hpp b/src/hir/expr.hpp index 83971572..a1ea043b 100644 --- a/src/hir/expr.hpp +++ b/src/hir/expr.hpp @@ -27,6 +27,15 @@ struct ExprNode_Block: { bool m_is_unsafe; ::std::vector< ExprNodeP > m_nodes; + ::std::vector< ::HIR::SimplePath> m_traits; + + ExprNode_Block(): + m_is_unsafe(false) + {} + ExprNode_Block(bool is_unsafe, ::std::vector<ExprNodeP> nodes): + m_is_unsafe(is_unsafe), + m_nodes( mv$(nodes) ) + {} NODE_METHODS(); }; @@ -47,6 +56,11 @@ struct ExprNode_Loop: ::std::string m_label; ::HIR::ExprNodeP m_code; + ExprNode_Loop(::std::string label, ::HIR::ExprNodeP code): + m_label( mv$(label) ), + m_code( mv$(code) ) + {} + NODE_METHODS(); }; struct ExprNode_LoopControl: diff --git a/src/hir/from_ast.cpp b/src/hir/from_ast.cpp index 3505f0c9..9d603b39 100644 --- a/src/hir/from_ast.cpp +++ b/src/hir/from_ast.cpp @@ -47,7 +47,8 @@ } if( gp.lft_params().size() > 0 ) { - throw ::std::runtime_error("TODO: LowerHIR_GenericParams - lifetimes"); + for(const auto& lft_name : gp.lft_params()) + rv.m_lifetimes.push_back( lft_name ); } if( gp.bounds().size() > 0 ) { @@ -716,7 +717,10 @@ void _add_mod_val_item(::HIR::Module& mod, ::std::string name, bool is_pub, ::H auto item_path = path + name; _add_mod_ns_item( mod, mv$(name), false, ::HIR::TypeItem::make_Module( LowerHIR_Module(submod, mv$(item_path)) ) ); } - + + + // TODO: Populate trait list + return mod; } diff --git a/src/hir/from_ast_expr.cpp b/src/hir/from_ast_expr.cpp index 9ad8f565..ff37ecc1 100644 --- a/src/hir/from_ast_expr.cpp +++ b/src/hir/from_ast_expr.cpp @@ -29,6 +29,12 @@ struct LowerHIR_ExprNode_Visitor: rv->m_nodes.push_back( LowerHIR_ExprNode_Inner( *n ) ); } } + + if( v.m_local_mod ) + { + // TODO: Populate m_traits from the local module's import list + } + m_rv.reset( static_cast< ::HIR::ExprNode*>(rv) ); } virtual void visit(::AST::ExprNode_Macro& v) override { @@ -184,6 +190,56 @@ struct LowerHIR_ExprNode_Visitor: virtual void visit(::AST::ExprNode_CallObject& v) override { } virtual void visit(::AST::ExprNode_Loop& v) override { + switch( v.m_type ) + { + case ::AST::ExprNode_Loop::LOOP: + m_rv.reset( new ::HIR::ExprNode_Loop( + v.m_label, + LowerHIR_ExprNode_Inner(*v.m_code) + ) ); + break; + case ::AST::ExprNode_Loop::WHILE: { + ::std::vector< ::HIR::ExprNodeP> code; + // - if `m_cond` { () } else { break `m_label` } + code.push_back( ::HIR::ExprNodeP(new ::HIR::ExprNode_If( + LowerHIR_ExprNode_Inner(*v.m_cond), + ::HIR::ExprNodeP( new ::HIR::ExprNode_Tuple({}) ), + ::HIR::ExprNodeP( new ::HIR::ExprNode_LoopControl(v.m_label, false) ) + )) ); + code.push_back( LowerHIR_ExprNode_Inner(*v.m_code) ); + + m_rv.reset( new ::HIR::ExprNode_Loop( + v.m_label, + ::HIR::ExprNodeP(new ::HIR::ExprNode_Block(false, mv$(code))) + ) ); + break; } + case ::AST::ExprNode_Loop::WHILELET: { + ::std::vector< ::HIR::ExprNode_Match::Arm> arms; + + // - Matches pattern - Run inner code + arms.push_back(::HIR::ExprNode_Match::Arm { + ::make_vec1( LowerHIR_Pattern(v.m_pattern) ), + ::HIR::ExprNodeP(), + LowerHIR_ExprNode_Inner(*v.m_code) + }); + // - Matches anything else - break + arms.push_back(::HIR::ExprNode_Match::Arm { + ::make_vec1( ::HIR::Pattern() ), + ::HIR::ExprNodeP(), + ::HIR::ExprNodeP( new ::HIR::ExprNode_LoopControl(v.m_label, false) ) + }); + + m_rv.reset( new ::HIR::ExprNode_Loop( + v.m_label, + ::HIR::ExprNodeP(new ::HIR::ExprNode_Match( + LowerHIR_ExprNode_Inner(*v.m_cond), + mv$(arms) + )) + ) ); + break; } + case ::AST::ExprNode_Loop::FOR: { + break; } + } } virtual void visit(::AST::ExprNode_Match& v) override { ::std::vector< ::HIR::ExprNode_Match::Arm> arms; diff --git a/src/hir/hir.hpp b/src/hir/hir.hpp index 3ad2aef7..43e12823 100644 --- a/src/hir/hir.hpp +++ b/src/hir/hir.hpp @@ -141,6 +141,9 @@ struct Trait class Module { public: + // List of in-scope traits in this module + ::std::vector< ::HIR::SimplePath> m_traits; + // Contains all values and functions (including type constructors) ::std::unordered_map< ::std::string, ::std::unique_ptr<VisEnt<ValueItem>> > m_value_items; // Contains types, traits, and modules |