diff options
author | Jon Skeet <jonskeet@google.com> | 2018-08-30 14:53:06 +0100 |
---|---|---|
committer | Jon Skeet <skeet@pobox.com> | 2018-09-22 09:09:15 +0100 |
commit | 1711999078ca1d435de3958bf963e95a742e972f (patch) | |
tree | 6ea6797a824da7cf26b2535ea4e3a9be9cd5ec95 /csharp/src/Google.Protobuf/Reflection/MessageDescriptor.cs | |
parent | a6e1cc7e328c45a0cb9856c530c8f6cd23314163 (diff) | |
download | protobuf-1711999078ca1d435de3958bf963e95a742e972f.tar.gz protobuf-1711999078ca1d435de3958bf963e95a742e972f.tar.bz2 protobuf-1711999078ca1d435de3958bf963e95a742e972f.zip |
Provide simple access to descriptor declarations in C#
This is primarily for access to comments, which would be expected to be available in a protoc plugin.
The implementation has two fiddly aspects:
- We use a Lazy<T> to avoid building the map before cross-linking. An alternative would be to crosslink at the end of the constructor, and remove the calls to CrossLink elsewhere. This would be generally better IMO, but deviate from the Java code.
- The casts to IReadOnlyList<DescriptorBase> are unfortunate. They'll always work, because these lists are always ReadOnlyCollection<T> for a descriptor type... but we can't use IList<DescriptorBase> as that's not covariant, and it's annoyingly fiddly to change the field to be of type ReadOnlyCollection<T>.
Diffstat (limited to 'csharp/src/Google.Protobuf/Reflection/MessageDescriptor.cs')
-rw-r--r-- | csharp/src/Google.Protobuf/Reflection/MessageDescriptor.cs | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/csharp/src/Google.Protobuf/Reflection/MessageDescriptor.cs b/csharp/src/Google.Protobuf/Reflection/MessageDescriptor.cs index dbb6768b..03fd63ce 100644 --- a/csharp/src/Google.Protobuf/Reflection/MessageDescriptor.cs +++ b/csharp/src/Google.Protobuf/Reflection/MessageDescriptor.cs @@ -115,6 +115,21 @@ namespace Google.Protobuf.Reflection /// </summary> public override string Name => Proto.Name; + internal override IReadOnlyList<DescriptorBase> GetNestedDescriptorListForField(int fieldNumber) + { + switch (fieldNumber) + { + case DescriptorProto.FieldFieldNumber: + return (IReadOnlyList<DescriptorBase>) fieldsInDeclarationOrder; + case DescriptorProto.NestedTypeFieldNumber: + return (IReadOnlyList<DescriptorBase>) NestedTypes; + case DescriptorProto.EnumTypeFieldNumber: + return (IReadOnlyList<DescriptorBase>) EnumTypes; + default: + return null; + } + } + internal DescriptorProto Proto { get; } /// <summary> |