|
|
|
@ -100,6 +100,45 @@ std::string TypeName(const google::protobuf::FieldDescriptor* field) { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void GenerateField(const google::protobuf::FieldDescriptor* field, |
|
|
|
|
google::protobuf::io::Printer* printer) { |
|
|
|
|
printer->Print( |
|
|
|
|
"$label$ :$name$, ", |
|
|
|
|
"label", LabelForField(field), |
|
|
|
|
"name", field->name()); |
|
|
|
|
printer->Print( |
|
|
|
|
":$type$, $number$", |
|
|
|
|
"type", TypeName(field), |
|
|
|
|
"number", IntToString(field->number())); |
|
|
|
|
if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { |
|
|
|
|
printer->Print( |
|
|
|
|
", \"$subtype$\"\n", |
|
|
|
|
"subtype", field->message_type()->full_name()); |
|
|
|
|
} else if (field->cpp_type() == FieldDescriptor::CPPTYPE_ENUM) { |
|
|
|
|
printer->Print( |
|
|
|
|
", \"$subtype$\"\n", |
|
|
|
|
"subtype", field->enum_type()->full_name()); |
|
|
|
|
} else { |
|
|
|
|
printer->Print("\n"); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void GenerateOneof(const google::protobuf::OneofDescriptor* oneof, |
|
|
|
|
google::protobuf::io::Printer* printer) { |
|
|
|
|
printer->Print( |
|
|
|
|
"oneof :$name$ do\n", |
|
|
|
|
"name", oneof->name()); |
|
|
|
|
printer->Indent(); |
|
|
|
|
|
|
|
|
|
for (int i = 0; i < oneof->field_count(); i++) { |
|
|
|
|
const FieldDescriptor* field = oneof->field(i); |
|
|
|
|
GenerateField(field, printer); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
printer->Outdent(); |
|
|
|
|
printer->Print("end\n"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void GenerateMessage(const google::protobuf::Descriptor* message, |
|
|
|
|
google::protobuf::io::Printer* printer) { |
|
|
|
|
printer->Print( |
|
|
|
@ -109,27 +148,16 @@ void GenerateMessage(const google::protobuf::Descriptor* message, |
|
|
|
|
|
|
|
|
|
for (int i = 0; i < message->field_count(); i++) { |
|
|
|
|
const FieldDescriptor* field = message->field(i); |
|
|
|
|
printer->Print( |
|
|
|
|
"$label$ :$name$, ", |
|
|
|
|
"label", LabelForField(field), |
|
|
|
|
"name", field->name()); |
|
|
|
|
printer->Print( |
|
|
|
|
":$type$, $number$", |
|
|
|
|
"type", TypeName(field), |
|
|
|
|
"number", IntToString(field->number())); |
|
|
|
|
if (field->cpp_type() == FieldDescriptor::CPPTYPE_MESSAGE) { |
|
|
|
|
printer->Print( |
|
|
|
|
", \"$subtype$\"\n", |
|
|
|
|
"subtype", field->message_type()->full_name()); |
|
|
|
|
} else if (field->cpp_type() == FieldDescriptor::CPPTYPE_ENUM) { |
|
|
|
|
printer->Print( |
|
|
|
|
", \"$subtype$\"\n", |
|
|
|
|
"subtype", field->enum_type()->full_name()); |
|
|
|
|
} else { |
|
|
|
|
printer->Print("\n"); |
|
|
|
|
if (!field->containing_oneof()) { |
|
|
|
|
GenerateField(field, printer); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
for (int i = 0; i < message->oneof_decl_count(); i++) { |
|
|
|
|
const OneofDescriptor* oneof = message->oneof_decl(i); |
|
|
|
|
GenerateOneof(oneof, printer); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
printer->Outdent(); |
|
|
|
|
printer->Print("end\n"); |
|
|
|
|
|
|
|
|
|