diff options
author | Jens Geyer <jensg@apache.org> | 2020-07-15 23:46:23 +0200 |
---|---|---|
committer | Jens Geyer <jensg@apache.org> | 2020-07-16 08:51:36 +0200 |
commit | 23c8e52fa0708c53f74958944ecf04b293d1db73 (patch) | |
tree | 2488715cb1d846e8c57a2b8629beac2761dd203c | |
parent | 363ee0001f45118067249ed75ddc348195bf5734 (diff) | |
download | thrift-23c8e52fa0708c53f74958944ecf04b293d1db73.tar.gz |
THRIFT-5254 Member name cannot be Isset (unless it is an "required" member)
Client: netstd
Patch: Jens Geyer
This closes #2203
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) } |