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
+}