THRIFT-3905 Initialize bool, int, and double properties
Client: Dart
Patch: Mark Erickson <merickson@apache.org>

This closes #1068
diff --git a/compiler/cpp/src/generate/t_dart_generator.cc b/compiler/cpp/src/generate/t_dart_generator.cc
index bec2e47..7a744cf 100644
--- a/compiler/cpp/src/generate/t_dart_generator.cc
+++ b/compiler/cpp/src/generate/t_dart_generator.cc
@@ -175,6 +175,7 @@
   void generate_dart_bean_boilerplate(std::ofstream& out, t_struct* tstruct);
 
   void generate_function_helpers(t_function* tfunction);
+  std::string init_value(t_field* tfield);
   std::string get_cap_name(std::string name);
   std::string get_member_name(std::string name);
   std::string get_args_class_name(std::string name);
@@ -801,7 +802,7 @@
   for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
     generate_dart_doc(out, *m_iter);
     indent(out) << type_name((*m_iter)->get_type()) + " _"
-                << get_member_name((*m_iter)->get_name()) << ";" << endl;
+                << get_member_name((*m_iter)->get_name()) << init_value(*m_iter) << ";" << endl;
 
     indent(out) << "static const int " << upcase_string((*m_iter)->get_name())
                 << " = " << (*m_iter)->get_key() << ";" << endl;
@@ -2312,6 +2313,49 @@
   throw "INVALID TYPE IN type_to_enum: " + type->get_name();
 }
 
+std::string t_dart_generator::init_value(t_field* field) {
+  // Do not initialize optional fields
+  if (field->get_req() == t_field::T_OPTIONAL) {
+    return "";
+  }
+
+  t_type* ttype = field->get_type();
+
+  // Get the actual type for a typedef
+  if (ttype->is_typedef()) {
+    ttype = ((t_typedef*)ttype)->get_type();
+  }
+
+  // Only consider base types for default initialization
+  if (!ttype->is_base_type()) {
+    return "";
+  }
+  t_base_type::t_base tbase = ((t_base_type*)ttype)->get_base();
+
+  // Initialize bools, ints, and doubles with sane defaults
+  string result;
+  switch (tbase) {
+  case t_base_type::TYPE_BOOL:
+    result = " = false";
+    break;
+  case t_base_type::TYPE_I8:
+  case t_base_type::TYPE_I16:
+  case t_base_type::TYPE_I32:
+  case t_base_type::TYPE_I64:
+    result = " = 0";
+    break;
+  case t_base_type::TYPE_DOUBLE:
+    result = " = 0.0";
+    break;
+  case t_base_type::TYPE_VOID:
+  case t_base_type::TYPE_STRING:
+    result = "";
+    break;
+  }
+
+  return result;
+}
+
 std::string t_dart_generator::get_cap_name(std::string name) {
   name[0] = toupper(name[0]);
   return name;