in thrift/compiler/generate/t_hack_generator.cc [6866:6928]
std::string t_hack_generator::declare_field(
const t_field* tfield, bool init, bool obj, bool /*thrift*/) {
std::string result = "$" + tfield->name();
if (init) {
const t_type* type = tfield->get_type()->get_true_type();
if (const auto* tbase_type = dynamic_cast<const t_base_type*>(type)) {
switch (tbase_type->get_base()) {
case t_base_type::TYPE_VOID:
break;
case t_base_type::TYPE_STRING:
case t_base_type::TYPE_BINARY:
result += " = ''";
break;
case t_base_type::TYPE_BOOL:
result += " = false";
break;
case t_base_type::TYPE_BYTE:
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:
case t_base_type::TYPE_FLOAT:
result += " = 0.0";
break;
default:
throw std::runtime_error(
"compiler error: no Hack initializer for base type " +
t_base_type::t_base_name(tbase_type->get_base()));
}
} else if (type->is_enum()) {
result += " = null";
} else if (type->is_map()) {
if (arrays_ || no_use_hack_collections_) {
result += " = dict[]";
} else {
result += " = Map {}";
}
} else if (type->is_list()) {
if (arrays_ || no_use_hack_collections_) {
result += " = vec[]";
} else {
result += " = Vector {}";
}
} else if (type->is_set()) {
if (arrays_) {
result += " = keyset[]";
} else if (arraysets_) {
result += " = dict[]";
} else {
result += " = Set {}";
}
} else if (type->is_struct() || type->is_xception()) {
if (obj) {
result += " = " + hack_name(type) + "::withDefaultValues()";
} else {
result += " = null";
}
}
}
return result + ";";
}