From: Jens Geyer Date: Mon, 4 Nov 2013 23:49:10 +0000 (+0100) Subject: THRIFT-2246 Unset enum value is printed by ToString() - fix for some edge cases X-Git-Url: https://source.supwisdom.com/gerrit/gitweb?a=commitdiff_plain;h=0ec155e1608c2909183b7c5e0b08a4a80579b4bd;p=common%2Fthrift.git THRIFT-2246 Unset enum value is printed by ToString() - fix for some edge cases Patch: Jens Geyer --- diff --git a/compiler/cpp/src/generate/t_csharp_generator.cc b/compiler/cpp/src/generate/t_csharp_generator.cc index be204962..baa229e1 100644 --- a/compiler/cpp/src/generate/t_csharp_generator.cc +++ b/compiler/cpp/src/generate/t_csharp_generator.cc @@ -922,7 +922,15 @@ void t_csharp_generator::generate_csharp_struct_tostring(ofstream& out, t_struct const vector& fields = tstruct->get_members(); vector::const_iterator f_iter; - indent(out) << "bool __first = true;" << endl; + bool useFirstFlag = false; + for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { + if( ! field_is_required((*f_iter))) { + indent(out) << "bool __first = true;" << endl; + useFirstFlag = true; + } + break; + } + bool had_required = false; // set to true after first required field has been processed for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { @@ -944,17 +952,17 @@ void t_csharp_generator::generate_csharp_struct_tostring(ofstream& out, t_struct } } - if( ! had_required) { + if( useFirstFlag && (! had_required)) { indent(out) << "if(!__first) { __sb.Append(\", \"); }" << endl; - if( ! is_required) { + if( ! is_required) { indent(out) << "__first = false;" << endl; - } + } indent(out) << "__sb.Append(\"" << prop_name((*f_iter)) << ": \");" << endl; } else { indent(out) << "__sb.Append(\", " << prop_name((*f_iter)) << ": \");" << endl; - } + } t_type* ttype = (*f_iter)->get_type(); diff --git a/compiler/cpp/src/generate/t_delphi_generator.cc b/compiler/cpp/src/generate/t_delphi_generator.cc index 9a865667..954735a3 100644 --- a/compiler/cpp/src/generate/t_delphi_generator.cc +++ b/compiler/cpp/src/generate/t_delphi_generator.cc @@ -3167,12 +3167,20 @@ void t_delphi_generator::generate_delphi_struct_tostring_impl(ostream& out, stri string tmp_sb = "__sb"; string tmp_first = "__first"; + bool useFirstFlag = false; indent_impl(out) << "function " << cls_prefix << cls_nm << ".ToString: string;" << endl; indent_impl(out) << "var" << endl; indent_up_impl(); indent_impl(out) << tmp_sb << " : TThriftStringBuilder;" << endl; - indent_impl(out) << tmp_first << " : Boolean;" << endl; + for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { + bool is_optional = ((*f_iter)->get_req() != t_field::T_REQUIRED); + if( is_optional) { + indent_impl(out) << tmp_first << " : Boolean;" << endl; + useFirstFlag = true; + } + break; + } indent_down_impl(); indent_impl(out) << "begin" << endl; indent_up_impl(); @@ -3181,7 +3189,10 @@ void t_delphi_generator::generate_delphi_struct_tostring_impl(ostream& out, stri indent_impl(out) << "try" << endl; indent_up_impl(); - indent_impl(out) << tmp_first << " := TRUE;" << endl; + if( useFirstFlag) { + indent_impl(out) << tmp_first << " := TRUE;" << endl; + } + bool had_required = false; // set to true after first required field has been processed for (f_iter = fields.begin(); f_iter != fields.end(); ++f_iter) { @@ -3201,9 +3212,9 @@ void t_delphi_generator::generate_delphi_struct_tostring_impl(ostream& out, stri } } - if( ! had_required) { - indent_impl(out) << "if not " << tmp_first << " then " << tmp_sb << ".Append(',');" << endl; - if (is_optional) { + if( useFirstFlag && (! had_required)) { + indent_impl(out) << "if not " << tmp_first << " then " << tmp_sb << ".Append(',');" << endl; + if (is_optional) { indent_impl(out) << tmp_first << " := FALSE;" << endl; } indent_impl(out) << @@ -3212,7 +3223,7 @@ void t_delphi_generator::generate_delphi_struct_tostring_impl(ostream& out, stri indent_impl(out) << tmp_sb << ".Append(', " << prop_name((*f_iter), is_exception) << ": ');" << endl; } - + t_type* ttype = (*f_iter)->get_type(); if (ttype->is_xception() || ttype->is_struct()) { @@ -3225,12 +3236,12 @@ void t_delphi_generator::generate_delphi_struct_tostring_impl(ostream& out, stri indent_impl(out) << tmp_sb << ".Append(" << prop_name((*f_iter), is_exception) << ");" << endl; } - + if (null_allowed || is_optional) { indent_down_impl(); indent_impl(out) << "end;" << endl; } - + if (!is_optional) { had_required = true; // now __first must be false, so we don't need to check it anymore } @@ -3240,8 +3251,10 @@ void t_delphi_generator::generate_delphi_struct_tostring_impl(ostream& out, stri tmp_sb << ".Append(')');" << endl; indent_impl(out) << "Result := " << tmp_sb << ".ToString;" << endl; - indent_impl(out) << - "if " << tmp_first << " then {prevent warning};" << endl; + if( useFirstFlag) { + indent_impl(out) << + "if " << tmp_first << " then {prevent warning};" << endl; + } indent_down_impl(); indent_impl(out) << "finally" << endl;