THRIFT-634. csharp: C# Compiler Generates Incorrect Code For Fields which begin with an uppercase letter
Added a '_' to the backing field, and changed all the field references to refer to the property instead.
Patch: Jon S Akhtar
git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@991960 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/compiler/cpp/src/generate/t_csharp_generator.cc b/compiler/cpp/src/generate/t_csharp_generator.cc
index 7bdbf18..2d8545b 100644
--- a/compiler/cpp/src/generate/t_csharp_generator.cc
+++ b/compiler/cpp/src/generate/t_csharp_generator.cc
@@ -57,6 +57,7 @@
void generate_xception (t_struct* txception);
void generate_service (t_service* tservice);
void generate_property(ofstream& out, t_field* tfield, bool isPublic);
+ void generate_csharp_property(ofstream& out, t_field* tfield, bool isPublic, std::string fieldPrefix = "");
bool print_const_value (std::ofstream& out, std::string name, t_type* type, t_const_value* value, bool in_static, bool defval=false, bool needtype=false);
std::string render_const_value(std::ofstream& out, std::string name, t_type* type, t_const_value* value);
void print_const_constructor(std::ofstream& out, std::vector<t_const*> consts);
@@ -97,7 +98,7 @@
std::string type_name(t_type* ttype, bool in_countainer=false, bool in_init=false);
std::string base_type_name(t_base_type* tbase, bool in_container=false);
- std::string declare_field(t_field* tfield, bool init=false);
+ std::string declare_field(t_field* tfield, bool init=false, std::string prefix="");
std::string function_signature(t_function* tfunction, std::string prefix="");
std::string argument_list(t_struct* tstruct);
std::string type_to_enum(t_type* ttype);
@@ -431,7 +432,7 @@
//make private members with public Properties
for (m_iter = members.begin(); m_iter != members.end(); ++m_iter) {
indent(out) <<
- "private " << declare_field(*m_iter, false) << endl;
+ "private " << declare_field(*m_iter, false, "_") << endl;
}
out << endl;
@@ -528,9 +529,8 @@
"if (field.Type == " << type_to_enum((*f_iter)->get_type()) << ") {" << endl;
indent_up();
- generate_deserialize_field(out, *f_iter, "this.");
- indent(out) <<
- "this.__isset." << (*f_iter)->get_name() << " = true;" << endl;
+ generate_deserialize_field(out, *f_iter);
+
indent_down();
out <<
indent() << "} else { " << endl <<
@@ -583,7 +583,7 @@
bool null_allowed = type_can_be_null((*f_iter)->get_type());
if (null_allowed) {
indent(out) <<
- "if (this." << (*f_iter)->get_name() << " != null && __isset." << (*f_iter)->get_name() << ") {" << endl;
+ "if (" << prop_name((*f_iter)) << " != null && __isset." << (*f_iter)->get_name() << ") {" << endl;
indent_up();
}
else
@@ -602,7 +602,7 @@
indent(out) <<
"oprot.WriteFieldBegin(field);" << endl;
- generate_serialize_field(out, *f_iter, "this.");
+ generate_serialize_field(out, *f_iter);
indent(out) <<
"oprot.WriteFieldEnd();" << endl;
@@ -657,12 +657,12 @@
bool null_allowed = type_can_be_null((*f_iter)->get_type());
if (null_allowed) {
indent(out) <<
- "if (this." << (*f_iter)->get_name() << " != null) {" << endl;
+ "if (" << prop_name(*f_iter) << " != null) {" << endl;
indent_up();
}
indent(out) <<
- "field.Name = \"" << (*f_iter)->get_name() << "\";" << endl;
+ "field.Name = \"" << prop_name(*f_iter) << "\";" << endl;
indent(out) <<
"field.Type = " << type_to_enum((*f_iter)->get_type()) << ";" << endl;
indent(out) <<
@@ -670,7 +670,7 @@
indent(out) <<
"oprot.WriteFieldBegin(field);" << endl;
- generate_serialize_field(out, *f_iter, "this.");
+ generate_serialize_field(out, *f_iter);
indent(out) <<
"oprot.WriteFieldEnd();" << endl;
@@ -713,18 +713,18 @@
if (first) {
first = false;
indent(out) <<
- "sb.Append(\"" << (*f_iter)->get_name() << ": \");" << endl;
+ "sb.Append(\"" << prop_name((*f_iter)) << ": \");" << endl;
} else {
indent(out) <<
- "sb.Append(\"," << (*f_iter)->get_name() << ": \");" << endl;
+ "sb.Append(\"," << prop_name((*f_iter)) << ": \");" << endl;
}
t_type* ttype = (*f_iter)->get_type();
if (ttype->is_xception() || ttype->is_struct()) {
indent(out) <<
- "sb.Append(this." << (*f_iter)->get_name() << "== null ? \"<null>\" : "<< "this." << (*f_iter)->get_name() << ".ToString());" << endl;
+ "sb.Append(" << prop_name((*f_iter)) << "== null ? \"<null>\" : "<< prop_name((*f_iter)) << ".ToString());" << endl;
} else {
indent(out) <<
- "sb.Append(this." << (*f_iter)->get_name() << ");" << endl;
+ "sb.Append(" << prop_name((*f_iter)) << ");" << endl;
}
}
@@ -1200,7 +1200,7 @@
throw "CANNOT GENERATE DESERIALIZE CODE FOR void TYPE: " + prefix + tfield->get_name();
}
- string name = prefix + tfield->get_name();
+ string name = prefix + prop_name(tfield);
if (type->is_struct() || type->is_xception()) {
generate_deserialize_struct(out, (t_struct*)type, name);
@@ -1369,16 +1369,18 @@
type = ((t_typedef*)type)->get_type();
}
+ string name = prefix + prop_name(tfield);
+
if (type->is_void()) {
- throw "CANNOT GENERATE SERIALIZE CODE FOR void TYPE: " + prefix + tfield->get_name();
+ throw "CANNOT GENERATE SERIALIZE CODE FOR void TYPE: " + name;
}
if (type->is_struct() || type->is_xception()) {
- generate_serialize_struct(out, (t_struct*)type, prefix + tfield->get_name());
+ generate_serialize_struct(out, (t_struct*)type, name);
} else if (type->is_container()) {
- generate_serialize_container(out, type, prefix + tfield->get_name());
+ generate_serialize_container(out, type, name);
} else if (type->is_base_type() || type->is_enum()) {
- string name = prefix + tfield->get_name();
+
indent(out) <<
"oprot.";
@@ -1518,17 +1520,20 @@
}
void t_csharp_generator::generate_property(ofstream& out, t_field* tfield, bool isPublic) {
+ generate_csharp_property(out, tfield, isPublic, "_");
+}
+void t_csharp_generator::generate_csharp_property(ofstream& out, t_field* tfield, bool isPublic, std::string fieldPrefix) {
indent(out) << (isPublic ? "public " : "private ") << type_name(tfield->get_type())
<< " " << prop_name(tfield) << endl;
scope_up(out);
indent(out) << "get" << endl;
scope_up(out);
- indent(out) << "return " << tfield->get_name() << ";" << endl;
+ indent(out) << "return " << fieldPrefix + tfield->get_name() << ";" << endl;
scope_down(out);
indent(out) << "set" << endl;
scope_up(out);
indent(out) << "__isset." << tfield->get_name() << " = true;" << endl;
- indent(out) << "this." << tfield->get_name() << " = value;" << endl;
+ indent(out) << "this." << fieldPrefix + tfield->get_name() << " = value;" << endl;
scope_down(out);
scope_down(out);
out << endl;
@@ -1597,8 +1602,8 @@
}
}
-string t_csharp_generator::declare_field(t_field* tfield, bool init) {
- string result = type_name(tfield->get_type()) + " " + tfield->get_name();
+string t_csharp_generator::declare_field(t_field* tfield, bool init, std::string prefix) {
+ string result = type_name(tfield->get_type()) + " " + prefix + tfield->get_name();
if (init) {
t_type* ttype = tfield->get_type();
while (ttype->is_typedef()) {