diff options
author | Allen George <allengeorge@apache.org> | 2019-09-23 08:41:30 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-09-23 08:41:30 -0400 |
commit | 786c019476dd5508c53314cf3b25c47fe3ec2ae8 (patch) | |
tree | c2fee615d9dc5352e0ac3ce1d8428f925597fb2c | |
parent | 2d03630b618a105ae71ee73c008ac361334789c6 (diff) | |
parent | 236032a8af4f772a21962d6e5316e6f7aa494b85 (diff) | |
download | thrift-786c019476dd5508c53314cf3b25c47fe3ec2ae8.tar.gz |
Merge pull request #1870 from dbcfd/thrift-4953
THRIFT-4953: Missing Field Identifiers
-rw-r--r-- | compiler/cpp/src/thrift/generate/t_rs_generator.cc | 27 | ||||
-rw-r--r-- | lib/rs/test/Makefile.am | 1 | ||||
-rw-r--r-- | test/Identifiers.thrift | 6 |
3 files changed, 28 insertions, 6 deletions
diff --git a/compiler/cpp/src/thrift/generate/t_rs_generator.cc b/compiler/cpp/src/thrift/generate/t_rs_generator.cc index 77ee906c7..70e18472c 100644 --- a/compiler/cpp/src/thrift/generate/t_rs_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_rs_generator.cc @@ -516,6 +516,10 @@ private: // Replace all instances of `search_string` with `replace_string` in `target`. void string_replace(string& target, const string& search_string, const string& replace_string); + + // Adjust field identifier to correctly handle unspecified field identifiers + // THRIFT-4953 + string rust_safe_field_id(int32_t id); }; void t_rs_generator::init_generator() { @@ -1172,8 +1176,8 @@ void t_rs_generator::render_struct_constructor( generic_type_parameters << ", "; generic_type_qualifiers << ", "; } - generic_type_parameters << "F" << member->get_key(); - generic_type_qualifiers << "F" << member->get_key() << ": Into<Option<" << to_rust_type(member->get_type()) << ">>"; + generic_type_parameters << "F" << rust_safe_field_id(member->get_key()); + generic_type_qualifiers << "F" << rust_safe_field_id(member->get_key()) << ": Into<Option<" << to_rust_type(member->get_type()) << ">>"; } } @@ -1204,7 +1208,7 @@ void t_rs_generator::render_struct_constructor( } if (is_optional(member_req)) { - args << member_name << ": " << "F" << member->get_key(); + args << member_name << ": " << "F" << rust_safe_field_id(member->get_key()); } else { args << member_name << ": " << to_rust_type(member->get_type()); } @@ -1720,7 +1724,7 @@ void t_rs_generator::render_struct_sync_read( for (members_iter = members.begin(); members_iter != members.end(); ++members_iter) { t_field* tfield = (*members_iter); - f_gen_ << indent() << tfield->get_key() << " => {" << endl; + f_gen_ << indent() << rust_safe_field_id(tfield->get_key()) << " => {" << endl; indent_up(); render_type_sync_read("val", tfield->get_type()); f_gen_ << indent() << struct_field_read_temp_variable(tfield) << " = Some(val);" << endl; @@ -1830,7 +1834,7 @@ void t_rs_generator::render_union_sync_read(const string &union_name, t_struct * vector<t_field*>::const_iterator members_iter; for (members_iter = members.begin(); members_iter != members.end(); ++members_iter) { t_field* member = (*members_iter); - f_gen_ << indent() << member->get_key() << " => {" << endl; + f_gen_ << indent() << rust_safe_field_id(member->get_key()) << " => {" << endl; indent_up(); render_type_sync_read("val", member->get_type()); f_gen_ << indent() << "if ret.is_none() {" << endl; @@ -2034,7 +2038,7 @@ void t_rs_generator::render_map_sync_read(t_map *tmap, const string &map_var) { string t_rs_generator::struct_field_read_temp_variable(t_field* tfield) { std::ostringstream foss; - foss << "f_" << tfield->get_key(); + foss << "f_" << rust_safe_field_id(tfield->get_key()); return foss.str(); } @@ -3314,6 +3318,17 @@ string t_rs_generator::rust_camel_case(const string& name) { return str; } +string t_rs_generator::rust_safe_field_id(int32_t id) { + string id_str = std::to_string(abs(id)); + if (id >= 0) { + return id_str; + } else { + string str("neg"); + str += id_str; + return str; + } +} + void t_rs_generator::string_replace(string& target, const string& search_string, const string& replace_string) { if (target.empty()) { return; diff --git a/lib/rs/test/Makefile.am b/lib/rs/test/Makefile.am index 8edd756bf..486188cfe 100644 --- a/lib/rs/test/Makefile.am +++ b/lib/rs/test/Makefile.am @@ -25,6 +25,7 @@ stubs: thrifts/Base_One.thrift thrifts/Base_Two.thrift thrifts/Midlayer.thrift t $(THRIFT) -I ./thrifts -out src --gen rs thrifts/Midlayer.thrift $(THRIFT) -I ./thrifts -out src --gen rs thrifts/Ultimate.thrift $(THRIFT) -out src --gen rs $(top_builddir)/test/Recursive.thrift + $(THRIFT) -out src --gen rs $(top_builddir)/test/Identifiers.thrift #THRIFT-4953 check: stubs $(CARGO) build diff --git a/test/Identifiers.thrift b/test/Identifiers.thrift new file mode 100644 index 000000000..aa3e4eac5 --- /dev/null +++ b/test/Identifiers.thrift @@ -0,0 +1,6 @@ +// THRIFT-4953 +struct NoFieldIdentifiersTest { + string field_without_id1, + string field_without_id2, + 1: string field_with_id +}
\ No newline at end of file |