| Index: third_party/protobuf/ruby/src/main/java/com/google/protobuf/jruby/RubyOneofDescriptor.java
|
| diff --git a/third_party/protobuf/ruby/src/main/java/com/google/protobuf/jruby/RubyOneofDescriptor.java b/third_party/protobuf/ruby/src/main/java/com/google/protobuf/jruby/RubyOneofDescriptor.java
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..cc4ab662846c489b06b88d23ac8868c7d674cc2a
|
| --- /dev/null
|
| +++ b/third_party/protobuf/ruby/src/main/java/com/google/protobuf/jruby/RubyOneofDescriptor.java
|
| @@ -0,0 +1,124 @@
|
| +package com.google.protobuf.jruby;
|
| +
|
| +import com.google.protobuf.DescriptorProtos;
|
| +import com.google.protobuf.Descriptors;
|
| +import org.jruby.Ruby;
|
| +import org.jruby.RubyClass;
|
| +import org.jruby.RubyModule;
|
| +import org.jruby.RubyObject;
|
| +import org.jruby.anno.JRubyClass;
|
| +import org.jruby.anno.JRubyMethod;
|
| +import org.jruby.runtime.Block;
|
| +import org.jruby.runtime.ObjectAllocator;
|
| +import org.jruby.runtime.ThreadContext;
|
| +import org.jruby.runtime.builtin.IRubyObject;
|
| +
|
| +import java.util.*;
|
| +
|
| +@JRubyClass(name = "OneofDescriptor", include = "Enumerable")
|
| +public class RubyOneofDescriptor extends RubyObject {
|
| +
|
| + public static void createRubyOneofDescriptor(Ruby runtime) {
|
| + RubyModule protobuf = runtime.getClassFromPath("Google::Protobuf");
|
| + RubyClass cRubyOneofDescriptor = protobuf.defineClassUnder("OneofDescriptor", runtime.getObject(), new ObjectAllocator() {
|
| + @Override
|
| + public IRubyObject allocate(Ruby ruby, RubyClass rubyClass) {
|
| + return new RubyOneofDescriptor(ruby, rubyClass);
|
| + }
|
| + });
|
| + cRubyOneofDescriptor.defineAnnotatedMethods(RubyOneofDescriptor.class);
|
| + cRubyOneofDescriptor.includeModule(runtime.getEnumerable());
|
| + }
|
| +
|
| + public RubyOneofDescriptor(Ruby ruby, RubyClass rubyClass) {
|
| + super(ruby, rubyClass);
|
| + }
|
| +
|
| + @JRubyMethod
|
| + public IRubyObject initialize(ThreadContext context) {
|
| + builder = DescriptorProtos.OneofDescriptorProto.newBuilder();
|
| + fields = new ArrayList<RubyFieldDescriptor>();
|
| + return this;
|
| + }
|
| +
|
| + /*
|
| + * call-seq:
|
| + * OneofDescriptor.name => name
|
| + *
|
| + * Returns the name of this oneof.
|
| + */
|
| + @JRubyMethod(name = "name")
|
| + public IRubyObject getName(ThreadContext context) {
|
| + return name;
|
| + }
|
| +
|
| + /*
|
| + * call-seq:
|
| + * OneofDescriptor.name = name
|
| + *
|
| + * Sets a new name for this oneof. The oneof must not have been added to a
|
| + * message descriptor yet.
|
| + */
|
| + @JRubyMethod(name = "name=")
|
| + public IRubyObject setName(ThreadContext context, IRubyObject name) {
|
| + this.name = context.runtime.newString(name.asJavaString());
|
| + this.builder.setName(name.asJavaString());
|
| + return context.runtime.getNil();
|
| + }
|
| +
|
| + /*
|
| + * call-seq:
|
| + * OneofDescriptor.add_field(field) => nil
|
| + *
|
| + * Adds a field to this oneof. The field may have been added to this oneof in
|
| + * the past, or the message to which this oneof belongs (if any), but may not
|
| + * have already been added to any other oneof or message. Otherwise, an
|
| + * exception is raised.
|
| + *
|
| + * All fields added to the oneof via this method will be automatically added to
|
| + * the message to which this oneof belongs, if it belongs to one currently, or
|
| + * else will be added to any message to which the oneof is later added at the
|
| + * time that it is added.
|
| + */
|
| + @JRubyMethod(name = "add_field")
|
| + public IRubyObject addField(ThreadContext context, IRubyObject obj) {
|
| + RubyFieldDescriptor fieldDescriptor = (RubyFieldDescriptor) obj;
|
| + fieldDescriptor.setOneofName(this.name);
|
| + fields.add(fieldDescriptor);
|
| + return context.runtime.getNil();
|
| + }
|
| +
|
| + /*
|
| + * call-seq:
|
| + * OneofDescriptor.each(&block) => nil
|
| + *
|
| + * Iterates through fields in this oneof, yielding to the block on each one.
|
| + */
|
| + @JRubyMethod
|
| + public IRubyObject each(ThreadContext context, Block block) {
|
| + for (RubyFieldDescriptor field : fields) {
|
| + block.yieldSpecific(context, field);
|
| + }
|
| + return context.runtime.getNil();
|
| + }
|
| +
|
| + public DescriptorProtos.OneofDescriptorProto build(int index) {
|
| + for (RubyFieldDescriptor field: fields) {
|
| + field.setOneofIndex(index);
|
| + }
|
| + return this.builder.build();
|
| + }
|
| +
|
| + protected Collection<RubyFieldDescriptor> getFields() {
|
| + return fields;
|
| + }
|
| +
|
| + protected Descriptors.OneofDescriptor getOneofDescriptor() {
|
| + RubyFieldDescriptor fieldDescriptor = fields.get(0);
|
| + return fieldDescriptor.getFieldDef().getContainingOneof();
|
| + }
|
| +
|
| + private IRubyObject name;
|
| + private DescriptorProtos.OneofDescriptorProto.Builder builder;
|
| + private List<RubyFieldDescriptor> fields;
|
| +}
|
|
|