diff options
author | John Hodge <tpg@mutabah.net> | 2016-03-16 18:36:22 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2016-03-16 18:36:22 +0800 |
commit | a3d37e1f829fc974238815a9d9d468c9087048b4 (patch) | |
tree | acf322854baa582943e4886a2648a61f9f74f34b /src/expand/derive.cpp | |
parent | 967a2fd0b278c3e8f19bf8fd189304cb36000acf (diff) | |
download | mrust-a3d37e1f829fc974238815a9d9d468c9087048b4.tar.gz |
AST - Rework struct/enum fields
Diffstat (limited to 'src/expand/derive.cpp')
-rw-r--r-- | src/expand/derive.cpp | 45 |
1 files changed, 26 insertions, 19 deletions
diff --git a/src/expand/derive.cpp b/src/expand/derive.cpp index 028a8d9b..0096f809 100644 --- a/src/expand/derive.cpp +++ b/src/expand/derive.cpp @@ -58,27 +58,34 @@ public: // Generate code for Debug AST::ExprNodeP node; - node = NEWNODE(AST::ExprNode_NamedValue, AST::Path("f")); - node = NEWNODE(AST::ExprNode_CallMethod, - mv$(node), AST::PathNode("debug_struct",{}), - vec$( NEWNODE(AST::ExprNode_String, name) ) - ); - for( const auto& fld : str.fields() ) - { + TU_MATCH(AST::StructData, (str.m_data), (e), + (Struct, + node = NEWNODE(AST::ExprNode_NamedValue, AST::Path("f")); node = NEWNODE(AST::ExprNode_CallMethod, - mv$(node), AST::PathNode("field",{}), - vec$( - NEWNODE(AST::ExprNode_String, fld.name), - NEWNODE(AST::ExprNode_UniOp, AST::ExprNode_UniOp::REF, - NEWNODE(AST::ExprNode_Field, - NEWNODE(AST::ExprNode_NamedValue, AST::Path("self")), - fld.name - ) - ) - ) + mv$(node), AST::PathNode("debug_struct",{}), + vec$( NEWNODE(AST::ExprNode_String, name) ) ); - } - node = NEWNODE(AST::ExprNode_CallMethod, mv$(node), AST::PathNode("finish",{}), {}); + for( const auto& fld : e.ents ) + { + node = NEWNODE(AST::ExprNode_CallMethod, + mv$(node), AST::PathNode("field",{}), + vec$( + NEWNODE(AST::ExprNode_String, fld.m_name), + NEWNODE(AST::ExprNode_UniOp, AST::ExprNode_UniOp::REF, + NEWNODE(AST::ExprNode_Field, + NEWNODE(AST::ExprNode_NamedValue, AST::Path("self")), + fld.m_name + ) + ) + ) + ); + } + node = NEWNODE(AST::ExprNode_CallMethod, mv$(node), AST::PathNode("finish",{}), {}); + ), + (Tuple, + assert(!"TODO: derive() debug on tuple struct"); + ) + ) DEBUG("node = " << *node); |