aboutsummaryrefslogtreecommitdiff
path: root/csharp/src/ProtocolBuffers/Descriptors/MessageDescriptor.cs
diff options
context:
space:
mode:
authorJie Luo <jieluo@google.com>2015-05-29 12:48:25 -0700
committerJie Luo <jieluo@google.com>2015-05-29 13:29:30 -0700
commitf7b417ddfe63cb4d39775e5fd4560894cc547d65 (patch)
tree2ffb9956310e6aeb46078e7ad58db94d517f1d86 /csharp/src/ProtocolBuffers/Descriptors/MessageDescriptor.cs
parent55df12194f5f0348c3ddf0636c63ba2b3978fab5 (diff)
downloadprotobuf-f7b417ddfe63cb4d39775e5fd4560894cc547d65.tar.gz
protobuf-f7b417ddfe63cb4d39775e5fd4560894cc547d65.tar.bz2
protobuf-f7b417ddfe63cb4d39775e5fd4560894cc547d65.zip
Add oneof support for C#
Diffstat (limited to 'csharp/src/ProtocolBuffers/Descriptors/MessageDescriptor.cs')
-rw-r--r--csharp/src/ProtocolBuffers/Descriptors/MessageDescriptor.cs28
1 files changed, 28 insertions, 0 deletions
diff --git a/csharp/src/ProtocolBuffers/Descriptors/MessageDescriptor.cs b/csharp/src/ProtocolBuffers/Descriptors/MessageDescriptor.cs
index 5b29849c..c00711b9 100644
--- a/csharp/src/ProtocolBuffers/Descriptors/MessageDescriptor.cs
+++ b/csharp/src/ProtocolBuffers/Descriptors/MessageDescriptor.cs
@@ -45,6 +45,7 @@ namespace Google.ProtocolBuffers.Descriptors
private readonly IList<EnumDescriptor> enumTypes;
private readonly IList<FieldDescriptor> fields;
private readonly IList<FieldDescriptor> extensions;
+ private readonly IList<OneofDescriptor> oneofs;
private bool hasRequiredFields;
internal MessageDescriptor(DescriptorProto proto, FileDescriptor file, MessageDescriptor parent, int typeIndex)
@@ -52,6 +53,10 @@ namespace Google.ProtocolBuffers.Descriptors
{
containingType = parent;
+ oneofs = DescriptorUtil.ConvertAndMakeReadOnly(proto.OneofDeclList,
+ (oneof, index) =>
+ new OneofDescriptor(oneof, file, this, index));
+
nestedTypes = DescriptorUtil.ConvertAndMakeReadOnly(proto.NestedTypeList,
(type, index) =>
new MessageDescriptor(type, file, this, index));
@@ -69,6 +74,19 @@ namespace Google.ProtocolBuffers.Descriptors
(field, index) =>
new FieldDescriptor(field, file, this, index, true));
+ for (int i = 0; i < proto.OneofDeclCount; i++)
+ {
+ oneofs[i].fields = new FieldDescriptor[oneofs[i].FieldCount];
+ oneofs[i].fieldCount = 0;
+ }
+ for (int i = 0; i< proto.FieldCount; i++)
+ {
+ OneofDescriptor oneofDescriptor = fields[i].ContainingOneof;
+ if (oneofDescriptor != null)
+ {
+ oneofDescriptor.fields[oneofDescriptor.fieldCount++] = fields[i];
+ }
+ }
file.DescriptorPool.AddSymbol(this);
}
@@ -112,6 +130,11 @@ namespace Google.ProtocolBuffers.Descriptors
get { return enumTypes; }
}
+ public IList<OneofDescriptor> Oneofs
+ {
+ get { return oneofs; }
+ }
+
/// <summary>
/// Returns a pre-computed result as to whether this message
/// has required fields. This includes optional fields which are
@@ -189,6 +212,11 @@ namespace Google.ProtocolBuffers.Descriptors
{
extension.CrossLink();
}
+
+ foreach (OneofDescriptor oneof in oneofs)
+ {
+ // oneof.C
+ }
}
internal void CheckRequiredFields()