Index: third_party/protobuf/csharp/src/Google.Protobuf/Reflection/FieldDescriptor.cs |
diff --git a/third_party/protobuf/csharp/src/Google.Protobuf/Reflection/FieldDescriptor.cs b/third_party/protobuf/csharp/src/Google.Protobuf/Reflection/FieldDescriptor.cs |
index c6caaec64dcf3a66ab45ef21334bb8a1d428a2a7..6c6f6ee05ff0b3b6d3672b16f531c26cb592d599 100644 |
--- a/third_party/protobuf/csharp/src/Google.Protobuf/Reflection/FieldDescriptor.cs |
+++ b/third_party/protobuf/csharp/src/Google.Protobuf/Reflection/FieldDescriptor.cs |
@@ -30,9 +30,8 @@ |
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
#endregion |
-using System; |
-using System.Linq; |
using Google.Protobuf.Compatibility; |
+using System; |
namespace Google.Protobuf.Reflection |
{ |
@@ -41,20 +40,35 @@ namespace Google.Protobuf.Reflection |
/// </summary> |
public sealed class FieldDescriptor : DescriptorBase, IComparable<FieldDescriptor> |
{ |
- private readonly FieldDescriptorProto proto; |
private EnumDescriptor enumType; |
private MessageDescriptor messageType; |
- private readonly MessageDescriptor containingType; |
- private readonly OneofDescriptor containingOneof; |
private FieldType fieldType; |
private readonly string propertyName; // Annoyingly, needed in Crosslink. |
private IFieldAccessor accessor; |
+ /// <summary> |
+ /// Get the field's containing message type. |
+ /// </summary> |
+ public MessageDescriptor ContainingType { get; } |
+ |
+ /// <summary> |
+ /// Returns the oneof containing this field, or <c>null</c> if it is not part of a oneof. |
+ /// </summary> |
+ public OneofDescriptor ContainingOneof { get; } |
+ |
+ /// <summary> |
+ /// The effective JSON name for this field. This is usually the lower-camel-cased form of the field name, |
+ /// but can be overridden using the <c>json_name</c> option in the .proto file. |
+ /// </summary> |
+ public string JsonName { get; } |
+ |
+ internal FieldDescriptorProto Proto { get; } |
+ |
internal FieldDescriptor(FieldDescriptorProto proto, FileDescriptor file, |
MessageDescriptor parent, int index, string propertyName) |
: base(file, file.ComputeFullName(parent, proto.Name), index) |
{ |
- this.proto = proto; |
+ Proto = proto; |
if (proto.Type != 0) |
{ |
fieldType = GetFieldTypeFromProtoType(proto.Type); |
@@ -64,7 +78,7 @@ namespace Google.Protobuf.Reflection |
{ |
throw new DescriptorValidationException(this, "Field numbers must be positive integers."); |
} |
- containingType = parent; |
+ ContainingType = parent; |
// OneofIndex "defaults" to -1 due to a hack in FieldDescriptor.OnConstruction. |
if (proto.OneofIndex != -1) |
{ |
@@ -73,7 +87,7 @@ namespace Google.Protobuf.Reflection |
throw new DescriptorValidationException(this, |
$"FieldDescriptorProto.oneof_index is out of range for type {parent.Name}"); |
} |
- containingOneof = parent.Oneofs[proto.OneofIndex]; |
+ ContainingOneof = parent.Oneofs[proto.OneofIndex]; |
} |
file.DescriptorPool.AddSymbol(this); |
@@ -83,14 +97,14 @@ namespace Google.Protobuf.Reflection |
// We could trust the generated code and check whether the type of the property is |
// a MapField, but that feels a tad nasty. |
this.propertyName = propertyName; |
+ JsonName = Proto.JsonName == "" ? JsonFormatter.ToCamelCase(Proto.Name) : Proto.JsonName; |
} |
+ |
/// <summary> |
/// The brief name of the descriptor's target. |
/// </summary> |
- public override string Name { get { return proto.Name; } } |
- |
- internal FieldDescriptorProto Proto { get { return proto; } } |
+ public override string Name => Proto.Name; |
/// <summary> |
/// Returns the accessor for this field. |
@@ -110,7 +124,7 @@ namespace Google.Protobuf.Reflection |
/// and this property will return null. |
/// </para> |
/// </remarks> |
- public IFieldAccessor Accessor { get { return accessor; } } |
+ public IFieldAccessor Accessor => accessor; |
/// <summary> |
/// Maps a field type as included in the .proto file to a FieldType. |
@@ -119,41 +133,41 @@ namespace Google.Protobuf.Reflection |
{ |
switch (type) |
{ |
- case FieldDescriptorProto.Types.Type.TYPE_DOUBLE: |
+ case FieldDescriptorProto.Types.Type.Double: |
return FieldType.Double; |
- case FieldDescriptorProto.Types.Type.TYPE_FLOAT: |
+ case FieldDescriptorProto.Types.Type.Float: |
return FieldType.Float; |
- case FieldDescriptorProto.Types.Type.TYPE_INT64: |
+ case FieldDescriptorProto.Types.Type.Int64: |
return FieldType.Int64; |
- case FieldDescriptorProto.Types.Type.TYPE_UINT64: |
+ case FieldDescriptorProto.Types.Type.Uint64: |
return FieldType.UInt64; |
- case FieldDescriptorProto.Types.Type.TYPE_INT32: |
+ case FieldDescriptorProto.Types.Type.Int32: |
return FieldType.Int32; |
- case FieldDescriptorProto.Types.Type.TYPE_FIXED64: |
+ case FieldDescriptorProto.Types.Type.Fixed64: |
return FieldType.Fixed64; |
- case FieldDescriptorProto.Types.Type.TYPE_FIXED32: |
+ case FieldDescriptorProto.Types.Type.Fixed32: |
return FieldType.Fixed32; |
- case FieldDescriptorProto.Types.Type.TYPE_BOOL: |
+ case FieldDescriptorProto.Types.Type.Bool: |
return FieldType.Bool; |
- case FieldDescriptorProto.Types.Type.TYPE_STRING: |
+ case FieldDescriptorProto.Types.Type.String: |
return FieldType.String; |
- case FieldDescriptorProto.Types.Type.TYPE_GROUP: |
+ case FieldDescriptorProto.Types.Type.Group: |
return FieldType.Group; |
- case FieldDescriptorProto.Types.Type.TYPE_MESSAGE: |
+ case FieldDescriptorProto.Types.Type.Message: |
return FieldType.Message; |
- case FieldDescriptorProto.Types.Type.TYPE_BYTES: |
+ case FieldDescriptorProto.Types.Type.Bytes: |
return FieldType.Bytes; |
- case FieldDescriptorProto.Types.Type.TYPE_UINT32: |
+ case FieldDescriptorProto.Types.Type.Uint32: |
return FieldType.UInt32; |
- case FieldDescriptorProto.Types.Type.TYPE_ENUM: |
+ case FieldDescriptorProto.Types.Type.Enum: |
return FieldType.Enum; |
- case FieldDescriptorProto.Types.Type.TYPE_SFIXED32: |
+ case FieldDescriptorProto.Types.Type.Sfixed32: |
return FieldType.SFixed32; |
- case FieldDescriptorProto.Types.Type.TYPE_SFIXED64: |
+ case FieldDescriptorProto.Types.Type.Sfixed64: |
return FieldType.SFixed64; |
- case FieldDescriptorProto.Types.Type.TYPE_SINT32: |
+ case FieldDescriptorProto.Types.Type.Sint32: |
return FieldType.SInt32; |
- case FieldDescriptorProto.Types.Type.TYPE_SINT64: |
+ case FieldDescriptorProto.Types.Type.Sint64: |
return FieldType.SInt64; |
default: |
throw new ArgumentException("Invalid type specified"); |
@@ -163,62 +177,32 @@ namespace Google.Protobuf.Reflection |
/// <summary> |
/// Returns <c>true</c> if this field is a repeated field; <c>false</c> otherwise. |
/// </summary> |
- public bool IsRepeated |
- { |
- get { return Proto.Label == FieldDescriptorProto.Types.Label.LABEL_REPEATED; } |
- } |
+ public bool IsRepeated => Proto.Label == FieldDescriptorProto.Types.Label.Repeated; |
/// <summary> |
/// Returns <c>true</c> if this field is a map field; <c>false</c> otherwise. |
/// </summary> |
- public bool IsMap |
- { |
- get { return fieldType == FieldType.Message && messageType.Proto.Options != null && messageType.Proto.Options.MapEntry; } |
- } |
+ public bool IsMap => fieldType == FieldType.Message && messageType.Proto.Options != null && messageType.Proto.Options.MapEntry; |
/// <summary> |
/// Returns <c>true</c> if this field is a packed, repeated field; <c>false</c> otherwise. |
/// </summary> |
- public bool IsPacked |
- { |
+ public bool IsPacked => |
// Note the || rather than && here - we're effectively defaulting to packed, because that *is* |
// the default in proto3, which is all we support. We may give the wrong result for the protos |
// within descriptor.proto, but that's okay, as they're never exposed and we don't use IsPacked |
// within the runtime. |
- get { return Proto.Options == null || Proto.Options.Packed; } |
- } |
- |
- /// <summary> |
- /// Get the field's containing message type. |
- /// </summary> |
- public MessageDescriptor ContainingType |
- { |
- get { return containingType; } |
- } |
- |
- /// <summary> |
- /// Returns the oneof containing this field, or <c>null</c> if it is not part of a oneof. |
- /// </summary> |
- public OneofDescriptor ContainingOneof |
- { |
- get { return containingOneof; } |
- } |
- |
+ Proto.Options == null || Proto.Options.Packed; |
+ |
/// <summary> |
/// Returns the type of the field. |
/// </summary> |
- public FieldType FieldType |
- { |
- get { return fieldType; } |
- } |
+ public FieldType FieldType => fieldType; |
/// <summary> |
/// Returns the field number declared in the proto file. |
/// </summary> |
- public int FieldNumber |
- { |
- get { return Proto.Number; } |
- } |
+ public int FieldNumber => Proto.Number; |
/// <summary> |
/// Compares this descriptor with another one, ordering in "canonical" order |
@@ -228,7 +212,7 @@ namespace Google.Protobuf.Reflection |
/// </summary> |
public int CompareTo(FieldDescriptor other) |
{ |
- if (other.containingType != containingType) |
+ if (other.ContainingType != ContainingType) |
{ |
throw new ArgumentException("FieldDescriptors can only be compared to other FieldDescriptors " + |
"for fields of the same message type."); |
@@ -331,14 +315,14 @@ namespace Google.Protobuf.Reflection |
File.DescriptorPool.AddFieldByNumber(this); |
- if (containingType != null && containingType.Proto.Options != null && containingType.Proto.Options.MessageSetWireFormat) |
+ if (ContainingType != null && ContainingType.Proto.Options != null && ContainingType.Proto.Options.MessageSetWireFormat) |
{ |
throw new DescriptorValidationException(this, "MessageSet format is not supported."); |
} |
- accessor = CreateAccessor(propertyName); |
+ accessor = CreateAccessor(); |
} |
- private IFieldAccessor CreateAccessor(string propertyName) |
+ private IFieldAccessor CreateAccessor() |
{ |
// If we're given no property name, that's because we really don't want an accessor. |
// (At the moment, that means it's a map entry message...) |
@@ -346,10 +330,10 @@ namespace Google.Protobuf.Reflection |
{ |
return null; |
} |
- var property = containingType.ClrType.GetProperty(propertyName); |
+ var property = ContainingType.ClrType.GetProperty(propertyName); |
if (property == null) |
{ |
- throw new DescriptorValidationException(this, $"Property {propertyName} not found in {containingType.ClrType}"); |
+ throw new DescriptorValidationException(this, $"Property {propertyName} not found in {ContainingType.ClrType}"); |
} |
return IsMap ? new MapFieldAccessor(property, this) |
: IsRepeated ? new RepeatedFieldAccessor(property, this) |