From c43ec6247af8c67f4e14e8e2bab40b46baf03fce Mon Sep 17 00:00:00 2001 From: Bryan Duxbury Date: Thu, 2 Sep 2010 14:58:51 +0000 Subject: [PATCH] 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 --- .../cpp/src/generate/t_csharp_generator.cc | 51 ++++++++++--------- 1 file changed, 28 insertions(+), 23 deletions(-) diff --git a/compiler/cpp/src/generate/t_csharp_generator.cc b/compiler/cpp/src/generate/t_csharp_generator.cc index 7bdbf18d..2d8545b5 100644 --- a/compiler/cpp/src/generate/t_csharp_generator.cc +++ b/compiler/cpp/src/generate/t_csharp_generator.cc @@ -57,6 +57,7 @@ class t_csharp_generator : public t_oop_generator 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 consts); @@ -97,7 +98,7 @@ class t_csharp_generator : public t_oop_generator 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 @@ void t_csharp_generator::generate_csharp_struct_definition(ofstream &out, t_stru //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 @@ void t_csharp_generator::generate_csharp_struct_reader(ofstream& out, t_struct* "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 @@ void t_csharp_generator::generate_csharp_struct_writer(ofstream& out, t_struct* 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 @@ void t_csharp_generator::generate_csharp_struct_writer(ofstream& out, t_struct* 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 @@ void t_csharp_generator::generate_csharp_struct_result_writer(ofstream& out, t_s 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 @@ void t_csharp_generator::generate_csharp_struct_result_writer(ofstream& out, t_s 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 @@ void t_csharp_generator::generate_csharp_struct_tostring(ofstream& out, t_struct 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 ? \"\" : "<< "this." << (*f_iter)->get_name() << ".ToString());" << endl; + "sb.Append(" << prop_name((*f_iter)) << "== 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 @@ void t_csharp_generator::generate_deserialize_field(ofstream& out, t_field* tfie 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 @@ void t_csharp_generator::generate_serialize_field(ofstream& out, t_field* tfield 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_serialize_list_element(ofstream& out, t_list* } 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::base_type_name(t_base_type* tbase, bool in_container) } } -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()) { -- 2.17.1