THRIFT-5067 Invalid generated Cpp code from valid Thrift IDL with dots in file names for nested namespaces
Client: cpp
Patch: zeshuai007 <51382517@qq.com>
This closes #2060
diff --git a/compiler/cpp/src/thrift/generate/t_cpp_generator.cc b/compiler/cpp/src/thrift/generate/t_cpp_generator.cc
index 896c43f..372014d 100644
--- a/compiler/cpp/src/thrift/generate/t_cpp_generator.cc
+++ b/compiler/cpp/src/thrift/generate/t_cpp_generator.cc
@@ -299,6 +299,13 @@
std::string get_include_prefix(const t_program& program) const;
/**
+ * Returns the legal program name to use for a file generated by program, if the
+ * program name contains dots then replace it with underscores, otherwise return the
+ * original program name.
+ */
+ std::string get_legal_program_name(std::string program_name);
+
+ /**
* True if we should generate pure enums for Thrift enums, instead of wrapper classes.
*/
bool gen_pure_enums_;
@@ -386,6 +393,8 @@
// Make output directory
MKDIR(get_out_dir().c_str());
+ program_name_ = get_legal_program_name(program_name_);
+
// Make output file
string f_types_name = get_out_dir() + program_name_ + "_types.h";
f_types_.open(f_types_name);
@@ -4550,6 +4559,23 @@
return "";
}
+string t_cpp_generator::get_legal_program_name(std::string program_name)
+{
+ std::size_t found = 0;
+
+ while(true) {
+ found = program_name.find('.');
+
+ if(found != string::npos) {
+ program_name = program_name.replace(found, 1, "_");
+ } else {
+ break;
+ }
+ }
+
+ return program_name;
+}
+
THRIFT_REGISTER_GENERATOR(
cpp,
"C++",