diff options
author | John Hodge <tpg@mutabah.net> | 2016-07-07 16:28:59 +1000 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2016-07-07 16:28:59 +1000 |
commit | 50da728d45e191f8a75926848cc0f13285bc9375 (patch) | |
tree | d14a0e39cf0dcd3357e370de0eeb14219bcdc96b /src/expand/derive.cpp | |
parent | 5d059f8d8342e65b80f4bb41d827e8585cd5408b (diff) | |
download | mrust-50da728d45e191f8a75926848cc0f13285bc9375.tar.gz |
Expand/derive - Rough PartialEq on enums
Diffstat (limited to 'src/expand/derive.cpp')
-rw-r--r-- | src/expand/derive.cpp | 36 |
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); |