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/dump_as_rust.cpp | |
parent | 967a2fd0b278c3e8f19bf8fd189304cb36000acf (diff) | |
download | mrust-a3d37e1f829fc974238815a9d9d468c9087048b4.tar.gz |
AST - Rework struct/enum fields
Diffstat (limited to 'src/dump_as_rust.cpp')
-rw-r--r-- | src/dump_as_rust.cpp | 72 |
1 files changed, 43 insertions, 29 deletions
diff --git a/src/dump_as_rust.cpp b/src/dump_as_rust.cpp index 1fd5494d..be8dbb64 100644 --- a/src/dump_as_rust.cpp +++ b/src/dump_as_rust.cpp @@ -858,33 +858,38 @@ void RustPrinter::handle_struct(const AST::Struct& s) { print_params(s.params()); - if( s.fields().size() == 0 ) - { - m_os << " /* unit-like */\n"; - print_bounds(s.params()); - m_os << indent() << ";\n"; - } - else if( s.fields().size() == 1 && s.fields()[0].name == "" ) - { - const auto& tuple = s.fields()[0].data; - m_os << "(" << tuple.print_pretty() <<")\n"; - print_bounds(s.params()); - m_os << indent() << ";\n"; - } - else - { + TU_MATCH(AST::StructData, (s.m_data), (e), + (Tuple, + if( e.ents.size() == 0 ) + { + m_os << " /* unit-like */\n"; + print_bounds(s.params()); + m_os << indent() << ";\n"; + } + else + { + m_os << "("; + for( const auto& i : e.ents ) + m_os << i.m_type << ", "; + m_os << ")\n"; + print_bounds(s.params()); + m_os << indent() << ";\n"; + } + ), + (Struct, m_os << "\n"; print_bounds(s.params()); m_os << indent() << "{\n"; inc_indent(); - for( const auto& i : s.fields() ) + for( const auto& i : e.ents ) { - m_os << indent() << (i.is_pub ? "pub " : "") << i.name << ": " << i.data.print_pretty() << "\n"; + m_os << indent() << (i.m_is_public ? "pub " : "") << i.m_name << ": " << i.m_type.print_pretty() << "\n"; } dec_indent(); m_os << indent() << "}\n"; - } + ) + ) m_os << "\n"; } @@ -900,18 +905,27 @@ void RustPrinter::handle_enum(const AST::Enum& s) for( const auto& i : s.variants() ) { m_os << indent() << "/*"<<idx<<"*/" << i.m_name; - if( i.m_sub_types.size() ) - { - for( const auto& t : i.m_sub_types ) + TU_MATCH(AST::EnumVariantData, (i.m_data), (e), + (Value, + m_os << " = " << e.m_value; + ), + (Tuple, + m_os << "("; + for( const auto& t : e.m_sub_types ) m_os << t.print_pretty() << ", "; - } - else if(i.m_value.is_valid()) - { - m_os << " = " << i.m_value; - } - else - { - } + m_os << ")"; + ), + (Struct, + m_os << "{\n"; + inc_indent(); + for( const auto& i : e.m_fields ) + { + m_os << indent() << i.m_name << ": " << i.m_type.print_pretty() << "\n"; + } + dec_indent(); + m_os << indent() << "}"; + ) + ) m_os << ",\n"; idx ++; } |