summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/common.hpp6
-rw-r--r--src/hir/expr.hpp14
-rw-r--r--src/hir/from_ast.cpp8
-rw-r--r--src/hir/from_ast_expr.cpp56
-rw-r--r--src/hir/hir.hpp3
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