220 lines
8.4 KiB
C#
220 lines
8.4 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Collections.ObjectModel;
|
|
using System.Linq;
|
|
using Google.Protobuf.Collections;
|
|
|
|
namespace Google.Protobuf.Reflection
|
|
{
|
|
// Token: 0x02000063 RID: 99
|
|
public sealed class MessageDescriptor : DescriptorBase
|
|
{
|
|
// Token: 0x060005C3 RID: 1475 RVA: 0x00014574 File Offset: 0x00012774
|
|
internal MessageDescriptor(DescriptorProto proto, FileDescriptor file, MessageDescriptor parent, int typeIndex, GeneratedClrTypeInfo generatedCodeInfo)
|
|
: base(file, file.ComputeFullName(parent, proto.Name), typeIndex)
|
|
{
|
|
MessageDescriptor <>4__this = this;
|
|
this.Proto = proto;
|
|
GeneratedClrTypeInfo generatedCodeInfo2 = generatedCodeInfo;
|
|
this.Parser = ((generatedCodeInfo2 != null) ? generatedCodeInfo2.Parser : null);
|
|
GeneratedClrTypeInfo generatedCodeInfo3 = generatedCodeInfo;
|
|
this.ClrType = ((generatedCodeInfo3 != null) ? generatedCodeInfo3.ClrType : null);
|
|
this.ContainingType = parent;
|
|
this.Oneofs = DescriptorUtil.ConvertAndMakeReadOnly<OneofDescriptorProto, OneofDescriptor>(proto.OneofDecl, (OneofDescriptorProto oneof, int index) => new OneofDescriptor(oneof, file, <>4__this, index, generatedCodeInfo.OneofNames[index]));
|
|
this.NestedTypes = DescriptorUtil.ConvertAndMakeReadOnly<DescriptorProto, MessageDescriptor>(proto.NestedType, (DescriptorProto type, int index) => new MessageDescriptor(type, file, <>4__this, index, generatedCodeInfo.NestedTypes[index]));
|
|
this.EnumTypes = DescriptorUtil.ConvertAndMakeReadOnly<EnumDescriptorProto, EnumDescriptor>(proto.EnumType, (EnumDescriptorProto type, int index) => new EnumDescriptor(type, file, <>4__this, index, generatedCodeInfo.NestedEnums[index]));
|
|
this.fieldsInDeclarationOrder = DescriptorUtil.ConvertAndMakeReadOnly<FieldDescriptorProto, FieldDescriptor>(proto.Field, delegate(FieldDescriptorProto field, int index)
|
|
{
|
|
FileDescriptor file2 = file;
|
|
MessageDescriptor <>4__this2 = <>4__this;
|
|
GeneratedClrTypeInfo generatedCodeInfo4 = generatedCodeInfo;
|
|
return new FieldDescriptor(field, file2, <>4__this2, index, (generatedCodeInfo4 != null) ? generatedCodeInfo4.PropertyNames[index] : null);
|
|
});
|
|
this.fieldsInNumberOrder = new ReadOnlyCollection<FieldDescriptor>(this.fieldsInDeclarationOrder.OrderBy((FieldDescriptor field) => field.FieldNumber).ToArray<FieldDescriptor>());
|
|
this.jsonFieldMap = MessageDescriptor.CreateJsonFieldMap(this.fieldsInNumberOrder);
|
|
file.DescriptorPool.AddSymbol(this);
|
|
this.Fields = new MessageDescriptor.FieldCollection(this);
|
|
}
|
|
|
|
// Token: 0x060005C4 RID: 1476 RVA: 0x000146D8 File Offset: 0x000128D8
|
|
private static ReadOnlyDictionary<string, FieldDescriptor> CreateJsonFieldMap(IList<FieldDescriptor> fields)
|
|
{
|
|
Dictionary<string, FieldDescriptor> dictionary = new Dictionary<string, FieldDescriptor>();
|
|
foreach (FieldDescriptor fieldDescriptor in fields)
|
|
{
|
|
dictionary[fieldDescriptor.Name] = fieldDescriptor;
|
|
dictionary[fieldDescriptor.JsonName] = fieldDescriptor;
|
|
}
|
|
return new ReadOnlyDictionary<string, FieldDescriptor>(dictionary);
|
|
}
|
|
|
|
// Token: 0x17000196 RID: 406
|
|
// (get) Token: 0x060005C5 RID: 1477 RVA: 0x00014740 File Offset: 0x00012940
|
|
public override string Name
|
|
{
|
|
get
|
|
{
|
|
return this.Proto.Name;
|
|
}
|
|
}
|
|
|
|
// Token: 0x17000197 RID: 407
|
|
// (get) Token: 0x060005C6 RID: 1478 RVA: 0x0001474D File Offset: 0x0001294D
|
|
internal DescriptorProto Proto { get; }
|
|
|
|
// Token: 0x17000198 RID: 408
|
|
// (get) Token: 0x060005C7 RID: 1479 RVA: 0x00014755 File Offset: 0x00012955
|
|
public Type ClrType { get; }
|
|
|
|
// Token: 0x17000199 RID: 409
|
|
// (get) Token: 0x060005C8 RID: 1480 RVA: 0x0001475D File Offset: 0x0001295D
|
|
public MessageParser Parser { get; }
|
|
|
|
// Token: 0x1700019A RID: 410
|
|
// (get) Token: 0x060005C9 RID: 1481 RVA: 0x00014765 File Offset: 0x00012965
|
|
internal bool IsWellKnownType
|
|
{
|
|
get
|
|
{
|
|
return base.File.Package == "google.protobuf" && MessageDescriptor.WellKnownTypeNames.Contains(base.File.Name);
|
|
}
|
|
}
|
|
|
|
// Token: 0x1700019B RID: 411
|
|
// (get) Token: 0x060005CA RID: 1482 RVA: 0x00014795 File Offset: 0x00012995
|
|
internal bool IsWrapperType
|
|
{
|
|
get
|
|
{
|
|
return base.File.Package == "google.protobuf" && base.File.Name == "google/protobuf/wrappers.proto";
|
|
}
|
|
}
|
|
|
|
// Token: 0x1700019C RID: 412
|
|
// (get) Token: 0x060005CB RID: 1483 RVA: 0x000147C5 File Offset: 0x000129C5
|
|
public MessageDescriptor ContainingType { get; }
|
|
|
|
// Token: 0x1700019D RID: 413
|
|
// (get) Token: 0x060005CC RID: 1484 RVA: 0x000147CD File Offset: 0x000129CD
|
|
public MessageDescriptor.FieldCollection Fields { get; }
|
|
|
|
// Token: 0x1700019E RID: 414
|
|
// (get) Token: 0x060005CD RID: 1485 RVA: 0x000147D5 File Offset: 0x000129D5
|
|
public IList<MessageDescriptor> NestedTypes { get; }
|
|
|
|
// Token: 0x1700019F RID: 415
|
|
// (get) Token: 0x060005CE RID: 1486 RVA: 0x000147DD File Offset: 0x000129DD
|
|
public IList<EnumDescriptor> EnumTypes { get; }
|
|
|
|
// Token: 0x170001A0 RID: 416
|
|
// (get) Token: 0x060005CF RID: 1487 RVA: 0x000147E5 File Offset: 0x000129E5
|
|
public IList<OneofDescriptor> Oneofs { get; }
|
|
|
|
// Token: 0x060005D0 RID: 1488 RVA: 0x000147ED File Offset: 0x000129ED
|
|
public FieldDescriptor FindFieldByName(string name)
|
|
{
|
|
return base.File.DescriptorPool.FindSymbol<FieldDescriptor>(base.FullName + "." + name);
|
|
}
|
|
|
|
// Token: 0x060005D1 RID: 1489 RVA: 0x00014810 File Offset: 0x00012A10
|
|
public FieldDescriptor FindFieldByNumber(int number)
|
|
{
|
|
return base.File.DescriptorPool.FindFieldByNumber(this, number);
|
|
}
|
|
|
|
// Token: 0x060005D2 RID: 1490 RVA: 0x00014824 File Offset: 0x00012A24
|
|
public T FindDescriptor<T>(string name) where T : class, IDescriptor
|
|
{
|
|
return base.File.DescriptorPool.FindSymbol<T>(base.FullName + "." + name);
|
|
}
|
|
|
|
// Token: 0x060005D3 RID: 1491 RVA: 0x00014848 File Offset: 0x00012A48
|
|
internal void CrossLink()
|
|
{
|
|
foreach (MessageDescriptor messageDescriptor in this.NestedTypes)
|
|
{
|
|
messageDescriptor.CrossLink();
|
|
}
|
|
foreach (FieldDescriptor fieldDescriptor in this.fieldsInDeclarationOrder)
|
|
{
|
|
fieldDescriptor.CrossLink();
|
|
}
|
|
foreach (OneofDescriptor oneofDescriptor in this.Oneofs)
|
|
{
|
|
oneofDescriptor.CrossLink();
|
|
}
|
|
}
|
|
|
|
// Token: 0x04000244 RID: 580
|
|
private static readonly HashSet<string> WellKnownTypeNames = new HashSet<string> { "google/protobuf/any.proto", "google/protobuf/api.proto", "google/protobuf/duration.proto", "google/protobuf/empty.proto", "google/protobuf/wrappers.proto", "google/protobuf/timestamp.proto", "google/protobuf/field_mask.proto", "google/protobuf/source_context.proto", "google/protobuf/struct.proto", "google/protobuf/type.proto" };
|
|
|
|
// Token: 0x04000245 RID: 581
|
|
private readonly IList<FieldDescriptor> fieldsInDeclarationOrder;
|
|
|
|
// Token: 0x04000246 RID: 582
|
|
private readonly IList<FieldDescriptor> fieldsInNumberOrder;
|
|
|
|
// Token: 0x04000247 RID: 583
|
|
private readonly IDictionary<string, FieldDescriptor> jsonFieldMap;
|
|
|
|
// Token: 0x020000C1 RID: 193
|
|
public sealed class FieldCollection
|
|
{
|
|
// Token: 0x0600076E RID: 1902 RVA: 0x000176C7 File Offset: 0x000158C7
|
|
internal FieldCollection(MessageDescriptor messageDescriptor)
|
|
{
|
|
this.messageDescriptor = messageDescriptor;
|
|
}
|
|
|
|
// Token: 0x0600076F RID: 1903 RVA: 0x000176D6 File Offset: 0x000158D6
|
|
public IList<FieldDescriptor> InDeclarationOrder()
|
|
{
|
|
return this.messageDescriptor.fieldsInDeclarationOrder;
|
|
}
|
|
|
|
// Token: 0x06000770 RID: 1904 RVA: 0x000176E3 File Offset: 0x000158E3
|
|
public IList<FieldDescriptor> InFieldNumberOrder()
|
|
{
|
|
return this.messageDescriptor.fieldsInNumberOrder;
|
|
}
|
|
|
|
// Token: 0x06000771 RID: 1905 RVA: 0x000176F0 File Offset: 0x000158F0
|
|
internal IDictionary<string, FieldDescriptor> ByJsonName()
|
|
{
|
|
return this.messageDescriptor.jsonFieldMap;
|
|
}
|
|
|
|
// Token: 0x170001D2 RID: 466
|
|
public FieldDescriptor this[int number]
|
|
{
|
|
get
|
|
{
|
|
FieldDescriptor fieldDescriptor = this.messageDescriptor.FindFieldByNumber(number);
|
|
if (fieldDescriptor == null)
|
|
{
|
|
throw new KeyNotFoundException("No such field number");
|
|
}
|
|
return fieldDescriptor;
|
|
}
|
|
}
|
|
|
|
// Token: 0x170001D3 RID: 467
|
|
public FieldDescriptor this[string name]
|
|
{
|
|
get
|
|
{
|
|
FieldDescriptor fieldDescriptor = this.messageDescriptor.FindFieldByName(name);
|
|
if (fieldDescriptor == null)
|
|
{
|
|
throw new KeyNotFoundException("No such field name");
|
|
}
|
|
return fieldDescriptor;
|
|
}
|
|
}
|
|
|
|
// Token: 0x040002F7 RID: 759
|
|
private readonly MessageDescriptor messageDescriptor;
|
|
}
|
|
}
|
|
}
|