THRIFT-2955 Using list of typedefs does not compile on Go
Client: Go
Patch: Johannes Martinsson <johannes@saltside.se>
Be explicit about when to use true type.
diff --git a/compiler/cpp/src/generate/t_go_generator.cc b/compiler/cpp/src/generate/t_go_generator.cc
index c3cca60..0ca4946 100644
--- a/compiler/cpp/src/generate/t_go_generator.cc
+++ b/compiler/cpp/src/generate/t_go_generator.cc
@@ -167,7 +167,8 @@
bool inclass = false,
bool coerceData = false,
bool inkey = false,
- bool in_container = false);
+ bool in_container = false
+ bool use_true_type = false);
void generate_deserialize_struct(std::ofstream& out,
t_struct* tstruct,
@@ -2580,7 +2581,8 @@
bool inclass,
bool coerceData,
bool inkey,
- bool in_container_value) {
+ bool in_container_value,
+ bool use_true_type) {
(void)inclass;
(void)coerceData;
t_type* orig_type = tfield->get_type();
@@ -2602,8 +2604,12 @@
} else if (type->is_base_type() || type->is_enum()) {
if (declare) {
- string type_name = inkey ? type_to_go_key_type(tfield->get_type())
- : type_to_go_type(tfield->get_type());
+ t_type* actual_type = use_true_type ? tfield->get_type()->get_true_type()
+ : tfield->get_type();
+
+ string type_name = inkey ? type_to_go_key_type(actual_type)
+ : type_to_go_type(actual_type);
+
out << "var " << tfield->get_name() << " " << type_name << endl;
}
@@ -2664,7 +2670,7 @@
out << "} else {" << endl;
string wrap;
- if (type->is_enum() || orig_type->is_typedef()) {
+ if (type->is_enum() || (orig_type->is_typedef() && !use_true_type)) {
wrap = publicize(type_name(orig_type));
} else if (((t_base_type*)type)->get_base() == t_base_type::TYPE_BYTE) {
wrap = "int8";
@@ -2812,7 +2818,7 @@
string elem = tmp("_elem");
t_field felem(tset->get_elem_type(), elem);
felem.set_req(t_field::T_OPT_IN_REQ_OUT);
- generate_deserialize_field(out, &felem, true, "");
+ generate_deserialize_field(out, &felem, true, "", false, false, false, true, true);
indent(out) << prefix << "[" << elem << "] = true" << endl;
}
@@ -2827,7 +2833,7 @@
string elem = tmp("_elem");
t_field felem(((t_list*)tlist)->get_elem_type(), elem);
felem.set_req(t_field::T_OPT_IN_REQ_OUT);
- generate_deserialize_field(out, &felem, true, "", false, false, false, true);
+ generate_deserialize_field(out, &felem, true, "", false, false, false, true, true);
indent(out) << prefix << " = append(" << prefix << ", " << elem << ")" << endl;
}