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;