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()) {