aboutsummaryrefslogtreecommitdiff
path: root/src/google/protobuf/compiler/ruby/ruby_generator.cc
diff options
context:
space:
mode:
authorChris Fallin <cfallin@google.com>2015-01-14 14:56:17 -0800
committerChris Fallin <cfallin@google.com>2015-01-14 14:56:17 -0800
commit7c4bbf07a5eee1fd4f5c2d60be32b95c35b0ed1d (patch)
tree9d369f66d408f3d0b58ef74e95bb9a0c40b6296f /src/google/protobuf/compiler/ruby/ruby_generator.cc
parentfcd8889d5b68be6ca7d1df705ad2159777e2f379 (diff)
downloadprotobuf-7c4bbf07a5eee1fd4f5c2d60be32b95c35b0ed1d.tar.gz
protobuf-7c4bbf07a5eee1fd4f5c2d60be32b95c35b0ed1d.tar.bz2
protobuf-7c4bbf07a5eee1fd4f5c2d60be32b95c35b0ed1d.zip
Support oneofs in the Ruby code generator.
Diffstat (limited to 'src/google/protobuf/compiler/ruby/ruby_generator.cc')
-rw-r--r--src/google/protobuf/compiler/ruby/ruby_generator.cc64
1 files changed, 46 insertions, 18 deletions
diff --git a/src/google/protobuf/compiler/ruby/ruby_generator.cc b/src/google/protobuf/compiler/ruby/ruby_generator.cc
index c5687903..3101c524 100644
--- a/src/google/protobuf/compiler/ruby/ruby_generator.cc
+++ b/src/google/protobuf/compiler/ruby/ruby_generator.cc
@@ -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");