diff options
author | John Hodge <tpg@mutabah.net> | 2016-06-07 11:27:41 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2016-06-07 11:27:41 +0800 |
commit | 370708b535397882356541378f201cf505b78ac0 (patch) | |
tree | 519e8f0dae28a3b7cf9b17e61178f2b1ff1c339d | |
parent | 0a18cb44477d4ac241ce08feb768136684714a07 (diff) | |
download | mrust-370708b535397882356541378f201cf505b78ac0.tar.gz |
HIR Expr - Rename m_val to m_value, add visitor for pointers
-rw-r--r-- | src/hir/expr.cpp | 77 | ||||
-rw-r--r-- | src/hir/expr.hpp | 22 | ||||
-rw-r--r-- | src/hir_typeck/expr.cpp | 12 |
3 files changed, 57 insertions, 54 deletions
diff --git a/src/hir/expr.cpp b/src/hir/expr.cpp index 3d48f9d4..457d903a 100644 --- a/src/hir/expr.cpp +++ b/src/hir/expr.cpp @@ -8,87 +8,86 @@ #define DEF_VISIT(nt, n, code) void ::HIR::nt::visit(ExprVisitor& nv) { nv.visit_node(*this); nv.visit(*this); } void ::HIR::ExprVisitorDef::visit(::HIR::nt& n) { code } +void ::HIR::ExprVisitor::visit_node_ptr(::std::unique_ptr< ::HIR::ExprNode>& node_ptr) { + assert(node_ptr); + node_ptr->visit(*this); +} void ::HIR::ExprVisitor::visit_node(::HIR::ExprNode& node) { } DEF_VISIT(ExprNode_Block, node, - for(const auto& subnode : node.m_nodes) { - assert(subnode); - subnode->visit(*this); + for(auto& subnode : node.m_nodes) { + visit_node_ptr(subnode); } ) DEF_VISIT(ExprNode_Return, node, - assert(node.m_value); - node.m_value->visit(*this); + visit_node_ptr(node.m_value); ) DEF_VISIT(ExprNode_Let, node, if( node.m_value ) { - node.m_value->visit(*this); + visit_node_ptr(node.m_value); } ) DEF_VISIT(ExprNode_Loop, node, - assert(node.m_code); - node.m_code->visit(*this); + visit_node_ptr(node.m_code); ) DEF_VISIT(ExprNode_LoopControl, , ) DEF_VISIT(ExprNode_Match, node, - assert(node.m_value); - node.m_value->visit(*this); + visit_node_ptr(node.m_value); for(auto& arm : node.m_arms) { if( arm.m_cond ) - arm.m_cond->visit(*this); - assert(arm.m_code); - arm.m_code->visit(*this); + visit_node_ptr(arm.m_cond); + visit_node_ptr(arm.m_code); } ) DEF_VISIT(ExprNode_If, node, - node.m_cond->visit(*this); - node.m_true->visit(*this); + visit_node_ptr(node.m_cond); + visit_node_ptr(node.m_true); if( node.m_false ) - node.m_false->visit(*this); + visit_node_ptr(node.m_false); ) DEF_VISIT(ExprNode_Assign, node, - node.m_slot->visit(*this); - node.m_value->visit(*this); + visit_node_ptr(node.m_slot); + visit_node_ptr(node.m_value); ) DEF_VISIT(ExprNode_BinOp, node, - node.m_left->visit(*this); - node.m_right->visit(*this); + visit_node_ptr(node.m_left); + visit_node_ptr(node.m_right); ) DEF_VISIT(ExprNode_UniOp, node, - node.m_value->visit(*this); + visit_node_ptr(node.m_value); ) DEF_VISIT(ExprNode_Cast, node, - node.m_value->visit(*this); + visit_node_ptr(node.m_value); ) DEF_VISIT(ExprNode_Unsize, node, - node.m_value->visit(*this); + visit_node_ptr(node.m_value); ) DEF_VISIT(ExprNode_Index, node, - node.m_val->visit(*this); - node.m_index->visit(*this); + visit_node_ptr(node.m_value); + visit_node_ptr(node.m_index); ) DEF_VISIT(ExprNode_Deref, node, - node.m_val->visit(*this); + visit_node_ptr(node.m_value); ) DEF_VISIT(ExprNode_CallPath, node, for(auto& arg : node.m_args) - arg->visit(*this); + visit_node_ptr(arg); ) DEF_VISIT(ExprNode_CallValue, node, - node.m_val->visit(*this); + visit_node_ptr(node.m_value); for(auto& arg : node.m_args) - arg->visit(*this); + visit_node_ptr(arg); ) DEF_VISIT(ExprNode_CallMethod, node, - node.m_val->visit(*this); + visit_node_ptr(node.m_value); for(auto& arg : node.m_args) - arg->visit(*this); + visit_node_ptr(arg); ) DEF_VISIT(ExprNode_Field, node, - node.m_val->visit(*this); + visit_node_ptr(node.m_value); ) DEF_VISIT(ExprNode_Literal, , ) @@ -96,25 +95,25 @@ DEF_VISIT(ExprNode_PathValue, , ) DEF_VISIT(ExprNode_Variable, , ) DEF_VISIT(ExprNode_StructLiteral, node, if( node.m_base_value ) - node.m_base_value->visit(*this); + visit_node_ptr(node.m_base_value); for(auto& val : node.m_values) - val.second->visit( *this ); + visit_node_ptr(val.second); ) DEF_VISIT(ExprNode_Tuple, node, for(auto& val : node.m_vals) - val->visit( *this ); + visit_node_ptr(val); ) DEF_VISIT(ExprNode_ArrayList, node, for(auto& val : node.m_vals) - val->visit( *this ); + visit_node_ptr(val); ) DEF_VISIT(ExprNode_ArraySized, node, - node.m_val->visit( *this ); - node.m_size->visit( *this ); + visit_node_ptr(node.m_val); + visit_node_ptr(node.m_size); ) DEF_VISIT(ExprNode_Closure, node, - node.m_code->visit( *this ); + visit_node_ptr(node.m_code); ) #undef DEF_VISIT diff --git a/src/hir/expr.hpp b/src/hir/expr.hpp index e5de1eff..eb1b43a5 100644 --- a/src/hir/expr.hpp +++ b/src/hir/expr.hpp @@ -269,12 +269,12 @@ struct ExprNode_Unsize: struct ExprNode_Index: public ExprNode { - ::HIR::ExprNodeP m_val; + ::HIR::ExprNodeP m_value; ::HIR::ExprNodeP m_index; ExprNode_Index(Span sp, ::HIR::ExprNodeP val, ::HIR::ExprNodeP index): ExprNode(mv$(sp)), - m_val( mv$(val) ), + m_value( mv$(val) ), m_index( mv$(index) ) {} @@ -283,11 +283,11 @@ struct ExprNode_Index: struct ExprNode_Deref: public ExprNode { - ::HIR::ExprNodeP m_val; + ::HIR::ExprNodeP m_value; ExprNode_Deref(Span sp, ::HIR::ExprNodeP val): ExprNode(mv$(sp)), - m_val( mv$(val) ) + m_value( mv$(val) ) {} NODE_METHODS(); @@ -313,12 +313,12 @@ struct ExprNode_CallPath: struct ExprNode_CallValue: public ExprNode { - ::HIR::ExprNodeP m_val; + ::HIR::ExprNodeP m_value; ::std::vector<ExprNodeP> m_args; ExprNode_CallValue(Span sp, ::HIR::ExprNodeP val, ::std::vector< ::HIR::ExprNodeP> args): ExprNode(mv$(sp)), - m_val( mv$(val) ), + m_value( mv$(val) ), m_args( mv$(args) ) {} @@ -327,7 +327,7 @@ struct ExprNode_CallValue: struct ExprNode_CallMethod: public ExprNode { - ::HIR::ExprNodeP m_val; + ::HIR::ExprNodeP m_value; ::std::string m_method; ::HIR::PathParams m_params; ::std::vector< ::HIR::ExprNodeP> m_args; @@ -338,10 +338,11 @@ struct ExprNode_CallMethod: ExprNode_CallMethod(Span sp, ::HIR::ExprNodeP val, ::std::string method_name, ::HIR::PathParams params, ::std::vector< ::HIR::ExprNodeP> args): ExprNode( mv$(sp) ), - m_val( mv$(val) ), + m_value( mv$(val) ), m_method( mv$(method_name) ), m_params( mv$(params) ), m_args( mv$(args) ), + m_method_path( ::HIR::SimplePath("",{}) ) { } @@ -351,12 +352,12 @@ struct ExprNode_CallMethod: struct ExprNode_Field: public ExprNode { - ::HIR::ExprNodeP m_val; + ::HIR::ExprNodeP m_value; ::std::string m_field; ExprNode_Field(Span sp, ::HIR::ExprNodeP val, ::std::string field): ExprNode(mv$(sp)), - m_val( mv$(val) ), + m_value( mv$(val) ), m_field( mv$(field) ) {} @@ -537,6 +538,7 @@ struct ExprNode_Closure: class ExprVisitor { public: + virtual void visit_node_ptr(::std::unique_ptr<ExprNode>& node_ptr); virtual void visit_node(ExprNode& node); #define NV(nt) virtual void visit(nt& n) = 0; diff --git a/src/hir_typeck/expr.cpp b/src/hir_typeck/expr.cpp index b8d3d880..9ce5d00e 100644 --- a/src/hir_typeck/expr.cpp +++ b/src/hir_typeck/expr.cpp @@ -1627,6 +1627,8 @@ namespace { { } + // TODO: Add a new method called for all ExprNodeP, which will save the pointer someho + // - Block: Ignore all return values except the last one (which is yeilded) void visit(::HIR::ExprNode_Block& node) override { @@ -1853,7 +1855,7 @@ namespace { // - Index: Look for implementation of the Index trait void visit(::HIR::ExprNode_Index& node) override { - this->context.find_trait_impls(this->context.m_crate.get_lang_item_path(node.span(), "index"), node.m_val->m_res_type, [&](const auto& args) { + this->context.find_trait_impls(this->context.m_crate.get_lang_item_path(node.span(), "index"), node.m_value->m_res_type, [&](const auto& args) { DEBUG("TODO: Insert index operator (if index arg matches)"); return false; }); @@ -1862,7 +1864,7 @@ namespace { // - Deref: Look for impl of Deref void visit(::HIR::ExprNode_Deref& node) override { - const auto& ty = this->context.get_type( node.m_val->m_res_type ); + const auto& ty = this->context.get_type( node.m_value->m_res_type ); TU_IFLET(::HIR::TypeRef::Data, ty.m_data, Borrow, e, this->context.apply_equality(node.span(), node.m_res_type, *e.inner); ) @@ -2020,7 +2022,7 @@ namespace { ::HIR::ExprVisitorDef::visit(node); if( node.m_method_path.m_data.is_Generic() && node.m_method_path.m_data.as_Generic().m_path.m_components.size() == 0 ) { - const auto& ty = this->context.get_type(node.m_val->m_res_type); + const auto& ty = this->context.get_type(node.m_value->m_res_type); DEBUG("ty = " << ty); // Using autoderef, locate this method on the type ::HIR::Path fcn_path { ::HIR::SimplePath() }; @@ -2045,8 +2047,8 @@ namespace { DEBUG("Adding " << deref_count << " dereferences"); while( deref_count > 0 ) { - node.m_val = ::HIR::ExprNodeP( new ::HIR::ExprNode_Deref(node.span(), mv$(node.m_val)) ); - this->context.add_ivars( node.m_val->m_res_type ); + node.m_value = ::HIR::ExprNodeP( new ::HIR::ExprNode_Deref(node.span(), mv$(node.m_value)) ); + this->context.add_ivars( node.m_value->m_res_type ); deref_count -= 1; } } |