From 31835148b24c272dd2f952d8034f22bdec925bd3 Mon Sep 17 00:00:00 2001 From: "Anthony F. Molinaro" Date: Thu, 22 Mar 2012 06:23:36 +0000 Subject: [PATCH] THRIFT-1532/THRIFT-1475 - fix record generation for erlang git-svn-id: https://svn.apache.org/repos/asf/thrift/trunk@1303663 13f79535-47bb-0310-9956-ffa450edef68 --- compiler/cpp/src/generate/t_erl_generator.cc | 34 ++++++++++++++++---- lib/erl/Makefile.am | 3 +- lib/erl/test/Thrift1475.thrift | 22 +++++++++++++ 3 files changed, 51 insertions(+), 8 deletions(-) create mode 100644 lib/erl/test/Thrift1475.thrift diff --git a/compiler/cpp/src/generate/t_erl_generator.cc b/compiler/cpp/src/generate/t_erl_generator.cc index ea4d30fe..f90abcba 100644 --- a/compiler/cpp/src/generate/t_erl_generator.cc +++ b/compiler/cpp/src/generate/t_erl_generator.cc @@ -76,7 +76,8 @@ class t_erl_generator : public t_generator { std::string render_member_value(t_field * field); std::string render_member_requiredness(t_field * field); - std::string render_default_value(t_type* type); +// std::string render_default_value(t_type* type); + std::string render_default_value(t_field * field); std::string render_const_value(t_type* type, t_const_value* value); std::string render_type_term(t_type* ttype, bool expand_structs, bool extended_info = false); @@ -129,6 +130,8 @@ class t_erl_generator : public t_generator { private: + bool has_default_value(t_field *); + /** * add function to export list */ @@ -461,7 +464,8 @@ string t_erl_generator::render_const_value(t_type* type, t_const_value* value) { } -string t_erl_generator::render_default_value(t_type* type) { +string t_erl_generator::render_default_value(t_field* field) { + t_type *type = field->get_type(); if (type->is_struct() || type->is_xception()) { return "#" + uncapitalize(type->get_name()) + "{}"; } else if (type->is_map()) { @@ -481,7 +485,7 @@ string t_erl_generator::render_member_type(t_field * field) { t_base_type::t_base tbase = ((t_base_type*)type)->get_base(); switch (tbase) { case t_base_type::TYPE_STRING: - return "string()"; + return "string() | binary()"; case t_base_type::TYPE_BOOL: return "boolean()"; case t_base_type::TYPE_BYTE: @@ -561,7 +565,7 @@ void t_erl_generator::generate_erl_struct_definition(ostream& out, t_struct* tst for (vector::const_iterator m_iter = members.begin(); m_iter != members.end();) { generate_erl_struct_member(buf, *m_iter); if ( ++m_iter != members.end() ) { - buf << ", " << endl << field_indent; + buf << "," << endl << field_indent; } } buf << "})."; @@ -576,13 +580,28 @@ void t_erl_generator::generate_erl_struct_definition(ostream& out, t_struct* tst void t_erl_generator::generate_erl_struct_member(ostream & out, t_field * tmember) { out << uncapitalize(tmember->get_name()); - out << " = " << render_member_value(tmember); + if (has_default_value(tmember)) + out << " = " << render_member_value(tmember); out << " :: " << render_member_type(tmember); } +bool t_erl_generator::has_default_value(t_field * field) { + t_type *type = field->get_type(); + if (!field->get_value()) { + if (type->is_struct() || type->is_xception() || type->is_map() || + type->is_set() || type->is_list()) { + return true; + } else { + return false; + } + } else { + return true; + } +} + string t_erl_generator::render_member_value(t_field * field) { if (!field->get_value()) { - return render_default_value(field->get_type()); + return render_default_value(field); } else { return render_const_value(field->get_type(), field->get_value()); } @@ -935,6 +954,7 @@ std::string t_erl_generator::render_type_term(t_type* type, bool expand_structs, std::stringstream buf; buf << "{struct, ["; + string field_indent(buf.str().size(), ' '); t_struct::members_type const& fields = static_cast(type)->get_members(); t_struct::members_type::const_iterator i, end = fields.end(); @@ -956,7 +976,7 @@ std::string t_erl_generator::render_type_term(t_type* type, bool expand_structs, } if ( ++i != end ) { - buf << ", "; + buf << "," << endl << field_indent; } } diff --git a/lib/erl/Makefile.am b/lib/erl/Makefile.am index 8cd2ca00..95050248 100644 --- a/lib/erl/Makefile.am +++ b/lib/erl/Makefile.am @@ -71,7 +71,8 @@ clean: test/thriftTest_* \ test/optionalRequiredTest_* \ test/yowza_* \ - test/reverseOrderService_* + test/reverseOrderService_* \ + test/manyOptionals_* ./rebar clean maintainer-clean-local: diff --git a/lib/erl/test/Thrift1475.thrift b/lib/erl/test/Thrift1475.thrift new file mode 100644 index 00000000..4aa7f724 --- /dev/null +++ b/lib/erl/test/Thrift1475.thrift @@ -0,0 +1,22 @@ +struct StructA +{ + 1: string a, + 2: binary b, + 3: optional string c, + 4: optional binary d, + 5: required string e, + 6: required binary f, + 7: string g = "foo", + 8: i32 h, + 9: optional i32 i, + 10: required i32 j, + 11: required i32 k = 5, + 12: double l, + 13: optional double m, + 14: required double n, + 15: double o = 3.14159, + 16: list string_list, + 17: list byte_list = [1, 2, 3], + 18: set string_set, + 19: map string_map +} -- 2.17.1