summaryrefslogtreecommitdiff
path: root/src/expand/derive.cpp
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2016-07-07 16:28:59 +1000
committerJohn Hodge <tpg@mutabah.net>2016-07-07 16:28:59 +1000
commit50da728d45e191f8a75926848cc0f13285bc9375 (patch)
treed14a0e39cf0dcd3357e370de0eeb14219bcdc96b /src/expand/derive.cpp
parent5d059f8d8342e65b80f4bb41d827e8585cd5408b (diff)
downloadmrust-50da728d45e191f8a75926848cc0f13285bc9375.tar.gz
Expand/derive - Rough PartialEq on enums
Diffstat (limited to 'src/expand/derive.cpp')
-rw-r--r--src/expand/derive.cpp36
1 files changed, 34 insertions, 2 deletions
diff --git a/src/expand/derive.cpp b/src/expand/derive.cpp
index 7b50ef30..0d83c09a 100644
--- a/src/expand/derive.cpp
+++ b/src/expand/derive.cpp
@@ -239,10 +239,26 @@ public:
}
else
{
- ::std::vector< AST::Pattern> pats_a;
- ::std::vector< AST::Pattern> pats_b;
+ ::std::vector<AST::Pattern> pats_a;
+ ::std::vector<AST::Pattern> pats_b;
::std::vector<AST::ExprNodeP> nodes;
+ for( unsigned int idx = 0; idx < e.m_sub_types.size(); idx ++ )
+ {
+ auto name_a = FMT("a" << idx);
+ auto name_b = FMT("b" << idx);
+ pats_a.push_back( ::AST::Pattern(::AST::Pattern::TagBind(), name_a) );
+ pats_b.push_back( ::AST::Pattern(::AST::Pattern::TagBind(), name_b) );
+ nodes.push_back(NEWNODE(AST::ExprNode_If,
+ NEWNODE(AST::ExprNode_BinOp, AST::ExprNode_BinOp::CMPNEQU,
+ NEWNODE(AST::ExprNode_NamedValue, AST::Path(name_a)),
+ NEWNODE(AST::ExprNode_NamedValue, AST::Path(name_b))
+ ),
+ NEWNODE(AST::ExprNode_Flow, AST::ExprNode_Flow::RETURN, "", NEWNODE(AST::ExprNode_Bool, false)),
+ nullptr
+ ));
+ }
+
nodes.push_back( NEWNODE(AST::ExprNode_Bool, true) );
pat_a = AST::Pattern(AST::Pattern::TagEnumVariant(), base_path + v.m_name, mv$(pats_a));
pat_b = AST::Pattern(AST::Pattern::TagEnumVariant(), base_path + v.m_name, mv$(pats_b));
@@ -254,6 +270,22 @@ public:
::std::vector< ::std::pair<std::string, AST::Pattern> > pats_b;
::std::vector<AST::ExprNodeP> nodes;
+ for( const auto& fld : e.m_fields )
+ {
+ auto name_a = FMT("a" << fld.m_name);
+ auto name_b = FMT("b" << fld.m_name);
+ pats_a.push_back( ::std::make_pair(fld.m_name, ::AST::Pattern(::AST::Pattern::TagBind(), name_a)) );
+ pats_b.push_back( ::std::make_pair(fld.m_name, ::AST::Pattern(::AST::Pattern::TagBind(), name_b)) );
+ nodes.push_back(NEWNODE(AST::ExprNode_If,
+ NEWNODE(AST::ExprNode_BinOp, AST::ExprNode_BinOp::CMPNEQU,
+ NEWNODE(AST::ExprNode_NamedValue, AST::Path(name_a)),
+ NEWNODE(AST::ExprNode_NamedValue, AST::Path(name_b))
+ ),
+ NEWNODE(AST::ExprNode_Flow, AST::ExprNode_Flow::RETURN, "", NEWNODE(AST::ExprNode_Bool, false)),
+ nullptr
+ ));
+ }
+
nodes.push_back( NEWNODE(AST::ExprNode_Bool, true) );
pat_a = AST::Pattern(AST::Pattern::TagStruct(), base_path + v.m_name, mv$(pats_a), true);
pat_b = AST::Pattern(AST::Pattern::TagStruct(), base_path + v.m_name, mv$(pats_b), true);