You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@thrift.apache.org by je...@apache.org on 2020/02/16 12:20:35 UTC

[thrift] 02/02: THRIFT-5095 ToString() should print entire structure, not just the top-level data Client: netstd Patch: Jens Geyer

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

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

commit 222362cc70d66b5f8bb6422622fcf384407b54c8
Author: Jens Geyer <je...@apache.org>
AuthorDate: Sun Feb 16 01:54:56 2020 +0100

    THRIFT-5095 ToString() should print entire structure, not just the top-level data
    Client: netstd
    Patch: Jens Geyer
    
    This closes #2009
---
 .../cpp/src/thrift/generate/t_netstd_generator.cc  | 10 +--
 lib/netstd/Thrift/Collections/ToStringExtension.cs | 82 ++++++++++++++++++++++
 2 files changed, 83 insertions(+), 9 deletions(-)

diff --git a/compiler/cpp/src/thrift/generate/t_netstd_generator.cc b/compiler/cpp/src/thrift/generate/t_netstd_generator.cc
index cc6287d..b2883ed 100644
--- a/compiler/cpp/src/thrift/generate/t_netstd_generator.cc
+++ b/compiler/cpp/src/thrift/generate/t_netstd_generator.cc
@@ -1251,15 +1251,7 @@ void t_netstd_generator::generate_netstd_struct_tostring(ostream& out, t_struct*
             out << indent() << "sb.Append(\", " << prop_name(*f_iter) << ": \");" << endl;
         }
 
-        t_type* ttype = (*f_iter)->get_type();
-        if (ttype->is_xception() || ttype->is_struct())
-        {
-            out << indent() << "sb.Append(" << prop_name(*f_iter) << "== null ? \"<null>\" : " << prop_name(*f_iter) << ".ToString());" << endl;
-        }
-        else
-        {
-            out << indent() << "sb.Append(" << prop_name(*f_iter) << ");" << endl;
-        }
+        out << indent() << prop_name(*f_iter) << ".ToString(sb);" << endl;
 
         if (!is_required)
         {
diff --git a/lib/netstd/Thrift/Collections/ToStringExtension.cs b/lib/netstd/Thrift/Collections/ToStringExtension.cs
new file mode 100644
index 0000000..40dd9dd
--- /dev/null
+++ b/lib/netstd/Thrift/Collections/ToStringExtension.cs
@@ -0,0 +1,82 @@
+// Licensed to the Apache Software Foundation(ASF) under one
+// or more contributor license agreements.See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+// 
+//     http://www.apache.org/licenses/LICENSE-2.0
+// 
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Text;
+using Thrift.Protocol;
+
+namespace Thrift.Collections
+{
+
+
+    public static class ToStringExtensions
+    {
+        public static void ToString(this object self, StringBuilder sb, bool first = true)
+        {
+            if (!first)
+                sb.Append(", ");
+
+            bool first_child = true;
+            if (self is string) // string is IEnumerable
+            {
+                sb.Append('"');
+                sb.Append(self);
+                sb.Append('"');
+            }
+            else if (self is IDictionary)
+            {
+                sb.Append("{ ");
+                foreach (DictionaryEntry pair in (self as IDictionary))
+                {
+                    if (first_child)
+                        first_child = false;
+                    else
+                        sb.Append(",");
+
+                    sb.Append("{ ");
+                    pair.Key.ToString(sb);
+                    sb.Append(", ");
+                    pair.Value.ToString(sb);
+                    sb.Append("}");
+                }
+                sb.Append("}");
+            }
+            else if (self is IEnumerable)
+            {
+                sb.Append("{ ");
+                foreach (var elm in (self as IEnumerable))
+                {
+                    elm.ToString(sb, first_child);
+                    first_child = false;
+                }
+                sb.Append("}");
+            }
+            else if (self is TBase)
+            {
+                sb.Append((self as TBase).ToString());
+            }
+            else
+            {
+                sb.Append(self.ToString());
+            }
+        }
+    }
+
+
+}