aboutsummaryrefslogtreecommitdiff
path: root/src/google/protobuf/compiler/ruby/ruby_generator.cc
diff options
context:
space:
mode:
authorJoshua Haberman <jhaberman@gmail.com>2015-02-02 13:29:15 -0800
committerJoshua Haberman <jhaberman@gmail.com>2015-02-02 13:29:15 -0800
commit17e4419188e5873c43d462d493fcbb2cc668aa71 (patch)
tree467caa69558129b90c56ea9fd971ce51c496747d /src/google/protobuf/compiler/ruby/ruby_generator.cc
parent8ccaa42ffbe020f3d74ec90e954dd45a27ec32c6 (diff)
parenta3953da536751f2a77de0553b566bde5e8b5aa1e (diff)
downloadprotobuf-17e4419188e5873c43d462d493fcbb2cc668aa71.tar.gz
protobuf-17e4419188e5873c43d462d493fcbb2cc668aa71.tar.bz2
protobuf-17e4419188e5873c43d462d493fcbb2cc668aa71.zip
Merge pull request #168 from cfallin/ruby-oneof
Support oneofs in MRI Ruby C extension.
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");