summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2016-06-07 11:27:41 +0800
committerJohn Hodge <tpg@mutabah.net>2016-06-07 11:27:41 +0800
commit370708b535397882356541378f201cf505b78ac0 (patch)
tree519e8f0dae28a3b7cf9b17e61178f2b1ff1c339d
parent0a18cb44477d4ac241ce08feb768136684714a07 (diff)
downloadmrust-370708b535397882356541378f201cf505b78ac0.tar.gz
HIR Expr - Rename m_val to m_value, add visitor for pointers
-rw-r--r--src/hir/expr.cpp77
-rw-r--r--src/hir/expr.hpp22
-rw-r--r--src/hir_typeck/expr.cpp12
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;
}
}