From 1d131c98f058dc0b5e0ebef73602e09dc88fe075 Mon Sep 17 00:00:00 2001 From: Jon Skeet Date: Thu, 13 Nov 2008 22:29:48 +0000 Subject: New options now work fine. --- .../DescriptorProtos/CSharpOptions.cs | 25 +++++++------ src/ProtocolBuffers/Descriptors/FieldDescriptor.cs | 43 ++++++++++++++++++++++ src/ProtocolBuffers/Descriptors/FileDescriptor.cs | 5 +-- 3 files changed, 59 insertions(+), 14 deletions(-) (limited to 'src/ProtocolBuffers') diff --git a/src/ProtocolBuffers/DescriptorProtos/CSharpOptions.cs b/src/ProtocolBuffers/DescriptorProtos/CSharpOptions.cs index 55a30030..743a0c36 100644 --- a/src/ProtocolBuffers/DescriptorProtos/CSharpOptions.cs +++ b/src/ProtocolBuffers/DescriptorProtos/CSharpOptions.cs @@ -16,20 +16,27 @@ namespace Google.ProtocolBuffers.DescriptorProtos { global::System.Convert.FromBase64String( "CiRnb29nbGUvcHJvdG9idWYvY3NoYXJwX29wdGlvbnMucHJvdG8SD2dvb2ds" + "ZS5wcm90b2J1ZhogZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8i" + - "4wEKEUNTaGFycEZpbGVPcHRpb25zEhEKCW5hbWVzcGFjZRgBIAEoCRIaChJ1" + + "iAEKEUNTaGFycEZpbGVPcHRpb25zEhEKCW5hbWVzcGFjZRgBIAEoCRIaChJ1" + "bWJyZWxsYV9jbGFzc25hbWUYAiABKAkSFgoOcHVibGljX2NsYXNzZXMYAyAB" + "KAgSFgoObXVsdGlwbGVfZmlsZXMYBCABKAgSFAoMbmVzdF9jbGFzc2VzGAUg" + - "ASgIMlkKDmNzaGFycF9vcHRpb25zEhwuZ29vZ2xlLnByb3RvYnVmLkZpbGVP" + - "cHRpb25zGOgHIAEoCzIiLmdvb2dsZS5wcm90b2J1Zi5DU2hhcnBGaWxlT3B0" + - "aW9ucyKIAQoSQ1NoYXJwRmllbGRPcHRpb25zEhUKDXByb3BlcnR5X25hbWUY" + - "ASABKAkyWwoOY3NoYXJwX29wdGlvbnMSHS5nb29nbGUucHJvdG9idWYuRmll" + - "bGRPcHRpb25zGOgHIAEoCzIjLmdvb2dsZS5wcm90b2J1Zi5DU2hhcnBGaWVs" + - "ZE9wdGlvbnM="), + "ASgIIisKEkNTaGFycEZpZWxkT3B0aW9ucxIVCg1wcm9wZXJ0eV9uYW1lGAEg" + + "ASgJOl4KE2NzaGFycF9maWxlX29wdGlvbnMSHC5nb29nbGUucHJvdG9idWYu" + + "RmlsZU9wdGlvbnMY6AcgASgLMiIuZ29vZ2xlLnByb3RvYnVmLkNTaGFycEZp" + + "bGVPcHRpb25zOmEKFGNzaGFycF9maWVsZF9vcHRpb25zEh0uZ29vZ2xlLnBy" + + "b3RvYnVmLkZpZWxkT3B0aW9ucxjoByABKAsyIy5nb29nbGUucHJvdG9idWYu" + + "Q1NoYXJwRmllbGRPcHRpb25z"), new pbd::FileDescriptor[] { global::Google.ProtocolBuffers.DescriptorProtos.DescriptorProtoFile.Descriptor, }); #endregion + #region Extensions + public static readonly pb::GeneratedExtensionBase CSharpFileOptions = + pb::GeneratedSingleExtension.CreateInstance(Descriptor.Extensions[0]); + public static readonly pb::GeneratedExtensionBase CSharpFieldOptions = + pb::GeneratedSingleExtension.CreateInstance(Descriptor.Extensions[1]); + #endregion + #region Static variables internal static readonly pbd::MessageDescriptor internal__static_google_protobuf_CSharpFileOptions__Descriptor = Descriptor.MessageTypes[0]; @@ -66,8 +73,6 @@ namespace Google.ProtocolBuffers.DescriptorProtos { get { return global::Google.ProtocolBuffers.DescriptorProtos.CSharpOptions.internal__static_google_protobuf_CSharpFileOptions__FieldAccessorTable; } } - public static readonly pb::GeneratedExtensionBase CSharpOptions = - pb::GeneratedSingleExtension.CreateInstance(Descriptor.Extensions[0]); private bool hasNamespace; private string namespace_ = ""; public bool HasNamespace { @@ -293,8 +298,6 @@ namespace Google.ProtocolBuffers.DescriptorProtos { get { return global::Google.ProtocolBuffers.DescriptorProtos.CSharpOptions.internal__static_google_protobuf_CSharpFieldOptions__FieldAccessorTable; } } - public static readonly pb::GeneratedExtensionBase CSharpOptions = - pb::GeneratedSingleExtension.CreateInstance(Descriptor.Extensions[0]); private bool hasPropertyName; private string propertyName_ = ""; public bool HasPropertyName { diff --git a/src/ProtocolBuffers/Descriptors/FieldDescriptor.cs b/src/ProtocolBuffers/Descriptors/FieldDescriptor.cs index 5ff55197..0d0fad76 100644 --- a/src/ProtocolBuffers/Descriptors/FieldDescriptor.cs +++ b/src/ProtocolBuffers/Descriptors/FieldDescriptor.cs @@ -50,6 +50,9 @@ namespace Google.ProtocolBuffers.Descriptors { private FieldType fieldType; private MappedType mappedType; + private CSharpFieldOptions csharpFieldOptions; + private readonly object optionsLock = new object(); + internal FieldDescriptor(FieldDescriptorProto proto, FileDescriptor file, MessageDescriptor parent, int index, bool isExtension) : base(proto, file, ComputeFullName(file, parent, proto.Name), index) { @@ -87,6 +90,31 @@ namespace Google.ProtocolBuffers.Descriptors { file.DescriptorPool.AddSymbol(this); } + private CSharpFieldOptions BuildOrFakeCSharpOptions() { + // TODO(jonskeet): Check if we could use FileDescriptorProto.Descriptor.Name - interesting bootstrap issues + if (File.Proto.Name == "google/protobuf/csharp_options.proto") { + if (Name=="csharp_field_options") { + return new CSharpFieldOptions.Builder { PropertyName = "CSharpFieldOptions" }.Build(); + } + if (Name=="csharp_file_options") { + return new CSharpFieldOptions.Builder { PropertyName = "CSharpFileOptions" }.Build(); + } + } + CSharpFieldOptions.Builder builder = CSharpFieldOptions.CreateBuilder(); + if (Proto.Options.HasExtension(DescriptorProtos.CSharpOptions.CSharpFieldOptions)) { + builder.MergeFrom(Proto.Options.GetExtension(DescriptorProtos.CSharpOptions.CSharpFieldOptions)); + } + if (!builder.HasPropertyName) { + string fieldName = FieldType == FieldType.Group ? MessageType.Name : Name; + string propertyName = NameHelpers.UnderscoresToPascalCase(fieldName); + if (propertyName == ContainingType.Name) { + propertyName += "_"; + } + builder.PropertyName = propertyName; + } + return builder.Build(); + } + /// /// Maps a field type as included in the .proto file to a FieldType. /// @@ -191,6 +219,21 @@ namespace Google.ProtocolBuffers.Descriptors { public MessageDescriptor ContainingType { get { return containingType; } } + + /// + /// Returns the C#-specific options for this file descriptor. This will always be + /// completely filled in. + /// + public CSharpFieldOptions CSharpOptions { + get { + lock (optionsLock) { + if (csharpFieldOptions == null) { + csharpFieldOptions = BuildOrFakeCSharpOptions(); + } + } + return csharpFieldOptions; + } + } /// /// For extensions defined nested within message types, gets diff --git a/src/ProtocolBuffers/Descriptors/FileDescriptor.cs b/src/ProtocolBuffers/Descriptors/FileDescriptor.cs index 79e034a1..81c4b790 100644 --- a/src/ProtocolBuffers/Descriptors/FileDescriptor.cs +++ b/src/ProtocolBuffers/Descriptors/FileDescriptor.cs @@ -88,8 +88,8 @@ namespace Google.ProtocolBuffers.Descriptors { }.Build(); } CSharpFileOptions.Builder builder = CSharpFileOptions.CreateBuilder(); - if (proto.Options.HasExtension(CSharpFileOptions.CSharpOptions)) { - builder.MergeFrom(proto.Options.GetExtension(CSharpFileOptions.CSharpOptions)); + if (proto.Options.HasExtension(DescriptorProtos.CSharpOptions.CSharpFileOptions)) { + builder.MergeFrom(proto.Options.GetExtension(DescriptorProtos.CSharpOptions.CSharpFileOptions)); } if (!builder.HasNamespace) { builder.Namespace = Package; @@ -128,7 +128,6 @@ namespace Google.ProtocolBuffers.Descriptors { /// /// Returns the C#-specific options for this file descriptor. This will always be /// completely filled in. - /// FIXME: This isn't thread-safe. Can't do it at construction time due to bootstrapping issues. /// public CSharpFileOptions CSharpOptions { get { -- cgit v1.2.3