summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJens Geyer <jensg@apache.org>2020-07-15 23:46:23 +0200
committerJens Geyer <jensg@apache.org>2020-07-16 08:51:36 +0200
commit23c8e52fa0708c53f74958944ecf04b293d1db73 (patch)
tree2488715cb1d846e8c57a2b8629beac2761dd203c
parent363ee0001f45118067249ed75ddc348195bf5734 (diff)
downloadthrift-23c8e52fa0708c53f74958944ecf04b293d1db73.tar.gz
THRIFT-5254 Member name cannot be Isset (unless it is an "required" member)
Client: netstd Patch: Jens Geyer This closes #2203
-rw-r--r--compiler/cpp/src/thrift/generate/t_netstd_generator.cc31
-rw-r--r--compiler/cpp/src/thrift/generate/t_netstd_generator.h1
-rw-r--r--lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift5253.thrift9
3 files changed, 24 insertions, 17 deletions
diff --git a/compiler/cpp/src/thrift/generate/t_netstd_generator.cc b/compiler/cpp/src/thrift/generate/t_netstd_generator.cc
index fb8d65c52..f1198e5e6 100644
--- a/compiler/cpp/src/thrift/generate/t_netstd_generator.cc
+++ b/compiler/cpp/src/thrift/generate/t_netstd_generator.cc
@@ -990,7 +990,7 @@ void t_netstd_generator::generate_netstd_struct_definition(ostream& out, t_struc
{
out << indent() << "[DataMember]" << endl;
}
- out << indent() << "public bool " << normalize_name((*m_iter)->get_name()) << ";" << endl;
+ out << indent() << "public bool " << get_isset_name(normalize_name((*m_iter)->get_name())) << ";" << endl;
}
}
@@ -1011,7 +1011,7 @@ void t_netstd_generator::generate_netstd_struct_definition(ostream& out, t_struc
out << indent() << "public bool ShouldSerialize" << prop_name(*m_iter) << "()" << endl
<< indent() << "{" << endl;
indent_up();
- out << indent() << "return __isset." << normalize_name((*m_iter)->get_name()) << ";" << endl;
+ out << indent() << "return __isset." << get_isset_name(normalize_name((*m_iter)->get_name())) << ";" << endl;
indent_down();
out << indent() << "}" << endl << endl;
}
@@ -1041,7 +1041,7 @@ void t_netstd_generator::generate_netstd_struct_definition(ostream& out, t_struc
{
print_const_value(out, "this._" + (*m_iter)->get_name(), t, (*m_iter)->get_value(), true, true);
// Optionals with defaults are marked set
- out << indent() << "this.__isset." << normalize_name((*m_iter)->get_name()) << " = true;" << endl;
+ out << indent() << "this.__isset." << get_isset_name(normalize_name((*m_iter)->get_name())) << " = true;" << endl;
}
}
}
@@ -1184,8 +1184,8 @@ void t_netstd_generator::generate_netstd_deepcopy_method(ostream& out, t_struct*
generate_null_check_end( out, *m_iter);
if( !is_required) {
- out << indent() << tmp_instance << ".__isset." << normalize_name((*m_iter)->get_name())
- << " = this.__isset." << normalize_name((*m_iter)->get_name()) << ";" << endl;
+ out << indent() << tmp_instance << ".__isset." << get_isset_name(normalize_name((*m_iter)->get_name()))
+ << " = this.__isset." << get_isset_name(normalize_name((*m_iter)->get_name())) << ";" << endl;
}
}
@@ -1317,7 +1317,7 @@ void t_netstd_generator::generate_null_check_begin(ostream& out, t_field* tfield
if( !first) {
out << " && ";
}
- out << "__isset." << normalize_name(tfield->get_name());
+ out << "__isset." << get_isset_name(normalize_name(tfield->get_name()));
}
out << ")" << endl
@@ -1421,7 +1421,7 @@ void t_netstd_generator::generate_netstd_struct_result_writer(ostream& out, t_st
out << indent() << "else if";
}
- out << "(this.__isset." << normalize_name((*f_iter)->get_name()) << ")" << endl
+ out << "(this.__isset." << get_isset_name(normalize_name((*f_iter)->get_name())) << ")" << endl
<< indent() << "{" << endl;
indent_up();
@@ -1802,9 +1802,9 @@ void t_netstd_generator::generate_netstd_struct_equals(ostream& out, t_struct* t
}
if (!field_is_required((*f_iter)))
{
- out << "((__isset." << normalize_name((*f_iter)->get_name()) << " == other.__isset."
- << normalize_name((*f_iter)->get_name()) << ") && ((!__isset."
- << normalize_name((*f_iter)->get_name()) << ") || (";
+ out << "((__isset." << get_isset_name(normalize_name((*f_iter)->get_name())) << " == other.__isset."
+ << get_isset_name(normalize_name((*f_iter)->get_name())) << ") && ((!__isset."
+ << get_isset_name(normalize_name((*f_iter)->get_name())) << ") || (";
}
t_type* ttype = (*f_iter)->get_type();
if (ttype->is_container() || ttype->is_binary())
@@ -2082,7 +2082,7 @@ void t_netstd_generator::generate_service_client(ostream& out, t_service* tservi
vector<t_field*>::const_iterator x_iter;
for (x_iter = xceptions.begin(); x_iter != xceptions.end(); ++x_iter)
{
- out << indent() << "if (result.__isset." << normalize_name((*x_iter)->get_name()) << ")" << endl
+ out << indent() << "if (result.__isset." << get_isset_name(normalize_name((*x_iter)->get_name())) << ")" << endl
<< indent() << "{" << endl;
indent_up();
out << indent() << "throw result." << prop_name(*x_iter) << ";" << endl;
@@ -2910,7 +2910,7 @@ void t_netstd_generator::generate_netstd_property(ostream& out, t_field* tfield,
{
if (generateIsset)
{
- out << indent() << "__isset." << normalize_name(tfield->get_name()) << " = value.HasValue;" << endl;
+ out << indent() << "__isset." << get_isset_name(normalize_name(tfield->get_name())) << " = value.HasValue;" << endl;
}
out << indent() << "if (value.HasValue) this." << fieldPrefix + tfield->get_name() << " = value.Value;" << endl;
}
@@ -2918,7 +2918,7 @@ void t_netstd_generator::generate_netstd_property(ostream& out, t_field* tfield,
{
if (generateIsset)
{
- out << indent() << "__isset." << normalize_name(tfield->get_name()) << " = true;" << endl;
+ out << indent() << "__isset." << get_isset_name(normalize_name(tfield->get_name())) << " = true;" << endl;
}
out << indent() << "this." << fieldPrefix + tfield->get_name() << " = value;" << endl;
}
@@ -3068,6 +3068,11 @@ string t_netstd_generator::convert_to_pascal_case(const string& str) {
}
+string t_netstd_generator::get_isset_name(const string& str) {
+ return ("Isset" != str) ? str : str + "_";
+}
+
+
string t_netstd_generator::prop_name(t_field* tfield, bool suppress_mapping) {
string name(tfield->get_name());
if (suppress_mapping) {
diff --git a/compiler/cpp/src/thrift/generate/t_netstd_generator.h b/compiler/cpp/src/thrift/generate/t_netstd_generator.h
index 94ad1619b..1217cc828 100644
--- a/compiler/cpp/src/thrift/generate/t_netstd_generator.h
+++ b/compiler/cpp/src/thrift/generate/t_netstd_generator.h
@@ -166,6 +166,7 @@ private:
void prepare_member_name_mapping(void* scope, const vector<t_field*>& members, const string& structname);
void cleanup_member_name_mapping(void* scope);
string get_mapped_member_name(string oldname);
+ string get_isset_name(const string& str);
string get_deep_copy_method_call(t_type* ttype, bool& needs_typecast);
void collect_extensions_types(t_struct* tstruct);
void collect_extensions_types(t_type* ttype);
diff --git a/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift5253.thrift b/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift5253.thrift
index bf77302de..ee3df9b79 100644
--- a/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift5253.thrift
+++ b/lib/netstd/Tests/Thrift.PublicInterfaces.Compile.Tests/Thrift5253.thrift
@@ -32,14 +32,15 @@ struct AsyncProcessor { 1: optional i32 foo }
struct Client { 1: optional i32 foo }
struct IAsync { 1: optional i32 foo }
+struct ReservedMemberName { 1: optional i32 Isset }
service MyService{
BrokenResult Broken( 1 : BrokenArgs foo)
WorksRslt Works( 1 : WorksArrrgs foo)
- InternalStructs InternalStructs( 1: InternalStructs foo)
- AsyncProcessor AsyncProcessor ( 1: AsyncProcessor foo)
- Client Client ( 1: Client foo)
- IAsync IAsync ( 1: IAsync foo)
+ InternalStructs InternalStructs( 1: InternalStructs foo)
+ AsyncProcessor AsyncProcessor ( 1: AsyncProcessor foo)
+ Client Client ( 1: Client foo)
+ IAsync IAsync ( 1: IAsync foo)
}