in compiler/cpp/src/thrift/generate/t_swift_generator.cc [2606:2744]
void t_swift_generator::render_const_value(ostream& out,
t_type* type,
t_const_value* value) {
type = get_true_type(type);
if (type->is_base_type()) {
t_base_type::t_base tbase = ((t_base_type*)type)->get_base();
switch (tbase) {
case t_base_type::TYPE_STRING:
out << "\"" << get_escaped_string(value) << "\"";
break;
case t_base_type::TYPE_BOOL:
out << ((value->get_integer() > 0) ? "true" : "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:
out << type_name(type) << "(" << value->get_integer() << ")";
break;
case t_base_type::TYPE_DOUBLE:
out << type_name(type) << "(";
if (value->get_type() == t_const_value::CV_INTEGER) {
out << value->get_integer();
} else {
out << value->get_double();
}
out << ")";
break;
case t_base_type::TYPE_UUID:
out << "UUID(uuidString: \"" << get_escaped_string(value) << "\")";
break;
default:
throw "compiler error: no const of base type " + t_base_type::t_base_name(tbase);
}
} else if (type->is_enum()) {
out << (gen_cocoa_ ? value->get_identifier() : enum_const_name(value->get_identifier())); // Swift2/Cocoa compatibility
} else if (type->is_struct() || type->is_xception()) {
out << type_name(type) << "(";
const vector<t_field*>& fields = ((t_struct*)type)->get_members();
vector<t_field*>::const_iterator f_iter;
const map<t_const_value*, t_const_value*, t_const_value::value_compare>& val = value->get_map();
map<t_const_value*, t_const_value*, t_const_value::value_compare>::const_iterator v_iter;
for (f_iter = fields.begin(); f_iter != fields.end();) {
t_field* tfield = *f_iter;
t_const_value* value = nullptr;
for (v_iter = val.begin(); v_iter != val.end(); ++v_iter) {
if (tfield->get_name() == v_iter->first->get_string()) {
value = v_iter->second;
}
}
if (value) {
out << tfield->get_name() << ": ";
render_const_value(out, tfield->get_type(), value);
}
else if (!field_is_optional(tfield)) {
throw "constant error: required field " + type->get_name() + "." + tfield->get_name() + " has no value";
}
if (++f_iter != fields.end()) {
out << ", ";
}
}
out << ")";
} else if (type->is_map()) {
out << "[";
t_type* ktype = ((t_map*)type)->get_key_type();
t_type* vtype = ((t_map*)type)->get_val_type();
const map<t_const_value*, t_const_value*, t_const_value::value_compare>& val = value->get_map();
map<t_const_value*, t_const_value*, t_const_value::value_compare>::const_iterator v_iter;
for (v_iter = val.begin(); v_iter != val.end();) {
render_const_value(out, ktype, v_iter->first);
out << ": ";
render_const_value(out, vtype, v_iter->second);
if (++v_iter != val.end()) {
out << ", ";
}
}
out << "]";
} else if (type->is_list()) {
out << "[";
t_type* etype = ((t_list*)type)->get_elem_type();
const map<t_const_value*, t_const_value*, t_const_value::value_compare>& val = value->get_map();
map<t_const_value*, t_const_value*, t_const_value::value_compare>::const_iterator v_iter;
for (v_iter = val.begin(); v_iter != val.end();) {
render_const_value(out, etype, v_iter->first);
if (++v_iter != val.end()) {
out << ", ";
}
}
out << "]";
} else if (type->is_set()) {
out << "[";
t_type* etype = ((t_set*)type)->get_elem_type();
const map<t_const_value*, t_const_value*, t_const_value::value_compare>& val = value->get_map();
map<t_const_value*, t_const_value*, t_const_value::value_compare>::const_iterator v_iter;
for (v_iter = val.begin(); v_iter != val.end();) {
render_const_value(out, etype, v_iter->first);
if (++v_iter != val.end()) {
out << ", ";
}
}
out << "]";
} else {
throw "compiler error: no const of type " + type->get_name();
}
}