Skip to content

Commit e29a213

Browse files
authored
[struct_pb] add namespace and nested message generator (#843)
1 parent 73577fe commit e29a213

File tree

3 files changed

+27
-3
lines changed

3 files changed

+27
-3
lines changed

src/struct_pb/tools/proto_to_struct.cpp

+18-1
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ class struct_code_generator : public google::protobuf::compiler::CodeGenerator {
4949

5050
auto output = context->Open(filename);
5151

52+
std::string package_name = file->package();
53+
5254
bool enable_optional = false;
5355
bool enable_inherit = false;
5456

@@ -65,10 +67,21 @@ class struct_code_generator : public google::protobuf::compiler::CodeGenerator {
6567

6668
std::vector<struct_tokenizer> proto_module_info;
6769
std::vector<struct_enum> proto_enum_info;
70+
6871
for (int i = 0; i < file->message_type_count(); ++i) {
6972
// struct name
7073
const google::protobuf::Descriptor* descriptor = file->message_type(i);
7174

75+
for (int k = 0; k < descriptor->nested_type_count(); ++k) {
76+
struct_tokenizer tokenizer_nested;
77+
tokenizer_nested.clear();
78+
79+
const google::protobuf::Descriptor* nested_type =
80+
descriptor->nested_type(k);
81+
tokenizer_nested.tokenizer(nested_type);
82+
proto_module_info.emplace_back(tokenizer_nested);
83+
}
84+
7285
struct_enum enum_token;
7386
enum_token.clear();
7487
enum_token.get_enum_fields(descriptor);
@@ -80,7 +93,7 @@ class struct_code_generator : public google::protobuf::compiler::CodeGenerator {
8093
proto_module_info.emplace_back(tokenizer);
8194
}
8295

83-
std::string struct_header = code_generate_header();
96+
std::string struct_header = code_generate_header(package_name);
8497
write_to_output(zero_copy_output, (const void*)struct_header.c_str(),
8598
struct_header.size());
8699

@@ -122,6 +135,10 @@ class struct_code_generator : public google::protobuf::compiler::CodeGenerator {
122135
write_to_output(zero_copy_output, (const void*)struct_macro_str.c_str(),
123136
struct_macro_str.size());
124137
}
138+
std::string namespace_last_part = "";
139+
namespace_last_part = code_generate_last_part();
140+
write_to_output(zero_copy_output, (const void*)namespace_last_part.c_str(),
141+
namespace_last_part.size());
125142

126143
delete zero_copy_output;
127144
return true;

src/struct_pb/tools/struct_code_generator.hpp

+8-2
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,12 @@
55

66
char parameter_value[27] = "abcdefghijklmnopqrstuvwxyz";
77

8-
std::string code_generate_header() {
8+
std::string code_generate_header(const std::string &package_name) {
99
std::string result = "#pragma once\n#include <ylt/struct_pb.hpp>\n\n";
10+
11+
result.append("namespace ");
12+
result.append(package_name);
13+
result.append(" {\n\n");
1014
return result;
1115
}
1216

@@ -263,4 +267,6 @@ std::string code_generate_enum(const struct_enum &enum_inst) {
263267
result.append("};\n\n");
264268
}
265269
return result;
266-
}
270+
}
271+
272+
std::string code_generate_last_part() { return "}"; }

src/struct_pb/tools/struct_token.hpp

+1
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ class struct_tokenizer {
4343
for (int j = 0; j < descriptor->field_count(); ++j) {
4444
struct_token token = {};
4545
const google::protobuf::FieldDescriptor* field = descriptor->field(j);
46+
4647
token.var_name = field->name();
4748
if (field->type() == google::protobuf::FieldDescriptor::TYPE_MESSAGE) {
4849
token.type_name = field->message_type()->name();

0 commit comments

Comments
 (0)