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
diff --git a/compiler/cpp/src/generate/t_erl_generator.cc b/compiler/cpp/src/generate/t_erl_generator.cc
index ea4d30f..f90abcb 100644
--- a/compiler/cpp/src/generate/t_erl_generator.cc
+++ b/compiler/cpp/src/generate/t_erl_generator.cc
@@ -76,7 +76,8 @@
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 @@
private:
+ bool has_default_value(t_field *);
+
/**
* add function to export list
*/
@@ -461,7 +464,8 @@
}
-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 @@
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 @@
for (vector<t_field*>::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_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::stringstream buf;
buf << "{struct, [";
+ string field_indent(buf.str().size(), ' ');
t_struct::members_type const& fields = static_cast<t_struct*>(type)->get_members();
t_struct::members_type::const_iterator i, end = fields.end();
@@ -956,7 +976,7 @@
}
if ( ++i != end ) {
- buf << ", ";
+ buf << "," << endl << field_indent;
}
}
diff --git a/lib/erl/Makefile.am b/lib/erl/Makefile.am
index 8cd2ca0..9505024 100644
--- a/lib/erl/Makefile.am
+++ b/lib/erl/Makefile.am
@@ -71,7 +71,8 @@
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 0000000..4aa7f72
--- /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> string_list,
+ 17: list<byte> byte_list = [1, 2, 3],
+ 18: set<string> string_set,
+ 19: map<string, string> string_map
+}