This is an automated email from the ASF dual-hosted git repository.

jking pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/thrift.git


The following commit(s) were added to refs/heads/master by this push:
     new 087d881  THRIFT-4684: Fix WCF related C# code generation
087d881 is described below

commit 087d88108d34e3b08bc24eb555ec2d98b5293c31
Author: Shaoyu Zhang <zsy...@users.noreply.github.com>
AuthorDate: Sat Dec 22 23:12:01 2018 +0800

    THRIFT-4684: Fix WCF related C# code generation
    
    Client: C#
    Complete the namespace in System.ServiceModel in WCF related code.
    Also when generating fields in fault classes, we follow the same behavior 
in normal struct,
    to avoid generating unused private fields, when auto properties are also 
generated.
---
 .../cpp/src/thrift/generate/t_csharp_generator.cc   | 21 ++++++++++++---------
 1 file changed, 12 insertions(+), 9 deletions(-)

diff --git a/compiler/cpp/src/thrift/generate/t_csharp_generator.cc 
b/compiler/cpp/src/thrift/generate/t_csharp_generator.cc
index 37d6f9d..9d1e29e 100644
--- a/compiler/cpp/src/thrift/generate/t_csharp_generator.cc
+++ b/compiler/cpp/src/thrift/generate/t_csharp_generator.cc
@@ -422,7 +422,7 @@ string t_csharp_generator::csharp_type_usings() {
          + ((async_) ? "using System.Threading.Tasks;\n" : "") + "using 
Thrift;\n"
          + "using Thrift.Collections;\n" + ((serialize_ || wcf_) ? "#if 
!SILVERLIGHT\n" : "")
          + ((serialize_ || wcf_) ? "using System.Xml.Serialization;\n" : "")
-         + ((serialize_ || wcf_) ? "#endif\n" : "") + (wcf_ ? "//using 
System.ServiceModel;\n" : "")
+         + ((serialize_ || wcf_) ? "#endif\n" : "")
          + "using System.Runtime.Serialization;\n";
 }
 
@@ -903,7 +903,10 @@ void t_csharp_generator::generate_csharp_wcffault(ostream& 
out, t_struct* tstruc
 
   // 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;
+    // if the field is requied, then we use auto-properties
+    if (!field_is_required((*m_iter)) && (!nullable_ || 
field_has_default((*m_iter)))) {
+      indent(out) << "private " << declare_field(*m_iter, false, "_") << endl;
+    }
   }
   out << endl;
 
@@ -1475,7 +1478,7 @@ void 
t_csharp_generator::generate_sync_service_interface(t_service* tservice) {
   generate_csharp_doc(f_service_, tservice);
 
   if (wcf_) {
-    indent(f_service_) << "[ServiceContract(Namespace=\"" << wcf_namespace_ << 
"\")]" << endl;
+    indent(f_service_) << "[System.ServiceModel.ServiceContract(Namespace=\"" 
<< wcf_namespace_ << "\")]" << endl;
   }
   indent(f_service_) << "public interface ISync" << extends_iface << " {" << 
endl;
 
@@ -1487,12 +1490,12 @@ void 
t_csharp_generator::generate_sync_service_interface(t_service* tservice) {
 
     // if we're using WCF, add the corresponding attributes
     if (wcf_) {
-      indent(f_service_) << "[OperationContract]" << endl;
+      indent(f_service_) << "[System.ServiceModel.OperationContract]" << endl;
 
       const std::vector<t_field*>& xceptions = 
(*f_iter)->get_xceptions()->get_members();
       vector<t_field*>::const_iterator x_iter;
       for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) {
-        indent(f_service_) << "[FaultContract(typeof("
+        indent(f_service_) << "[System.ServiceModel.FaultContract(typeof("
           + type_name((*x_iter)->get_type(), false, false) + "Fault))]" << 
endl;
       }
     }
@@ -1514,7 +1517,7 @@ void 
t_csharp_generator::generate_async_service_interface(t_service* tservice) {
   generate_csharp_doc(f_service_, tservice);
 
   if (wcf_) {
-    indent(f_service_) << "[ServiceContract(Namespace=\"" << wcf_namespace_ << 
"\")]" << endl;
+    indent(f_service_) << "[System.ServiceModel.ServiceContract(Namespace=\"" 
<< wcf_namespace_ << "\")]" << endl;
   }
   indent(f_service_) << "public interface IAsync" << extends_iface << " {" << 
endl;
 
@@ -1526,12 +1529,12 @@ void 
t_csharp_generator::generate_async_service_interface(t_service* tservice) {
 
     // if we're using WCF, add the corresponding attributes
     if (wcf_) {
-      indent(f_service_) << "[OperationContract]" << endl;
+      indent(f_service_) << "[System.ServiceModel.OperationContract]" << endl;
 
       const std::vector<t_field*>& xceptions = 
(*f_iter)->get_xceptions()->get_members();
       vector<t_field*>::const_iterator x_iter;
       for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter) {
-        indent(f_service_) << "[FaultContract(typeof("
+        indent(f_service_) << "[System.ServiceModel.FaultContract(typeof("
           + type_name((*x_iter)->get_type(), false, false) + "Fault))]" << 
endl;
       }
     }
@@ -1552,7 +1555,7 @@ void 
t_csharp_generator::generate_combined_service_interface(t_service* tservice
   generate_csharp_doc(f_service_, tservice);
 
   if (wcf_) {
-    indent(f_service_) << "[ServiceContract(Namespace=\"" << wcf_namespace_ << 
"\")]" << endl;
+    indent(f_service_) << "[System.ServiceModel.ServiceContract(Namespace=\"" 
<< wcf_namespace_ << "\")]" << endl;
   }
 
   indent(f_service_) << "public interface Iface" << extends_iface << " {" << 
endl;

Reply via email to